iOS 应用防护策略之反调试

402 阅读1分钟

调用 ptrace 函数禁止调试。

ptrace是一种用于控制进程行为的系统调用,可以防止其他进程附加到当前进程。通过调用ptrace,可以使调试器无法附加到你的应用上。这里使用汇编,让这段代码调用更隐蔽些。

// MARK: - c 代码
void disable_gdb(void) {
    __asm(
        "mov x0, #26\n" // ptrace syscall number
        "mov x1, #31\n" // PTRACE_DENY_ATTACH
        "mov x2, #0\n"
        "mov x3, #0\n"
        "mov x16, #0\n"
        "svc #0x80\n"
    );
}

// MARK: - Wink-Bridging-Header.h
#import "anti_debug.h"

// MARK: -  AntiDebugger.swift
// 具体调用
private static func disableGDB() {
    disable_gdb()
}

检测当前是否处于调试模式,如果处于调试,直接退出程序:


/// 是否正在调试
static var isBeingDebugged: Bool {
    var info = kinfo_proc()
    var mib = [CTL_KERN, KERN_PROC, KERN_PROC_PID]
    mib.append(getpid())

    var size = MemoryLayout<kinfo_proc>.stride
    let result = sysctl(&mib, UInt32(mib.count), &info, &size, nil, 0)
    return result == 0 && (info.kp_proc.p_flag & P_TRACED) != 0
}

/// 防止调试
private static func antiDebugging() {
    if isBeingDebugged {
        exit(1)
    }
}
  • 注意:需要在 Release 模式下测试,避免误伤正常用户。并且在日常开发调试时候,我们可以跳过反调试逻辑:IS_APP_STORE && arch(arm64)
/// 开启防调试
static func enable() {
#if IS_APP_STORE && arch(arm64)
    disableGDB()
    antiDebugging()
#endif
}