<安全攻防之sysctl>

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系统内核函数

  • 注入自定义静态/动态库,让破解代码在检测之前调用,从而达到破解的目的.如果防护代码是在库之前就已经完成防护功能,只能暴力破解二进制文件,从而达到破坏防护的目的.

你可能感兴趣的:(<安全攻防之sysctl>)