某加固中的反调试
以某厨房为例.
反调试函数
(jiagu.so基址5287d000)
在library load/unload断下,在mmap函数尾部下断点,断下后f8执行几句,可找到libjiagu.so:528855E4 BL loc_5288308C
,进入反调试.
往下执行的关键跳转有
libjiagu.so:528830D0 BLX LR ; debug079:5287C000
debug079:5287C014 BLX LR ; loc_5288042C
debug079:5287C038 BLX LR ; loc_52880614
5287C000
是一个反调试模块的起始.
libjiagu.so:loc_5288042C
函数作用是打开status文件获得TracerPid,此函数地址不变 其中的 libjiagu.so:52880528 BL open_0 是调用open
打开/proc/self/status
的.
loc_52880614
是第二种反调试.
具体的反调试过程
解析status文件
找出 TracerPid
转换 TracerPid
比较 TracerPid
如果TracerPid
不为0,kill!
解析/proc/net/tcp文件
在比较过tracerid
后,接着又解析了tcp
文件.
调用处
打开文件
解析
逐行比较是否含有00000000:5D8A
,5d8a就是23946,android_server
监听端口即为23946,0A状态表示监听.
这里r0会被赋为1,返回调用处时进程就会被kill.
如本机tcp文件中的内容为:
|
|
绕过反调试
关键断点是:libjiagu.so:loc_5288042C
,返回之后就是cmp.
第二种反调试libjiagu.so:52880614
在cmp下面(若有).
断下之后在lr对应的地址下断点,f9,将两个反调试函数下面的比较的r0值修改就可以了.
反调试的patch
但是不止一次反调试,每次的地址也不同,而且每个采用这种加固的app都要如此,这样也太不划算了吧.既然如此,为什么不patch一下呢?
将libjiagu.so
作如下修改即可去掉反调试:(返回值r0改为0,mov r0,#0)
文件偏移35EC
处 -> 04 00 A0 E1
改为00 00 A0 E3
文件偏移3720
处 -> 01 00 A0 E3
改为00 00 A0 E3
本文小白鼠: here