逆向修改手机内核,绕过反调试
Android 应用反调试里最常用的一种反调试方法是查看/proc/self/status的信息,如果 TracerPid 不为 0,就判断为正在被调试。因此修改手机的TracePid,让其值恒为零。
一、 提取 zImage 内核文件
查找boot文件位置
find / | grep boot
cd /dev/block/platform/7824900.sdhci/by-name/
将boot导出为boot.img
dd if=/dev/block/mmcblk0p22 of=/sdcard/boot.img
把boot转移到可以下载的目录,由于adb权限问题,复制到sd卡目录下。
adb pull /sdcard/boot.img d:\a
然后下载bootimg解压boot文件:
git clone https://github.com/pbatard/bootimg-tools.git
make
此时已经生成二进制文件,在mkbootimg目录下,进入此目录使用unmkbootimg,提取kernel
提取原始zImage
将kernel文件复制为文件名为zImage.gz的文件,并使用010editor查找十六进制1f 8b 08 00,找到后把前面的数据全删掉,使文件变成标准的gzip压缩文件,这样子就可以使用gunzip解压了。
修改完成后,解压缩文件,提取zImage
二、 提位、修改关键代码
zImage文件可以直接使用 IDA 去打开,但需要设置参数。(建议使用6.8版本,因为在索引函数时可以自动识别,而7.0则不可)
点击OK后,确定进入ARM,然后弹出此对话框,填入0xc0008000
原文要求修改函数指令来达到修改的效果,但在修改过程中发现,对不同kernel,最后查到的对应proc_pid_status函数操作指令不一致。
echo 0 > /proc/sys/kernel/kptr_restrict
关闭符号屏蔽
再输入以下命令查看这两函数的地址
cat /proc/kallsyms |grep proc_pid_status
cat /proc/kallsyms |grep __task_pid_nr_ns
为了避免修改出错刷入手机成砖的风险,采用了另一方式,shift+f12来打开字符串窗口,查找TracerPid,修改其后的占位符,把%d修改为0和%09(30 09)。
其对应的Hex窗口修改为如下所示:
使用gzip -n -f -9 zImage
压缩修改后的内核裸文件,压缩后会比原来的小,必须比原来的文件小才可以。得到zImage.gz,我们使用010分别打开zImage.gz和boot.img,搜索1F 8B 08 00。按下insert键,将010改为overwrite,注意这里必须是覆盖,这样就不用考虑插入后大小的问题了,把zImage.gz的内容复制到boot.img的相应位置。boot.img会有两个1F 8B 08 00,修改第一个,把其中的十六进制改为zImage.gz文件的十六进制值,在edit选项中进行覆写。
修改完成后,刷入手机,利用SDK自带的fastboot。
adb reboot bootloader # 启动fastboot模式
fastboot flash boot boot.img #刷入boot分区
fastboot reboot #重启
调试查看
如想使用修改函数操作指令的方式可以参考原作者方式: