iOS越狱检测时如何防止调试工具绕过检测?

萌新.春红 阅读 35

最近在做App的越狱检测功能,用CSS检查字体路径的方法总是被工具绕过。比如写个字体样式:


@font-face {
  font-family: 'test';
  src: url('/var/root/fakefont.woff'); /* 越狱设备常见路径 */
}
body::before {
  content: '未越狱';
  font-family: 'test';
  speak: none;
  display: none;
}
body::before {
  content: '已越狱';
  font-family: 'test';
}

但测试时发现,用Cydia的substrate或一些调试工具直接拦截了CSS请求,导致检测结果总是显示未越狱。试过把检测逻辑改成JavaScript动态创建样式表,结果还是被Hook了…

有没有更可靠的检测方案?或者需要结合哪些系统级的特征才能有效识别?

我来解答 赞 9 收藏
二维码
手机扫码查看
2 条解答
打工人树源
这问题应该从多维度检测系统文件权限和运行时环境。可以尝试检查常用越狱工具的进程和服务是否存在,比如用sysctl检查是否被hook:

-c
#include <sys/sysctl.h>

- (BOOL)isJailbroken {
int mib[2];
mib[0] = CTL_KERN;
mib[1] = KERN_PROC;
mib[2] = KERN_PROC_ALL;
size_t bufferSize = 0;
sysctl(mib, 2, NULL, &bufferSize, NULL, 0);

struct kinfo_proc *processes = malloc(bufferSize);
sysctl(mib, 2, processes, &bufferSize, NULL, 0);

for (size_t i = 0; i < bufferSize / sizeof(struct kinfo_proc); i++) {
struct kinfo_proc process = processes[i];
if (strstr(process.kp_proc.p_comm, "substrate")) {
free(processes);
return YES;
}
}

free(processes);
return NO;
}


同时建议结合检查是否存在越狱特征文件,比如:
-c
if ([[NSFileManager defaultManager] fileExistsAtPath:@"/Applications/Cydia.app"]) {
// 越狱设备
}
点赞 3
2026-02-07 01:01
百里艺天
CSS检测确实太容易被绕过了,调试工具分分钟Hook掉。直接用系统级的特征检测更靠谱,比如检查关键路径是否存在、调用私有API看看会不会报错之类的。

这里给你一个简单的代码示例,结合文件路径和进程检测:

function isJailbroken() {
const paths = [
'/Applications/Cydia.app',
'/Library/MobileSubstrate/MobileSubstrate.dylib',
'/bin/bash',
'/usr/sbin/sshd'
];

for (let path of paths) {
try {
if (fs.existsSync(path)) {
return true;
}
} catch (e) {}
}

try {
// 尝试调用私有API
ObjC.classes.CydiaClass();
return true;
} catch (e) {}

return false;
}

if (isJailbroken()) {
console.log('已越狱');
} else {
console.log('未越狱');
}


不过也别抱太大希望,高手分分钟连这段都能Hook掉。真要防得死死的,建议服务器端配合做一些校验,光靠客户端总有漏洞可钻。搞安全这活儿,累觉不爱啊...
点赞 5
2026-01-30 20:14