测试步骤参看
知识点儿
- 工具ID7.0+Jeb+ApkTool
- 根据程序功能逻辑分析其可能存在反调试代码位置。
- 拿到APK先在Jeb等反编译工具中分析程序函数,是个好习惯。
- IDA使用技巧
- Ctrl+s打开segment表
- 右键Data转化成数据、P键转换成函数、F5转化为C伪代码、点住函数按x键可以知道被哪里调用。
(点进dword_1140发现这部分代码IDA没有解析好 这里需要手动解析一下 点住dword_1140右键Data转化成数据 然后鼠标放在__unwind按住P键就转换成函数了 这个函数就是checkport对应的函数)
- .data.rel.ro.local 这个段里面放的是动态注册的函数 ,点进去后可以找到动态注册的函数
- ADB命令
- ps 查看包名对应的PID
- CAT PROC/PID值/status 查看当前程序状态信息(其中Tracerpid为0,说明没有被调试)
- 修改IDA调试端口:/data/local/tmp/and7.0 -p 23947
adb forward tcp:23947 tcp:23947
- 可以是程序运行完,反调试程序(线程)循环运行,导致主线程堵塞。
- 可以在init_array和JNI_OnLoad两个函数中开启线程进行反调试,因为init_array和JNI)Onload会在so加载的时候就开始执行。
- init_array段是在so加载的时候执行的 执行顺序要优先于 JNI_OnLoad 所以这里是最早被执行的函数 把反调试和so的解密放到这里是比较好的选择。
-检测反调试的技巧:
a. 进程名中包含android_server,gdbserver,gdb等名称 则认为程序当前被动态调试 退出程序。
b. 读取/proc/pid/status文件下的TracePid的值 如果大于0说明程序正在被调试 退出程序。
c. 读取/proc/net/tcp,查找23946端口 如果找到则认为程序当前被动态调试 退出程序。
2.对于thread_create函数我们可以刷机改内核让TracePid的值永远为0
参考文章《逆向修改内核,绕过TracerPID反调试 》
3.对抗SearchObjProcess函数可以将android_server改成其他名字然后运行 比如zs ls ww(张三,李四,王5)
参考文章《教我兄弟学Android逆向番外03 Android逆向必会命令》