使用LD_PRELOAD拦截共享函数库的函数调用

Posted tyler_download

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用LD_PRELOAD拦截共享函数库的函数调用相关的知识,希望对你有一定的参考价值。

在linux系统上,程序运行时有一个特征。在程序加载前,系统会预先加载一系列库函数。如果程序运行后,它再使用动态链接库时,如果它调用链接库里面的函数名与预先加载的函数库中的某个函数名相同,那么系统会自动调用预先加载函数库中的函数。

这种机制给与我们一个劫持程序运行的入口。例如函数从某个动态加载的so链接库里调用名为function_name的函数,那么我们可以先设置一个链接库,在里面也导出一个同名函数function_name,然后使用修改系统的环境变量LD_PRELOAD,让程序在运行前先加载我们的链接库,等函数运行后它会加载相应动态链接库,并调用里面的函数function_name,结果程序执行时运行的就会变成我们自己预先设置的函数function_name,我们看一个例子:

int main(int argc, char* argv[]) {
    char* buf;
    unsigned long len;
    if (argc != 3) {
        return 1;
    }
    len = stroul(argv[1], NULL, 0);
    printf("Allocating %lu bytes\\n", len);
    buf = malloc(len)
    if (buf && len > 0) {
        memset(buf, 0, len);
        strcpy(buf, argv[2]);
        printf("%s\\n", buf);
        free(buf);
    }
 
     return 0
}

代码的逻辑很简单,程序运行时需要三个参数,第二个参数是一个数字,第三个是一个字符串。程序根据第二个参数的数字先分配一个缓冲区,然后将第三个参数对应的字符串拷贝到缓冲区里。但是代码中

以上是关于使用LD_PRELOAD拦截共享函数库的函数调用的主要内容,如果未能解决你的问题,请参考以下文章

c 和 LD_PRELOAD。 open 和 open64 调用被拦截,但不是 stat64

LD_PRELOAD加载动态库

LD_PRELOAD加载动态库

使用Linux功能是否会禁用LD_PRELOAD

加载共享库的多个副本

LD_PRELOAD - 可以拦截像 + 和 - 这样的原始运算符吗?