越狱检测与反调试
问题
如何检测越狱设备?有哪些反调试手段?
答案
越狱检测
class JailbreakDetector {
static var isJailbroken: Bool {
#if targetEnvironment(simulator)
return false
#else
// 1. 检查越狱特征文件
let suspiciousPaths = [
"/Applications/Cydia.app",
"/usr/sbin/sshd",
"/etc/apt",
"/private/var/lib/apt/"
]
for path in suspiciousPaths {
if FileManager.default.fileExists(atPath: path) {
return true
}
}
// 2. 检查是否能写入系统目录
let testPath = "/private/test_jailbreak"
do {
try "test".write(toFile: testPath, atomically: true, encoding: .utf8)
try FileManager.default.removeItem(atPath: testPath)
return true
} catch {
// 正常设备无法写入
}
// 3. 检查 URL Scheme
if UIApplication.shared.canOpenURL(URL(string: "cydia://")!) {
return true
}
return false
#endif
}
}
反调试
import Foundation
// ptrace 反调试(阻止 debugger attach)
func disableDebugger() {
#if !DEBUG
let PT_DENY_ATTACH: CInt = 31
typealias PtraceFunc = @convention(c) (CInt, pid_t, CInt, CInt) -> CInt
let handle = dlopen("/usr/lib/libc.dylib", RTLD_NOW)
if let sym = dlsym(handle, "ptrace") {
let ptrace = unsafeBitCast(sym, to: PtraceFunc.self)
_ = ptrace(PT_DENY_ATTACH, 0, 0, 0)
}
dlclose(handle)
#endif
}
警告
越狱检测和反调试都可以被绕过(如通过 Hook 或二进制修改)。这些是增加攻击成本的防御措施,不是绝对安全保障。
常见面试问题
Q1: 越狱检测能被绕过吗?
答案:能。越狱工具(如 Liberty Lite)可以 Hook 文件检测和 URL Scheme 检测使其返回 false。所以要多维度检测,并结合服务端验证(如 App Attest)。