ios判断程序是否处于调试状态

5,951 views

当一个应用被调试的时候,会给进程设置一个标识(P_TRACED),我们可以通过检测该进程是否有设置这个标识来检测进程是否正在被调试以保护好我们的应用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <sys/types.h>
#include <sys/sysctl.h>
 
static int check_debugger( ) __attribute__((always_inline));
 
static int check_debugger( )
{
    size_t size = sizeof(struct kinfo_proc);
    struct kinfo_proc info;
    int ret,name[4];
 
    memset(&info, 0, sizeof(struct kinfo_proc));
 
    name[0] = CTL_KERN;
    name[1] = KERN_PROC;
    name[2] = KERN_PROC_PID;
    name[3] = getpid();
 
    if((ret = (sysctl(name, 4, &info, &size, NULL, 0)))){
        return ret;  //sysctl() failed for some reason
    }
 
    return (info.kp_proc.p_flag & P_TRACED) ? 1 : 0;
}

如果你不确信产生的目标代码以inline的方式编译该函数,你也可以将其转化成宏的方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#define DEBUGGER_CHECK {                                \
    size_t size = sizeof(struct kinfo_proc);            \
    struct kinfo_proc info;                             \
    int ret,name[4];                                    \
                                                        \
    memset(&info, 0, sizeof(struct kinfo_proc));        \
                                                        \
    name[0] = CTL_KERN;                                 \
    name[1] = KERN_PROC;                                \
    name[2] = KERN_PROC_PID;                            \
    name[3] = getpid();                                 \
                                                        \
    if(ret = (sysctl(name, 4, &info, &size, NULL, 0))){ \
        return (EXIT_FAILURE);                          \
    }                                                   \
                                                        \
    if(info.kp_proc.p_flag & P_TRACED){                 \
        /* Code to react to debugging goes here */      \
    }                                                   \
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注