root-hide 工具操作

  1. 打开root-hide工具,黑名单列表勾选目标App
  2. var目录清理

有些APP还会做如下检测

屏蔽文件完整性检测

通用脚本方案

1.NSFileManager检测

攻击者可以通过hook NSFileManagerfileExistsAtPath方法来绕过检测

绕过使用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

2.stat等C语言函数

使用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];
}

3.其他C函数

// 函数执行成功返回 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;
    }