本站总访问量
文章目录

扣吧力作,欢迎转载,转载请注明来自colbert337.github.io

在Linux中,进程的状态可以通过/proc/PID/status来查看,其中TracerPid字段的取值,指示了跟踪当前进程的进程ID,如果是0,表示没有跟踪。

攻击者动态调试so,需要使用gdb或者IDA的android_server(底层是trace一类的函数)来attach目标进程,此时/proc/PID/status中的TracerPid不为0。利用这个特性,我们就可以在so中预置检测TracerPid的函数,来判断当前进程有没有被跟踪调试,如何发现被调试就退出或者自毁。下面展示一个demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//anti-debug,对抗动态调试
int is_traced(){
FILE *fp = NULL;
int flag = 1;//flag=1表示被调试
char buf[100], *ptr;
int ppid;
memset(buf, 0, sizeof(buf));
sprintf(buf, "/proc/%d/status", getpid());
fp = fopen(buf, "r");
if(fp == NULL)
return flag;
while(fgets(buf, sizeof(buf)-1, fp)){
if(ptr = strstr(buf, "TracerPid:")){
sscanf(ptr + strlen("TracerPid:"), "%d", &ppid);
//sscanf() - 从一个字符串中读进与指定格式相符的数据。
if(!ppid)//若ppid为0,则表示没有被调试,flag=0
flag = 0;
break;
}
}
fclose(fp);
return flag;
}

我们在关键的函数执行前,可以进行以下判断:

1
2
//anti-debug
if(is_traced()) return;
文章目录