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

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

1554185489216

把boot转移到可以下载的目录,由于adb权限问题,复制到sd卡目录下。

adb pull /sdcard/boot.img d:\a

然后下载bootimg解压boot文件:

git clone https://github.com/pbatard/bootimg-tools.git
make

1554185769689

此时已经生成二进制文件,在mkbootimg目录下,进入此目录使用unmkbootimg,提取kernel

1554185817995

提取原始zImage

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

1554185942154

修改完成后,解压缩文件,提取zImage

1554185966036

二、 提位、修改关键代码

zImage文件可以直接使用 IDA 去打开,但需要设置参数。(建议使用6.8版本,因为在索引函数时可以自动识别,而7.0则不可)

1554186082956

点击OK后,确定进入ARM,然后弹出此对话框,填入0xc0008000

1554186088780

原文要求修改函数指令来达到修改的效果,但在修改过程中发现,对不同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

1554187063821

为了避免修改出错刷入手机成砖的风险,采用了另一方式,shift+f12来打开字符串窗口,查找TracerPid,修改其后的占位符,把%d修改为0和%09(30 09)。

1554186414392

其对应的Hex窗口修改为如下所示:

1554186447080

使用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  #重启

1554186828423

调试查看

1554187063866

如想使用修改函数操作指令的方式可以参考原作者方式:

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

2、逆向修改内核,绕过TracerPID反调试





# Android逆向  

tocToc: