用jsp做一网站的流程,微信怎么自己创建公众号,淮北论坛官网,wordpress 表单提交文章目录 前言检测越狱文件私有目录检测检测越狱软件检测系统目录是否变为链接动态库检测环境变量检测系统调用检测指令集调用检测其他方式检测 前言
在之前的文章中#xff0c;已经带大家一起制作了一个屏蔽越狱检测的Tweak。本文就和大家一起学习整理一下iOS系统中有哪些越… 文章目录 前言检测越狱文件私有目录检测检测越狱软件检测系统目录是否变为链接动态库检测环境变量检测系统调用检测指令集调用检测其他方式检测 前言
在之前的文章中已经带大家一起制作了一个屏蔽越狱检测的Tweak。本文就和大家一起学习整理一下iOS系统中有哪些越狱检测的点一起完善我们的Tweak。
检测越狱文件
• 原理越狱后会产生额外的文件通过判断是否存在这些文件来判断是否越狱。
• 关键函数fileExistsAtPath、fopen、access等
NSString *path /Applications/Cydia.app;
NSFileManager *fileManager [NSFileManager defaultManager];
BOOL isDirectory NO;
if([fileManager fileExistsAtPath:path isDirectory:isDirectory]){return 已越狱;
}私有目录检测
• 原理越狱后权限发生变化可以获取私有目录下的文件信息、或对私有目录下的文件进行读写等操作。
• 关键函数stat、statfs、isWritableFileAtPath、isReadableFileAtPath、isExecutableFileAtPath、isDeletableFileAtPath、writeToFile、removeItemAtPath等
struct stat stat_info;
if(stat(/Application/Cydia.app, stat_info) 0) {return 已越狱;
}NSError* mrror;
NSString *test jailbreak;
NSString *path /private/................./test.txt;
if([test writeToFile:path atomically:YES encoding:NSStringEncodingConversionAllowLossy error:mrror]) {return 已越狱;
}检测越狱软件
• 原理通过URL Scheme尝试打开越狱软件能打开的话说明已越狱
• 关键函数canOpenURL
if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:cydia://package/com.example.package]])
{return 已越狱;
}检测系统目录是否变为链接
• 原理越狱后一些文件目录会迁移到其他区域但是原来的文件位置必须有效所以会创建符号链接链接到原来的路径
• 关键函数lstat
struct stat sym;
if(lstat(/bin/bash, sym) 0 || sym.st_mode S_IFLNK)
{return 已越狱;
}动态库检测
• 原理1利用_dyld_get_image_name来获取动态库遍历信息查看是否有异常动态库
• 关键函数_dyld_get_image_name
int dyld_count _dyld_image_count();
for (int i 0; i dyld_count; i) {const char * imageName _dyld_get_image_name(i);char * substr /Library/MobileSubstrate/MobileSubstrate.dylib;if(strcmp(imageName,substr) 0){return 已越狱;}
}• 原理2越狱后安装的一些插件可能会将系统的函数替换可检测一些关键函数是否出自系统的动态库
• 关键函数dladdr
int ret;
Dl_info dylib_info;
int (*func_stat)(const char *,struct stat *) stat;
if ((ret dladdr(func_stat, dylib_info))) {if (strcmp(dylib_info.dli_fname,/usr/lib/system/libsystem_kernel.dylib) ! 0) {return 已越狱;}
}• 原理3一般反越狱插件会hook_dyld_get_image_name这个方法导致匹配不到可以利用image加载时的回调来从MachO Header中检测动态库信息需要注意的是使用dladdr检测库信息的时候也可能被强制返回错误需要进一步做一下判断
• 关键函数dladdr (void)load {static dispatch_once_t onceToken;dispatch_once(onceToken, ^{_dyld_register_func_for_add_image(_check_image);});
}
static void _check_image(const struct mach_header *header, intptr_t slide) {char *path /usr/lib/substrate;Dl_info info;dladdr(header, info);if(info.dli_fname ! NULL) {if (strstr(info.dli_fname,path)) {return 已越狱;}}
}环境变量检测
• 原理注入动态库时都是通过 DYLD_INSERT_LIBRARIES 注入动态库通过检测当前程序运行的环境变量判断是否越狱
• 关键函数getenv
if(!(NULL getenv(DYLD_INSERT_LIBRARIES))) {return 已越狱;
}系统调用检测
• 原理与其他检测方式的原理相同只是调用方式不同
• 关键函数syscallSYS_syscall、SYS_access、SYS_stat、SYS_stat64、SYS_open、SYS_lstat、SYS_lstat64等
if(syscall(SYS_access, /bin/sh, F_OK) 0){return 已越狱;
}指令集调用检测
• 原理与系统调用的原理一样只不过并不使用系统已经封装好的函数syscall而是直接使用汇编执行
• 关键函数svc 0x80SYS_syscall、SYS_access、SYS_stat、SYS_stat64、SYS_open、SYS_lstat、SYS_lstat64等
MOV X0, #0
MOV W16, #1 //SYS_exit
SVC 0x80其他方式检测
• 原理1查看是否有注入异常的类
• 关键函数NSClassFromString等
• 原理2检测沙箱完整性如未越狱的设备无法fork子进程等
• 关键函数fork、posix_spawn、popen、system等
• 原理3检测能否执行ssh本地连接在绝大多数的越狱设备上一般会安装OpenSSH如果能检测到ssh连接成功则说明为越狱机