在调试状态下,Linux内核会向一些文件写入进程状态信息,比如/proc/[pid]/status ,/proc/[pid]/task/[pid]/status文件的TracerPid字段写入调试器进程pid,state字段写入t(tracing stop),在动态调试时常常会遇到循环检测,手动过反调试非常费力,但是可以修改安卓内核从根源上处理这些文件,比如将/proc/[pid]/status的TracerPid字段写死为0,可以修改内核源码重新编译,也可以解包boot.img修改kernel文件。
修改boot.img绕过TracerPid检测
设备 :nexus 5
rom :rom为自己编译好的hammerhead-ktu84p,版本为Android 4.4.4_r1,也可以下载官方刷机包
解包boot.img
建议解包工具:https://github.com/xiaolu/mkbootimg_tools,
或者unpack-boot,解包后得到如下文件
修改kernel
用010editor打开kernel并搜索1f8b0800(Gzip数据以1F8B开头,可以以此来划分文件中的Gzip和非Gzip数据),删除1f8b0800之前的数据。
解压kernel_new.gz得到kernel_new文件,用IDA打开。
选择处理器类型为arm小端模式,然后设置ROM start address和Loading address 为0xc0008000,关于Linux内存地址0Xc0008000的由来,Linux内核都是加载到0xC0008000处开始运行。
IDA中搜索字符串TracerPid
交叉引用跳转到调用字符串的函数中F5查看伪代码
修改TracerPid赋值
- 修改State
off_C0B156C0处为保存State的字符数组
Patch->Apply patches to input file应用修补到文件,然后压缩为gz文件,可以使用7z压缩。010打开它替换进原kernel文件位置。