Android反调试方法总结
0x00 前言
前段时间想拿移动安全挑战赛的题目练练手,遇到了反调试的问题,于是顺便上网找了下资料,总结了Android反调试的一些方法。这里提到的Android应用的反调试针对的是so文件的,而非java层的反调试。反调试的一个主要特征是,当检测到应用正在被调试,那么应用就会强制退出,无法继续被调试。目前简单地反调试方法并非不可绕过,但相对而言可以增加攻击者破解应用的时间成本,主要的方法有以下几种:
0x01 Android反调试方法
1.调用ptrace(PTRACE_TRACEME,0,0,0)
这个方法的使用是因为一个原则——“一个进程只能被一个进程ptrace”。如果应用ptrace自己,那么根据该原则,android_server就无法附加调试了。
2.检测TracerPid的值
如果TracerPid的值大于0,说明应用正在被调试。通过检测这个TracerPid的值就能知道当前应用是否正在被调试。在/proc/pid/status中可以查看TracerPid的值。
3.检测代码的执行间隔时间
当应用在被调试时,代码的执行间隔时间肯定相对正常执行的要长,因此可以通过获得系统时间来进行判定。
4.检测手机的硬件信息是否在调试器中
call_system_property_get检测手机上的一些硬件信息,判断是否在调试器中。
5.检测android_server的端口号
android_server的默认端口号是23946,可以通过检测这个端口号来判断应用是否被调试。在/proc/net/tcp中可以匹配是否有”5D8A”的端口,5D8A即23946。当然,要绕过这种反调试也比较简单,在启动android_server的时候,改变其端口号。
./android_server -p23947
6.检测android_server的名字
在/proc/pid/cmdline中可以获得android_server的名字,通过检测这个关键字,可以知道应用是否正在被调试。绕过的方法可以是,在adb push的时候就修改android_server的名字。
7.检测在调试状态下的软件断点
下断点与ptrace函数有关,软件断点通过改写目标地址的头几字节为breakpoint指令。检测是否出现break point指令。
8.通过使用Inotify对文件进行监控
在动态调试的过程中,一般会查看调试进程的虚拟地址空间或是dump内存,这时会涉及文件的读写以及打开的权限,通过检测文件系统事件的变化,来判断是否进行调试。
0x02 总结
以上提到的反调试方法总的来说不会太复杂,但相对而言也算是增加了攻击者分析的时间成本。因为大多数的反调试都是检测到的话就退出应用,那么通过单步跟踪调试,应用是否在某一步中退出了调试,可以判断该位置可能存在反调试的检测,通常而言,可以将这些反调试方法nop掉(NOP对应的二进制值为00 00 A0 E1 ,当然得看实际情况进行操作)。具体的分析和源码可以参考这篇文章Android反调试方法总结以及源码实现之检测篇(一)