逆向修改手机内核,绕过反调试

作者:lcweik 看雪学院

Android 应用反调试里最常用的一种反调试方法是查看/proc/self/status的信息,如果 TracerPid 不为 0,就判断为正在被调试。如果自己拥有内核源码,就可以自己编译生成 zImage 去替换内核就能正常运行了,但可惜的是,很多手机的内核都不开源,为此只能自己去逆向修改。

一、  提取 zImage 内核文件

在提取zImage 前,必须确保自己拥有 root 权限。

输入命令:

ls -l /dev/block/platform/msm_sdcc.1(具体设备具体定)/by-name,

找到 boot 这一项,记下路径

将boot导出为boot.img

dd if=/dev/block/mmcblk0p19 of=/data/local/boot.img

adb pull /data/local/boot.img boot.img

使用abootimg工具,该工具见附件解开boot.img

将 zImage 文件复制为文件名为 z.gz 的文件,并使用 010editor 查找十六进制1f 8b 08 00,找到后把前面的数据全删掉,使 kernel.gz 文件变成标准的 gzip 压缩文件,这样子就可以使用 gunzip 解压了。

命令:gunzip z.gz

生成文件z就是祼二进制文件zImage。

二、  提位、修改关键代码

zImage文件可以直接使用 IDA 去打开,但需要设置参数。

在上图,设置处理器类型为ARM Little-endian,点【ok】后,弹下图

在 ROM start address 和 Loading address 填0xc0008000,点【ok】,IDA显示效果如下图所示,没有函数名,不方便定位代码。

先回到root下的adb shell,输入命令:

echo 0 > /proc/sys/kernel/kptr_restrict

关闭符号屏蔽

再输入以下命令查看这两函数的地址

回到 IDA,按 g 跳转到c01b083c(__task_pid_nr_ns)地址处,在光标放在在该函数处:

然后按x,弹出引用搜索框

在搜索框里,找到sub_c02b9ff8(proc_pid_status)地址对应的函数,双击它,如果 IDA 没有分析出该函数,就进行以下操作:

按shift+f12,搜索TracerPid,找到以下项

双击它,看到

再双击【DATA XREF: sub_c02b9ff8+190】,IDA就能分析出sub_c02b9ff8函数了,然后重新搜索sub_c01b083c的引用。找到后,双击它,得以下图:

经本人分析得到的修改方法是把MOVEQ R10, R0替换为MOV R10, #0,机器码为00 A0 A0 E3,指令的文件偏移为(C02BA568-C0008000=2B2568),及把BL sub_C01B083C替换为MOV R0, #0,机器码为00 00 A0 E3,指令的文件偏移为(C01B083C-C0008000=1A883C)。

至少,内核文件修改成功。

三、  刷回手机

刷回前需要先打包 boot.img 文件

使用命令压缩成z.gz:gzip -n -f -9 z

使用010editor 将 z.gz 的二进制数据覆盖到原zImage 文件的1F 8B 08 00处的位置(新的z.gz文件必须比原 z.gz 文件小,并且回写回去时不能改变原zImage文件的大小及修改原 zImage 文件后面的内容,否则会很麻烦),这时得到了zImage文件。

执行命令abootimg --create boot.img -f bootimg.cfg -k zImage -r initrd.img得到boot.img文件。

手机重启进入刷机模式,然后,执行命令fastboot flash boot boot.img。

完成刷机后,重新开机,就大功告成了。

四、  还原砖头

刷内核,不免会有刷成砖头的情况。

使用步骤1中提取到的原版boot.img,在刷机模式下,执行 fastboot flash boot boot.img 就还原系统了。


推荐阅读更多精彩内容