点击蓝字,关注我们
新版安卓ARM64
修改TracerPid 反调试bypass
01 背景
某些壳的反调试是通过监控proc status中TracerPid字段是否非0或是否非自身互调进程的pid来判断有没有被调试。
对付这种,可以通过hook读取函数或者patch kernel代码解决。前者比较简单通用,本文主要讲后者。
当时我在网上查到都是关于armv7架构的内核的patch的介绍,其中很多地方不适用armv8的机器。
现在新机器都是arm64的,我就踩了一遍坑,写个文章分享一下。
02 确认patch方案
参考AOSP源码,
https://android.googlesource.com/a/kernel/msm/+/refs/tags/android-9.0.0_r0.114/fs/proc/array.c,197行
seq_put_decimal_ull (m, "nTracerPid:t", tpid);
很简单,将赋值改为恒定为0即可。
03 提取kernel
root后的设备,安卓9
首先定位boot.img文件位置ls -l /dev/block/by-name/
制作img
dd if=/dev/block/mmcblk0p12 of=/sdcard/dev/boot.img
将boot.img adb pull到电脑Linux进行下一步
配置boot.img解包打包环境,mkbootimg工具位于AOSP中,下面是有人拆出单独的git clone https://github.com/osm0sis/mkbootimg.git
cdmkbootimg
make./unpackbootimg -i boot.img
cp boot.img-kernel boot.img-kernel-unzip.gz
gunzip boot.img-kernel-unzip.gz
unpackbootimg时输出的参数要记录,在重打包的时候要传进去。
04 分析,patch
将解压后的boot.img-kernel-unzip和原始boot.img-kernel拖到windows进行分析。
# 禁用地址隐藏,不然显示的偏移全0x0
echo 0 >/proc/sys/kernel/kptr_restrict
head cat /proc/kallsyms
加压后的文件拿ida64打开,选择处理器 arm 小端。
紧接着出来的弹框需要修改两个值,为上面获取的Linux 内核启动的地址。
加载用64位,最开始不识别函数因为没有进行自动分析,需要在首行地址0xffffff8100e80000处按c,自动分析开始
cat/proc/kallsyms | grepproc_pid_status
用上面的命令获取到这个方法在kernel中的偏移。
按g跳转到ffffff810109b378,发现没识别函数,在这个地址直接按p创建函数,然后往下找到"nTracerPid:t"。
这就是我们要改的位置了,可以按f5看一下。
鼠标选中赋值的值,可以看到在B59C处,在汇编找到这个地址看到是MOV X2, X26。
直接keypatch改为MOV X2, #0即可。
看到对应hex是02 00 80 D2,再f5看到已经变成恒定0了。
去hex editor修改kernel文件在上面地址的hex值为我们patch后的。
05 重打包
把修改后的kernel发到linux压缩 gzip -n -f -9 boot.img-kernel-unzip
然后把压缩好的boot.img-kernel-unzip.
gz拖回Windows,用010editor打开对比新的和原始的boot.img-kernel,发现尾部缺失了一些非压缩的明文内容
这一点在gunzip的时候也可以看到有警告 gzip: boot.img-kernel-unzip.gz: decompression OK, trailing garbage ignored
直接把这些额外的内容复制,追加在新的压缩文件结尾即可。
追加好的文件复制回Linux打包,参数即为上面解包时输出的
./mkbootimg--cmdline "console=ttyMSM0,115200n8 earlycon=msm_geni_serial,0xA90000 androidboot.hardware=qcom androidboot.console=ttyMSM0 video=vfb:640x400,bpp=32
,memsize=3072000 msm_rtb.filter=0x237ehci-hcd.park=3 lpm_levels.sleep_disabled=1 service_locator.enable=1 androidboot.configfs=true androidboot.usbcontroller=a600000.
dwc3 swiotlb=1 firmware_class.path=/vendor/
firmware_mnt/image loop.max_part=7
buildvariant=user"
--base 0x00000000 --hashtype sha1--header_version 1 --
kernel_offset 0x00008000 --
os_patch_level 2019-04 --
os_version 9.0.0 --pagesize 4096 --ramdisk_offset
0x01000000 --second_offset
0x00f00000--tags_offset 0x00000100 --kernel boot.img-kernel-unzip.gz--
ramdisk boot.img-ramdisk -o boot-new.img
将生成的boot-new.img发到手机使用twrp安装或发到电脑使用fastboot安装即可。
06 常见问题
如果刷好开机直接进bootloader了,不能进系统。一般是kernel文件有问题,比如后面没有追加明文的部分。
如果刷好卡第一屏,一般是重打包的参数没写全或有误。
往期精彩合集
●【重大福利在文末↓↓↓】CVE-2022-21198 Intel SMM 漏洞分析
长
按
关
注
联想GIC全球安全实验室(中国)
原文始发于微信公众号(联想全球安全实验室):新版安卓ARM64 修改TracerPid 反调试bypass
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论