root-hide 工具操作
root-hide工具,黑名单列表勾选目标Appvar目录清理有些APP还会做如下检测
攻击者可以通过hook NSFileManager的fileExistsAtPath方法来绕过检测
绕过使用
NSFileManager判断特定文件是否存在的越狱检测,此时直接返回NO势必会影响程序中对这个方法的正常使用,因此可以先打印一下path,然后判断如果path是用来判断是否越狱则返回NO,否则按照正常逻辑返回
%hook NSFileManager
- (BOOL)fileExistsAtPath:(NSString *)path{
if(TARGET_IPHONE_SIMULATOR)return NO;
for (int i = 0;i < sizeof(JailbrokenPathArr) / sizeof(char *);i++) {
NSString *jPath = [NSString stringWithUTF8String:JailbrokenPathArr[i]];
if([path isEqualToString:jPath]){
return NO;
}
}
return %orig;
}
%end
使用C语言函数stat判断文件是否存在(注:stat函数用于获取对应文件信息,返回0则为获取成功,-1为获取失败)
static int (*orig_stat)(char *c, struct stat *s);
int hook_stat(char *c, struct stat *s){
for (int i = 0;i < sizeof(JailbrokenPathArr) / sizeof(char *);i++) {
if(0 == strcmp(c, JailbrokenPathArr[i])){
return 0;
}
}
return orig_stat(c,s);
}
+(void)statHook{
struct rebinding stat_rebinding = {"stat", hook_stat, (void *)&orig_stat};
rebind_symbols((struct rebinding[1]){stat_rebinding}, 1);
}
在动态库加载的时候,调用statHook
%ctor{
[StatHook statHook];
}
// 函数执行成功返回 0,失败则返回 -1
if(0 == access(c, F_OK)) {
return YES;
}
// 函数执行成功返回 0,失败则返回 -1
if(0 == stat(c, &buf)) {
return YES;
}
// 函数执行成功返回 0,失败则返回 -1
if(0 == lstat(c, &buf)) {
return YES;
}
// 函数执行成功返回 0,失败则返回 -1
if(0 == statfs(c, &buf)) {
return YES;
}
// 函数执行成功返回打开的文件句柄,-1 打开失败
if((f = open(c, O_RDONLY)) == -1) {
return NO;
}
// 函数执行成功返回打开的文件句柄,NULL 打开失败
if((f = fopen(c, "r")) == NULL){
return NO;
}