搜索
有爱,有技术,有你^_^)y
╱人◕‿‿◕人╲订下契约(注册新用户)

合作站点账号登陆

QQ登录

只需一步,快速开始

快捷导航
查看: 223|回复: 0
收起左侧

linux function hook笔记(一) - LD_PRELOAD

[复制链接]

签到天数: 1 天

连续签到: 1 天

[LV.1]初来乍到

15

主题

15

好友

3464

积分

序章

积分
3464
发表于 2016-12-21 12:18:18 | 显示全部楼层 |阅读模式

╱人◕‿‿◕人╲定下契约

您需要 登录 才可以下载或查看,没有账号?╱人◕‿‿◕人╲订下契约(注册新用户)

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

签名被小宅喵吞掉了~~~~(>_<)~~~~
回复

使用道具 举报

本版积分规则

小黑屋|手机版|技术宅(Z站|基宅) ( 粤ICP备18082987号-1 )

GMT+8, 2025-6-16 18:12 , Processed in 0.091411 second(s), 12 queries , Redis On.

Copyright © 2018 技术宅社区

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表