前面一篇文章《Android反调试手段收集》在讲常用的反调试方法中有一条是检测进程的TracerPid的值正常情况下为0,在被调试时变成父进程的pid,应对这种情况我们可以通过修改手机内核中代码,将这个pid永久性改为0。
具体方法也都是前人总结的https://bbs.pediy.com/thread-207538.htm,这里只根据自己的设备做一遍操作演示。
设备:Nexus5
系统版本:4.4.4
1,提取出boot.img文件
首先要有root权限,进入到/dev/block/platform/
文件夹下,然后这里会有一个文件夹,在不同手机中这个文件夹名字不一样,我的设备中是msm_sdcc.1
,进入后然后再进入by-name
文件夹,找一个boot
文件,如下:
记下后面的路径,然后导出boot文件:
dd if=/dev/block/mmcblk0p19 of=/data/local/boot.img
adb pull /data/local/boot.img boot.img
权限不够的话就赋下权限值。
2,用bootimg.exe工具解压boot.img文件
lcweik大神在上面文章中给出的mac下的工具abootimg
,我这里用的是windows下的bootimg.exe
,
命令是:bootimg --bootimg boot.img
boot.img不是一个完整的文件系统,它们是一种android自定义的文件格式,该格式包括了2K的文件头+用gzip压缩过的内核+一个ramdisk内存盘+第二阶段的载入器程序(可选):
解析后文件如下:
其中的kernel文件就是内核文件,ramdisk.gz文件解压后就是initrd文件夹下的内容。
3,处理内核文件
备份kernel文件,修改文件名为zImage.gz文件,用010打开文件,查找十六进制1F 8B 08 00
,这是gz文件的文件头标志,把在这之前的内容全部删掉,然后zImage.gz文件就变成标准的gzip压缩文件了,然后使用gunzip
命令或者gzip -d
命令解压缩文件,
这时获取到的zImage文件才是需要处理的文件。
用ida工具打开zImage文件,处理器类型选择ARM小端,点击ok确认,
反汇编内存配置页面将ROM和Inputfile的起始地址设置为
0xC0008000
,因为Linux启动内核的地址就是0xC0008000
。进去后Shift+F12进入字符串页面,全局搜索
TracerPid
,选中双击后得到下面地址:
0xC0D228A4
,然后减去基址0xC0008000
,得到0xD1A8A4
将文件用010打开,跳转到这个地址,在这里直接修改字符串内容,将TracerPid后面的
%d
改为0\t
或者0\n
,注意不能值改为0,要保证修改后字符串对齐。至此修改image文件完成。
4,生成修改后的boot.img文件
用gzip压缩zImage文件gzip -n -f -9
,生成zImage.gz文件,然后将生成的zImage.gz文件,覆盖到kernel文件中的对应位置,即我们删除的内容之后的位置1F8B0800,这里一定要注意仔细,不能有文件大小错误。
通过bootimg工具生成boot文件。
5,刷机
启动fastboot,运行fastboot flash boot boot-new.img刷入重启即可。
Tips:
还有一种最常见的反调方式就是在app的am文件中添加android:debuggable="false",
- 应对这种反调做的最多的就是反编译app,将属性值修改为“true”;
- 但是每次这样操作未免麻烦,有大神给出了mprop工具,只需将可执行文件复制进手机里,运行
./mprop ro.debuggable 1
即可,但是这个工具修改的是内存中的值,也就是说并不是永久的,每次重启还得再改一次; -
其实这个属性值,是在系统根目录下的default.prop文件中的,设备启动就会解析存入内存中。所以如果我们能够把这个文件中的值改成1,那么就永久有效了。在上面解包boot.img的时候,说到了有一个initrd目录,其实default.prop就是在这个目录下
这里我们直接将其改成1,因为我们现在已经进行了修改boot.img操作,那就顺便把这个功能也给改了。