概述
多进程ptrace反调试是一种常见的反调试手段,思路为fork出子进程,在子进程中ptrace自身,使得调试器无法附加。通过修改源码来禁止指定进程fork
具体步骤
定位到源码位置
AOSP 5.1.1及6.0.1 fork函数位于:bionic/libc/bionic/fork.cpp
添加过滤函数
通过读取status文件来确定进程名,然后跟文件内容比较,相同则禁止其fork
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #include <stdio.h> #include <fcntl.h> #include <string.h>
int filter() { int fcmdline = -1; char szCmdline[64] = {0}; char szProcName[256] = {0}; char szTargetPNames[512] = {0}; int procid = getpid(); sprintf(szCmdline, "/proc/%d/cmdline", procid); fcmdline = open(szCmdline, O_RDONLY, 0644); if (fcmdline > 0) { read(fcmdline, szProcName, 256); close(fcmdline); } fcmdline = open("/data/filter", O_RDONLY); if (fcmdline > 0) { read(fcmdline, szTargetPNames, 512); close(fcmdline); } if (szProcName[0] && szTargetPNames[0] && strstr(szTargetPNames, szProcName) != NULL) { return 1; } return 0; }
|
在fork函数中调用过滤函数
fork函数开头添加:
重新编译并打包
重新编译libc和linker后,打包系统镜像并刷入
PS:也可以只替换文件,但是需要注意文件权限设置
使用
将程序包名写入/data/filter
,例如
echo "com.xhy.test" > /data/pkgname
并设置权限
参考
修改fork.c绕过多进程ptrace反调试