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); }
|