- 注册时间
 - 2021-4-16
 
- 最后登录
 - 2023-6-21
 
- 在线时间
 - 2 小时
 
 
 
 
 
编程入门 
  
	- 龙马币
 - 38 
 
 
 
 
 | 
 
 
模拟器修改内核绕过ptracepid检测 
 
我看了下很多检测反调试的应用都会调用这个功能个,修改个内核做个系统还是很重要的。不够我自己嫌修改真机的内核太麻烦,现在模拟器上练个手,虽然网上没有如何修改具体的教程,不过真机修改内核还是有很多。我这里自己类推下: 
 
我们先要找到内核文件的位置,如果是真机的话,需要找到boot.img。模拟器要简单很多,如上图,内核文件就是kernel-qemu文件。 
 
我们直接把kernel-qemu文件复制出来备份一下, 
之后010eidt编辑打开搜索的1F 8B 08 00处的位置,删除字符串之前的所有数据保存文kernel-new文件。 
gzip -d 文件一下( gunzip.exe z.gz ) 
 
接下来我们就可以用ida打开了。 
 
IDA静态分析 
处理器类型为ARM Little-endian, 
ROM start address和Loading address填0xc0008000 
其实这里我一之怀疑为什么要填0xc0008000 
我还自己把内核符号导出来观察了一下,想把开始的函数和这个地址对应一下 
但改了几次发现,解析的函数怪怪的。感觉有点不对。 
 
我在网上看了一下网上真机的地址都是填0xc0008000 
按shift+f12,搜索TracerPid,找到以下项 
搜索引用还是有的,说明应该就是这个文件。 
先不管了 
adb shell 
echo 0 > /proc/sys/kernel/kptr_restrict 
关闭符号屏蔽 
再输入以下命令查看这两函数的地址 
cat /proc/kallsyms | grep prco_pid_status 
cat /proc/kallsyms | grep __task_pid_nr_ns 
找下这两个函数地址。 
在ida对应的地址里面找下。 
修改方法是把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)。 
之后把数据还原成原来的样子,还有些没分析完,之后在弄。 
 
备注 
使用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 
 
adb shell 
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 
如果设备和系统的和给出符话直接 使用源码的boot.img更好 
 
Bootimg 和boot.img文件放到同一目录 
 
执行bootimg –unpack-bootimg 该命令会解包出内核:kernel和ramdisk.gz. 
kernel就是内核文件 和zImage相同 
 
将kernel文件复制为文件名为z.gz的文件,并使用010editor查找十六进制1f 8b 08 00,找到后把前面的数据全删掉,使z.gz文件变成标准的gzip压缩文件,这样子就可以使用gunzip解压了。 
命令:gunzip.exe z.gz 
 
生成文件z就是祼二进制文件zImage。 
 
 |   
 
 
 
 |