检测手机是否越狱

2017-11-06  本文已影响285人  mkb2

有些app喜欢检测是否手机已经越狱,然后做一些处理,那么这里收集了一些方法,看看是否是越狱的

1. 常见越狱文件

const char *examineBreak_Tool_pathes[] = {
    "/Applications/Cydia.app",
    "/Library/MobileSubstrate/MobileSubstrate.dylib",
    "/bin/bash",
    "/usr/sbin/sshd",
    "/etc/apt"
};

    // 判断是否存在越狱文件
    for (int i = 0; i < 5; i++) {
        if ([[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithUTF8String:examineBreak_Tool_pathes[i]]]){
            return YES;
        }
    }

2.如果是非越狱情况下,返回的是nil,如果是越狱了,返回了是个随机的字符串,判断length即可

char *printEnv(void){
    char *env = getenv("DYLD_INSERT_LIBRARIES");
    return env;
}

3.检测一下是否安装了cydia这个软件,亲测可用

    if ([[NSFileManager defaultManager] fileExistsAtPath:@"/User/Applications/"]){
        return YES;
    }

4.检测Mach-o文件的插入库有无MobileSubstrate.dylib这个库

遍历_dyld_get_image_name(i)获取的名称中是不是包含了Library/MobileSubstrate/MobileSubstrate.dylib

5.你可以看看stat是不是出自系统库

有没有被攻击者换掉:如果结果不是 /usr/lib/system/libsystem_kernel.dylib 的话,那就100%被攻击了。

#import <dlfcn.h>  

void checkInject(void)  
{  
    int ret ;  
    Dl_info dylib_info;  
    int (*func_stat)(const charchar *, struct stat *) = stat;  
    if ((ret = dladdr(func_stat, &dylib_info))) {  
        NSLog(@"lib :%s", dylib_info.dli_fname);  
    }  
} 

后记:这个方法已经不好使了--读取系统所有的应用名称

系统已经不然我们获取其他文件。


    // 过去好使,现在不行了.读取系统所有的应用名称
    if ([[NSFileManager defaultManager] fileExistsAtPath:@"/User/Applications/"]){
        return YES;
    }
读取系统文件已经过时了

说句题外话

如何检测这个app是不是来自于AppStore,查看有无描述文件即可

//其实只要用这个就行,如果有路径,说明就是被重新签名了
[[NSBundle mainBundle] pathForResource:@"embedded" ofType:@"mobileprovision"]
//验证一下猜测,看看是不是真的
NSFileManager *mgr = [NSFileManager defaultManager];
Bool have = [mgr fileExistsAtPath:@"/var/mobile/Containers/Bundle/Application/BECE8DA0-FA49-4BAE-9717-2ACB3FB3E4E4/Di.app/embedded.mobileprovision"];

参考文档1

上一篇 下一篇

猜你喜欢

热点阅读