sysctl系统内核函数
sysctl用于系统的检测和控制,监测进程是否被附加或者调试.定义定时器,每几秒检测一下应用是否被附加.
// 定时器轮询查询应用是否被调试,每秒钟检测一次
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);
}
破解sysctl系统内核函数
- 注入自定义静态/动态库,让破解代码在检测之前调用,从而达到破解的目的.如果防护代码是在库之前就已经完成防护功能,只能暴力破解二进制文件,从而达到破坏防护的目的.