1. 调试检测
在调试加壳软件的时候,总是会突然出现调试中断,或者是程序的异常退出,但是一旦不处于调试的时候又能够正常启动,这些都是因为调试被 app 检测到的原因。
2. 基本的调试监控
常用的监控手段:
1) 检测用户组 cmdline 中是否存在调试进程(gdb、gdbserver、android_server、xposed 等)修改调试器的名称
2) 检测线程状态,查看是否存在被调试的线程修改读取文件中特征值
3) 检测进程状态,查看是否存在调试的进程修改读取文件中特征值
4) 检测传输端口,如 23946(ida 调试的默认端口)等端口是否被调试进程启用了
可以通过修改调试端口绕过
3. Demo 演示
使用 jeb 打开目标 apk 文件,找到该 app 中进行调试监控的函数
因为 findTrace()函数是 native 层函数,所以需要分析它的 so 文件,使用 ida 打开该 so 文件,没有搜索到 findTrace()函数,证明它为动态加载的。
在 jni native 结构体中找到 findTrace()函数的地址和名称描述
找到 findTrace()函数的地址,跳转过去之后找到 findTrace()函数
然后使用 ida 进行动态挂接
开始动态调试,程序在 findTrace()处断下
调试器已经被检测到
调试器判断的代码数 (函数 1 )
根据代码可以得出绕过的方法:改 修改 android_server
此外,调试检测还会检测 stat 文件中的内容数 (函数 2 )
调试(t)与非调试(s)状态下 stat 文件内容的变化
绕过方法:
调试判断还会读取 status 文件内容检测其中的 TracePid 的值(函数 3
绕过方法:将 将 TracePid 的值改为 0
直接读取 status 文件中 TracePid 的值(函数 4
绕过方法:改 修改 fget 中获取数据的地方将 TracePid 数值改为 0