logo头像

星星給予仰望者光芒

sysctl 系統內核函數

本文于 471 天之前發表,文章内容可能已經過時。

  sysctl 系統內核函數

sysctl 系統內核函數

sysctl 用於系統的檢測和控制,監控進程是否被附加或者調試(debug)。

定義定時器,每幾秒檢測一下app是否被附加(注入)。

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
31
32
// 定時器輪詢查詢app是否被調試,每秒鐘檢查一次
static dispatch_source_t timer;

BOOL isDebugger() {
int name[4];
name[0] = CTL_KERN; // 內核
name[1] = KERN_PROC; // 查詢進程
name[2] = KERN_PROC_PID; // 通過進程ID查詢
name[3] = getpid(); // 獲取進程ID

struct kinfo_proc info; // 進程查詢結果的結構體
size_t info_size = sizeof(info); // 結構體大小

int error = sysctl(name, sizeof(name)/sizeof(*name), &info, &info_size, 0, 0);

assert(error == 0); // 0就是沒有錯誤,其他就是錯誤碼

// (info.kp_proc.p_flag & P_TRACED) != 0; // 0沒有調試 !=0有調試

return ((info.kp_proc.p_flag & P_TRACED) != 0);
}

+ (void)load {
timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0));
dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
dispatch_source_set_event_handler(timer, ^{
if (isDebugger()) {
exit(0);
}
});
dispatch_resume(timer);
}