sysctl系統(tǒng)內(nèi)核函數(shù)
sysctl用于系統(tǒng)的檢測(cè)和控制,監(jiān)測(cè)進(jìn)程是否被附加或者調(diào)試.定義定時(shí)器,每幾秒檢測(cè)一下應(yīng)用是否被附加.
// 定時(shí)器輪詢查詢應(yīng)用是否被調(diào)試,每秒鐘檢測(cè)一次
static dispatch_source_t timer;
BOOL isDebugger() {
int name[4];
name[0] = CTL_KERN; // 內(nèi)核
name[1] = KERN_PROC; // 查詢進(jìn)程
name[2] = KERN_PROC_PID; // 通過(guò)進(jìn)程ID查詢
name[3] = getpid(); // 獲取進(jìn)程ID
struct kinfo_proc info; // 進(jìn)程查詢結(jié)果的結(jié)構(gòu)體
size_t info_size = sizeof(info); // 結(jié)構(gòu)體大小
int error = sysctl(name, sizeof(name)/sizeof(*name), &info, &info_size, 0, 0);
assert(error == 0); // 0就是沒(méi)有錯(cuò)誤,其他就是錯(cuò)誤碼
// (info.kp_proc.p_flag & P_TRACED) != 0; // 0沒(méi)有調(diào)試 !=0有調(diào)試
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);
}
破解sysctl系統(tǒng)內(nèi)核函數(shù)
- 注入自定義靜態(tài)/動(dòng)態(tài)庫(kù),讓破解代碼在檢測(cè)之前調(diào)用,從而達(dá)到破解的目的.如果防護(hù)代碼是在庫(kù)之前就已經(jīng)完成防護(hù)功能,只能暴力破解二進(jìn)制文件,從而達(dá)到破壞防護(hù)的目的.