0%

修改安卓系统源码(fork) 绕过多进程ptrace反调试

概述

多进程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函数开头添加:

1
if(filter()) return -1;

重新编译并打包

重新编译libc和linker后,打包系统镜像并刷入
PS:也可以只替换文件,但是需要注意文件权限设置

使用

将程序包名写入/data/filter,例如
echo "com.xhy.test" > /data/pkgname
并设置权限

1
chmod 777 /data/pkgname

参考

修改fork.c绕过多进程ptrace反调试