一:先操作下
手机端运行 EncryptDemo.apk
开启动态调试
adb push d:\as /data/local/tmp/as
adb shell
su
chmod 777 /data/local/tmp/as
/data/local/tmp/as
//这里成功的话 cmd最后会显示 Listening on port #23946
adb forward tcp:23946 tcp:23946
//这里成功的话 cmd最后会显示 23946
再开启 IDA Debugger ->Attach->Remote ARMlINUX/Android Debugger
设置下 Port为 23946
ok
选择好目标包名的进程 ok
点击运行 这时发现 手机上的apk 退出 消失了;
正常的话 点运行是 正常运行的 这说明了 apk是有反调试的 检测了 它正在被调试
二:原理 及 apk里反调试
它是怎么检测到的呢?
Linux系统下 有种 Ptrace(痕迹)机制
痕迹机制 在每个进程里面都有 一个status(状态)文件 里面有很多内容
这个文件里面的 第6个字段 是 TracerPid(跟踪者) 可以通过这个值检测到 有没有被谁在调试
apk里通过这个原理 它可以这么实现
在它的so库里 添加个 thread_function 类似这样的函数 循环的打开status文件
通过检测 TracerPid 字段值是否 为0(为0则正常不为0则被调试 )被调试就 exit 退出软件
三:绕过反调试
通过上面的了解 我们知道apk里是 要 循环的打开status文件 最后检测到就 exit
那么我们可以 在 fopen 函数处 下断点 (因为它要打开