Closed KuNgia09 closed 6 years ago
你是怎么判断new_mmap和new_munmap没有被执行到的? 因为hook是在so库被加载到内存之后才进行的,是否有可能在你的测试中libart.so后续没有再调用mmap了?
我试了另外一个plt hook https://github.com/MelonWXD/ELFHooker,这个可以执行到新的mmap函数
ELFHooker的例子
//got hook
ElfReader elfReader(LIB_ART_PATH, art_base);
if (0 != elfReader.parse()) {
LOGE("failed to parse %s in %d maps at %p", LIB_ART_PATH, getpid(), art_base);
return;
}
elfReader.hook("open", (void *)new_open, (void **)&old_open);
elfReader.hook("read", (void *)new_read, (void **)&old_read);
elfReader.hook("mmap", (void *)new_mmap, (void **)&old_mmap);
elfReader.hook("munmap", (void *)new_munmap, (void **)&old_munmap);
elfReader.hook("__read_chk", (void *)new_read_chk, (void **)&old_read_chk);
elfReader.hook("fstat", (void *)new_fstat, (void **)&old_fstat);
elfReader.hook("fork", (void *)new_fork, (void **)&old_fork);
用ELFHooker可以执行到新的fake函数
用xhook只执行了new_open函数,后面几个函数都没跳过去
@woxihuannisja
Hi,
我看了下https://github.com/MelonWXD/ELFHooker 中ELFHooker部分的代码,PLT/GOT定位的核心逻辑和xhook是一样的。而且你说open是hook成功的,对于 PLT/GOT hook来说,具体hook哪个函数不应该存在差异。
我这里目前没找到可用的Nexus5,找了一台Mi3(也是arm 32bit)试了下,是可以hook到libart.so的mmap的。
怀疑的点有两个,不知道你是否有时间,能否帮忙验证一下:
1。是否触发了 xhook 自身的段错误保护(SFP),这个可以升级到最新版本的xhook,然后在refresh之前调用一次xhook_enable_sigsegv_protection(0)来关闭SFP,再执行refresh,如果APP崩溃了,说明遇到了问题。
2。xhook 和 ELFHooker 的指令缓存刷新操作不同。xhook使用的是builtin_clear_cache,这个是兼容 32-bit和64-bit arch的调用。ELFHooker使用的是syscall(0xf0002, start, end),这个只能适用于 32-bit arch。能够帮忙试一下,在xh_util.c的xh_util_flush_instruction_cache函数中,将:
```builtin_clear_cache((void )PAGE_START(addr), (void )PAGE_END(addr)); 修改为:
syscall(0xf0002, (void )PAGE_START(addr), (void )PAGE_END(addr));```
十分感谢!!
@caikelun 我试了xhook_enable_sigsegv_protection(0)和syscall 还是没有效果 我是想在加载dex之前 hook函数 正常来说加载dex的操作 libart会调用open mmap 函数
使用xhook之后, 我用ida调试 在plt的mmap,open过渡函数下了断点,然后执行加载dex操作,也只有plt中的open函数断下来了
我在nexus5 红米note4x上测试都不行 感觉不是段错误问题,程序执行起来了,只是新的mmap和原mmap都不能执行
@woxihuannisja 比较诡异。。而且根据你最初的描述,你用ida动态调试能看到got里mmap的函数地址其实是替换成功了?
如果只对libart.so hook mmap这一个函数,能被hook到正常跑吗?
@caikelun hook之后 libart.so里面的got表已经替换为new_mmap函数了 hook之后,执行加载dex的操作,libart.so也没有执行原始的mmap函数了,我在libc的mmap函数也下了断点
xhook只是改了got表吗?
如果没有hook成功我的程序是跑不起来的
@woxihuannisja “libart.so也没有执行原始的mmap函数了”?有点糊涂了 @_@
@woxihuannisja 方便的话能weixin或者qq吗?能把联系方式发我邮箱(caikelun@gmail.com)吗?我加你~
qq:1483943306
目前的情况是hook是成功的,但是hook后app逻辑中有一个native崩溃,导致程序逻辑还没有走到hook的新函数中就崩溃退出了。app逻辑有点复杂,目前没有时间配合调试了。。暂时先关闭这个issue了。
环境测试: Nexus5 CM12
测试代码如下
Log如下:
hook open函数 可以跳转到new_open函数,但是mmap和munmap函数不能跳转到新的函数
我看了下hook之后libart.so的got表 open mmap都被替换为了新的函数地址