math1as
贫民
贫民
  • UID637346
  • 粉丝0
  • 关注0
  • 发帖数0
阅读:0回复:0

在广义的

楼主#
更多 发布于:2016-12-21 12:18
在广义的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

[img=725,137]https://miao.su/images/2016/12/21/2304b1.png[/img]

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

[img=323,114]https://miao.su/images/2016/12/21/3bb8fa.png[/img]

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

游客

返回顶部