math1as
在广义的

在广义的linux环境下(这里也部分指android),要怎样进行函数的hook呢?

首先介绍一个叫做ld_preload的环境变量,使用它可以加载一个外部共享库

比如 export ld_preload=/home/xxx.so

这样当前目录下的程序就会自动加载这个共享库。

并且如果有同名函数被调用,在搜寻符号表时,优先调用的是共享库里的函数。

这样就实现了函数的hook,以下列程序为例

我们要hook strcmp函数

[mw_shl_code=c,true] #include<stdio.h>

#include<string.h>

int test(void)

{

char str1[20];

char str2[20];

sprintf(str1,"test");

sprintf(str2,"test");

if(strcmp(str1,str2)==0)

{

printf("equal!");

}

else

{

printf("hacked!");

}

return 0;

}

int main(void)

{

test();

return 0;

}[/mw_shl_code]

在我们的共享库中写如下代码

[mw_shl_code=c,true]

int strcmp(char * str1,char * str2)

{

return 1;

}

[/mw_shl_code]

用来覆盖strcmp函数,令其为1

在没有加载共享库的情况下,返回0

接下来加载LD_PRELOAD

使用export LD_PRELOAD="./test.so"

并进行编译

gcc -shared -o test.so test.c

再次执行target,发现函数已经被我们hook

但是需要注意的是,这里hook的是其调用的库函数,自身的函数并没有办法通过这种办法进行hook.