修改系统内核 绕过反调试 TracerPid为0

本文详细介绍了如何在Nexus 5设备上提取并修改Android 4.4系统的内核文件zImage,包括获取root权限、提取boot.img、解包与重建内核文件等步骤。

原文 http://bbs.pediy.com/showthread.php?t=207538

感谢作者整理,亲测可用 坐着用的mac 现在改成windows下操作

设备nexus5 系统android 4.4

如果 设备与上不符 按照以下方法获取boot.img

一、  提取ker内核文件
在提取zImage前,必须确保自己拥有root权限。adb root 获取root权限
输入命令:

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.exe工具,解开boot.img

 

Bootimg boot.img文件放到同一目录


执行bootimg --unpack-bootimg  该命令会解包出内核:kernelramdisk.gz.

kernel就是内合文件 和zImage相同

 

kernel文件复制为文件名为z.gz的文件,并使用010editor查找十六进制1f 8b 08 00,找到后把前面的数据全删掉,使z.gz文件变成标准的gzip压缩文件,这样子就可以使用gunzip解压了。
命令:gunzip.exe 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 01 替换为 00 A0 A0 E3  

指令的文件偏移为(C02BA568-C0008000=2B2568) (使用010editor修改)

及把BL sub_C01B083C替换为MOV R0, #0,机器码 AF DB FB EB 为00 00 A0 E3,

指令的文件偏移为(C02BA578-C0008000=2B2578)|(原文中错误的地方)

三、  刷回手机
刷回前需要先打包boot.img文件
使用命令压缩成z.gz:gzip -n -f -9 z

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

注:这个地方可以新建一个用010editor 新建hex文件  把 原kernel文件1F 8B 08 00处一起的数据复制到 新文件里 然后把 z.gz的数据添加复制到 新文件里 ,这时候 比对 原kernel和新文件

把原kernel文件中 多的数据 一个字节不少的赋值到新的文件中,这样就组成新的 kernel 文件 新文件和原kernel一样大。把原kernel文件删除 把新文件重命名为kernel

执行命令bootimg --repack-bootimg base cmdline page_size padding_size

其中上述命令中的黑体部分为包命令的输出值。得到boot.img文件。
手机重启进入刷机模式,然后,执行命令fastboot flash boot boot.img。
完成刷机后,重新开机,就大功告成了。


四、  还原砖头
刷内核,不免会有刷成砖头的情况。
使用步骤1中提取到的原版boot.img,解包后会被命名为 bootold.img 在刷机模式下,执行fastboot flash boot bootold.img就还原系统了。


所以工具下载地址 http://pan.baidu.com/s/1bo8RUmN


<think>好的,用户想绕过libexec.so的反调试机制。首先,我需要回想一下之前提到的反调试方法。根据引用[1],libexec.so可能使用fopen和fgets读取/proc/self/status文件来检测调试状态,比如检查TracerPid字段。所以绕过的话,可能需要拦截这些函数调用。 接下来,用户可能已经知道常规的反调试手段,比如检测调试器,所以需要更深入的方法。常见的绕过技术包括hook系统函数,比如使用LD_PRELOAD或者Frida来替换fopen、fgets,让它们返回修改后的内容,避免检测到调试器。比如,当程序尝试读取TracerPid时,hook后的函数可以返回0,表示没有调试器附加。 另外,还可以考虑修改/proc/self/status的内存映射,使用内存断点或者修改文件路径,让程序读取伪造的status文件。不过这可能涉及到更底层的操作,需要root权限或者内核模块的支持。 还有,用户可能需要了解如何动态调试,比如使用ptrace附加进程,但反调试可能检测ptrace的使用。这时候可以使用多进程注入,或者利用ptrace的竞争条件,比如fork一个子进程来执行调试,而父进程继续运行,避免被检测到。 还要注意,libexec.so可能还有其他反调试措施,比如检查进程名、端口或者时间差。这时候需要综合多种方法,比如重命名调试器进程,隐藏端口,或者调整时间检测的阈值。 最后,建议用户使用工具如Frida进行动态分析,编写脚本自动拦截和修改关键函数,或者使用Xposed模块在Android环境中进行hook。同时,参考现有的开源项目或社区资源,寻找针对libexec.so的具体绕过方法。</think>### 绕过 libexec.so 反调试机制的方法 #### 1. **函数 Hook 技术** - **原理**: 通过拦截系统调用或库函数(如`fopen`、`fgets`),修改其返回值或行为,使反调试检测失效[^1]。 - **实现方法**: - 使用 `LD_PRELOAD` 注入自定义动态库,重写目标函数: ```c FILE *fopen(const char *path, const char *mode) { if (strstr(path, "/status")) return NULL; // 阻止读取关键文件 return orig_fopen(path, mode); } ``` - 使用 Frida 动态 Hook 函数: ```javascript Interceptor.replace(Module.findExportByName("libc.so", "fopen"), new NativeCallback(function (path, mode) { if (path.readCString().includes("status")) return NULL; return orig_fopen(path, mode); }, "pointer", ["pointer", "pointer"])); ``` #### 2. **内存映射篡改** - **原理**: 修改 `/proc/self/status` 的内存映射,使其指向伪造文件。 - **步骤**: 1. 创建虚假的 `/fake_status` 文件,设置 `TracerPid: 0`。 2. 使用 `mount --bind` 将虚假文件绑定到 `/proc/self/status`(需 root 权限): ```bash mount --bind /fake_status /proc/self/status ``` #### 3. **调试器隐藏技术** - **Ptrace 竞争绕过**: 通过多进程分叉(`fork()`)让子进程调试父进程,利用时序差异避免检测。 - **信号干扰**: 捕获反调试的信号(如 `SIGTRAP`),阻止其触发检测逻辑。 #### 4. **二进制修补** - **原理**: 直接修改 `libexec.so` 的二进制代码,移除反调试逻辑。 - **工具**: 使用 Ghidra/IDA 定位反调试代码(如 `fopen` 调用),用 NOP 指令覆盖相关跳转。 #### 5. **环境隔离** - **容器化运行**: 在独立命名空间或容器(如 Docker)中运行程序,隔离 `/proc` 文件系统访问。 - **Seccomp 过滤**: 限制进程的系统调用权限,阻止 `open`/`read` 等关键操作。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值