调用 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
}