0x00
为了避免我们的so文件被动态分析,我们通常在so中加入一些反调试代码,常见的Android native反调试方法有以下几种。
1、直接调用ptrace(PTRACE_TRACEME, 0, 0, 0),参考Android Native反调试。
2、根据上面说的/proc/$pid/status中TracerPid行显示调试程序的pid的原理, 可以写一个方法检查下这个值, 如果!=0就退出程序。参考Android Native反调试,用JNI实现APK的反调试。
3、检查代码执行的间隔时间,参考Android应用方法隐藏及反调试技术浅析的0×03反调试初探。
4、检测手机上的一些硬件信息,判断是否在调试器中,参考Android应用方法隐藏及反调试技术浅析的0×03反调试初探。
0x01
那么我们如何过掉这些反调试呢?
我们讲解两种方式:
1、Ida Patch so
2、Ida动态修改内存数据和寄存器数值
我们首先讲解Ida Patch so,有几处都可以patch。我们从易到难依次讲解。
第一处:
我们在JNI_ONLOAD下断点,如下图:
依次单步执行到BLX R7
我们发现当执行完这步后,我们的ida就退出了,说明反调试代码是从这个入口进入执行的。那么我们只要把这个入口给NOP掉,就可以绕过反调试了。
Patch so就是修改so中的二进制代码,然后再重新签名生成新的apk。Patch so,需要修改的本地so中的代码,而不是内存中的,所以我们需要通过上图内存中指令地址减去so在内存中的基地址来获取这条指令在本地so文件中的偏移。那么so在内存中的基地址怎么获取呢?按Crtl+s。
我们看到libcrackme.so的基地址是AB732000,用BLX R7的地址AB733C58减去AB732000,等于1C58。