码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Linux下的动态库注入


    第一章 用户态程序动态库注入


    Linux程序调试

    • 第一章 用户态程序动态库注入
    • 前言
    • 一、重启程序动态库注入
      • 1.测试代码
      • 2.代码测试
      • 3.总结


    前言

    用户态程序在运行过程中可能会出现异常的工作状态,此时通过特定的方式可以定位程序出错的原因,分析到原因后可能需要进行验证从而判断原因分析是否解决问题,这时候就可以使用程序动态注入进行验证。


    一、重启程序动态库注入

    linux下有一个环境变量叫LD_PRELOAD,该变量指向具体的动态库地址,动态链接器在载入一个程序所需的所有动态库之前,会先载入LD_PRELOAD环境变量所指定的动态库。运用这个机制,我们可以替换已有动态库中的方法,加入我们自己的逻辑,从而改变程序的执行行为。不过该方法只对动态链接的程序有效,对静态链接的程序无效。因为该方法需要重新载入动态库,所以需要重启程序才能生效。

    1.测试代码

    执行代码(main.c):

    #include <stdio.h>
    #include "test.h"
    
    int main(int argc, char *argv[])
    {
            printf("1 + 1 = %d\n", add(1, 1));
    
            return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    头文件代码(test.h):

    #ifndef __TEST_H__
    #define __TEST_H__
    
    int add(int a, int b);
    
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    原始库代码(test.c):

    #include "test.h"
    
    int add(int a, int b)
    {
            return a + b;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    注入库代码(fake.c):

    #include "test.h"
    
    int add(int a, int b)
    {
            return a + b + 100;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    生成执行文件和相应的库文件:

    gcc test.c -o libtest.so -fPIC -shared
    gcc fake.c -o libfake.so -fPIC -shared
    gcc main.c -o main -L./ -ltest
    
    • 1
    • 2
    • 3

    2.代码测试

    1. 查看二进制文件main所依赖的库
    export LD_LIBRARY_PATH=./;ldd main
    
    • 1

    在这里插入图片描述

    从此处可以看到main文件依赖于libtest.so库

    1. 执行main文件,查看执行效果
    export LD_LIBRARY_PATH=./;./main
    
    • 1

    在这里插入图片描述

    可以看到当前是libtest.so中add的执行结果

    1. 加入fake库,查看二进制文件main所依赖的库
    export LD_LIBRARY_PATH=./; export LD_PRELOAD=./libfake.so;ldd main
    
    • 1

    在这里插入图片描述

    此时在依赖libtest.so之前添加了依赖库lbfake.so

    1. 执行main文件,查看执行效果
    export LD_LIBRARY_PATH=./; export LD_PRELOAD=./libfake.so;./main
    
    • 1

    在这里插入图片描述

    此时执行了fake库中的add函数,修改掉了test库中的函数

    1. 查看test库和fake库的符号表
    readelf --dyn-syms libfake.so 
    
    • 1

    在这里插入图片描述

    readelf --dyn-syms libtest.so 
    
    • 1

    在这里插入图片描述

    3.总结

    由于动态链接器是按照库的载入顺序进行符号解析的,当libfake.so首先载入之后,动态链接器已经找到了add函数,所以会忽略libtest.so库中的add函数实现。


  • 相关阅读:
    基于Echarts实现可视化数据大屏产业大数据指挥舱系统
    prerender-spa-plugin报错处理,prerender-spa-plugin-next长江后浪
    Vue--》详解Vue组件生命周期的三个阶段
    bean的生命周期
    什么是 java 序列化?什么情况下需要序列化?
    GPT-3后的下一步:大型语言模型的未来方向
    日期函数DATEDIFF() 计算日期之差
    (原创)【B4A】一步一步入门09:xCustomListView,加强版列表、双行带图片、复选框按钮等自定义列表项(控件篇05)
    Node.js+vue校内二手物品交易系统tdv06-vscode前后端分离
    SpringBoot中如何集成Servlet呢?
  • 原文地址:https://blog.csdn.net/guofengdidai/article/details/125562436
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号