首页
社区
课程
招聘
[求助]iOS下面注入的dylib怎么获取目标程序的符号地址
2013-3-25 23:05 7514

[求助]iOS下面注入的dylib怎么获取目标程序的符号地址

2013-3-25 23:05
7514
在做一个dylib注射,如果我想获得printf之类的函数地址只需要:
    h = dlopen(null, RTLD_NOW);
    funcAddr = dlsym(h, "printf");
因为printf是动态加载的函数,所以用dlsym可以直接获取到地址,但是现在我希望获取的符号是原本程序的内部符号,也就是可执行文件本身的函数和静态库,似乎用dlsym是不能加载的。

其实内部符号的可以直接用nm或者otool工具导出,用gdb调试程序的时候也可以用info functions来看到内部符号的地址。直接利用这些工具找出函数地址,再嵌入到我的dylib里面倒也不是不行,但是毕竟这么做的话,目标程序一旦发布新版本,我也要重新修改一次地址,比较麻烦。

我认为,既然gdb和nm、otool都可以做到,我应该也可以在运行时解析出内部符号的地址。有没有人有这方面的经验呢?我现在的思路是能否能直接从mach-o里读取出来符号表,然后获取到函数地址。

已经解决:

找到了原因,其实用上面的方法,dlsym是完全可以访问内部符号表的,当然前提是符号可以用nm、otool或者gdb查到。

昨天在这里提问是因为手滑把参数写错了。代码里面有多处调用dlsym,最后对这些调用返回的结果进行判断,只要有一个调用失败就会报错。刚才我把每一次调用的返回值输出来看,发现只有一处调用失败,而且是因为我传进去的参数有拼写问题。

最后谢谢大家的关心,希望能有更多人关注iOS安全这个领域。

阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

收藏
点赞0
打赏
分享
最新回复 (2)
雪    币: 1098
活跃值: (193)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
zhuliang 5 2013-3-26 09:02
2
0
你的需求可以参考这个例子:https://github.com/comex/inject_and_interpose,用它能很方便地实现。
雪    币: 226
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hfourx 2013-3-26 16:57
3
0
正在研究,似乎需要调用dyld来访问内存里的符号表?
不过今天我在osx下面做了实验,直接使用dlsym是可以从主模块里获取到静态库的符号位置的,我的做法是这样:

    void test_function()
    {
        printf("test\n");
    }
    int main()
    {
        void* h = dlopen(NULL, RTLD_NOW);
   
        unsigned int addr = (unsigned int) dlsym(h, "test_function");
        printf("address of the function:%x\n", addr);
   
        addr = (unsigned int) &test_function;
        printf("address of the function:%x\n", addr);
        return 0;
    }

结果是两次显示的地址是相同的,说明dlsym工作正常。我会测试一下是不是因为dlopen的第一个参数传递了NULL,所以没法获取静态符号,稍后有结果了再来更新。
游客
登录 | 注册 方可回帖
返回