在广义的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.