项目代码

目标

模拟LV4方法的执行。

IDA分析

搜索一下方法,发现没有lv4:
notion image
那就是动态注册了。
去看JNI_OnLoad方法:
看off_1D550:
确认sign_lv4是动态注册的。

资料

上一篇使用了无名侠修改过的项目,这里补下其他资料,作者也是摸着石头过河,来一起讨论啊:

模拟

我们先按照上一篇的逻辑,直接调用一下lv4方法:
输出日志如下:
提示找不到Java_com_sec_udemo_MainActivity_sign_1lv4这个符号,这是因为sign_lv4是动态注册的。
所以,我们需要先创建一个MainActivity对象,然后调用JNI_OnLoad方法,再调用MainActivity上的sign_lv4方法。
将调用代码改一下:
执行,输出日志:
添加指令hook:
这里我减去了 so 的 base address,就可以比较清楚的看出哪里出了问题,因为 libnative-lib 加载的基地址高,所以跳转到 libc 会变成负数:
去 0x92f0 位置:
按X搜索一下,只有一处,点过去看看:
看这个方法的名字有点像检测逻辑,按X搜索一下:
发现是在JNI_OnLoad里面有个检测逻辑。
由于它是一个单独的检测逻辑,所以我们可以跳过这个函数。
一种方法就是 hook 掉它,一种方法就是 patch 掉。

Hook 检测函数

我们先看CheckPort23946ByTcp这个方法,它不是导出函数,android native emu 的 hook 是类似于 got hook,所以hook这个方法行不通。
我们戳到这个方法里面去,发现它调用了另一个方法:
_Z19CheckPort23946ByTcpv这个方法是导出函数:
那么,我们hook这个方法试一下:
再次运行项目:
看日志,是 sprintf 报错了,这是因为我们在之前将 sprintf 写死了,只兼容了两个参数的格式。
去看看是哪里调用了这个方法:
而这个函数也是在JNI_OnLoad里面调用的,看方法逻辑,也是做了一些检测,我们也将它hook掉。
再次运行:
提示,我们 MainActivity 上没有 sign_lv4 方法,我们补一个:
再次运行,终于得到了结果:

Patch 检测函数

有一个简单的方法绕过检测函数,就是将调用检测函数的指令改成nop。
用ida nop 之后:
我们将这4个字节,写入一下:
运行项目,一样可以得到结果:
 
Loading...
二手的程序员
二手的程序员
路漫漫其修远兮
公告
 
可以占个坑,虽然现在没人说话。
QQ群:
notion image
Telegram群:
notion image
 
我的公众号:
notion image
我的微信:
notion image