美文网首页专业知识分享(iOS)ReverseiOS安全
iOS开发/App安全/设备是否越狱检测、ipa文件是否被篡改检

iOS开发/App安全/设备是否越狱检测、ipa文件是否被篡改检

作者: Grabin | 来源:发表于2017-12-28 17:37 被阅读1302次
    2017年最后一更... ...
    WechatIMG93.jpeg

    其实,道高一尺,魔高一丈,关于iOS App安全是个攻防不断(恶心🤢)的过程。

    一、先说判断设备是否越狱的几种情况
    A.设备越狱普遍都会有以下文件
        "/Applications/Cydia.app",
        "/Library/MobileSubstrate/MobileSubstrate.dylib",
        "/bin/bash",
        "/usr/sbin/sshd",
        "/etc/apt"
    
    B.判断是否存在cydia应用

    至于cydia应用是干什么的,这里就不做说明,可以点击去了解下。

    C.能够读取系统所有的应用名称

    非越狱手机是无法获取系统应用参数的。

    D.读取环境变量 DYLD_INSERT_LIBRARIES

    非越狱手机DYLD_INSERT_LIBRARIES获取到的环境变量为NULL。

    结合以上条件,就可以判断设备是否越狱,文章最下面会贴上github地址。
    // 常见越狱文件
    const char *Jailbreak_Tool_pathes[] = {
        "/Applications/Cydia.app",
        "/Library/MobileSubstrate/MobileSubstrate.dylib",
        "/bin/bash",
        "/usr/sbin/sshd",
        "/etc/apt"
    };
    
    char *printEnv(void){
        char *env = getenv("DYLD_INSERT_LIBRARIES");
        return env;
    }
    
    /** 当前设备是否越狱 */
    + (BOOL)isDeviceJailbreak
    {
        // 判断是否存在越狱文件
        for (int i = 0; i < 5; i++) {
            if ([[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithUTF8String:Jailbreak_Tool_pathes[i]]]) {
                NSLog(@"此设备越狱!");
                return YES;
            }
        }
        // 判断是否存在cydia应用
        if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://package/com.example.package"]]){
            NSLog(@"此设备越狱!");
            return YES;
        }
        
        // 读取系统所有的应用名称
        if ([[NSFileManager defaultManager] fileExistsAtPath:@"/User/Applications/"]){
            NSLog(@"此设备越狱!");
            return YES;
        }
        
        // 读取环境变量
        if(printEnv()){
            NSLog(@"此设备越狱!");
            return YES;
        }
        
        NSLog(@"此设备没有越狱");
        return NO;
    }
    
    二、ipa文件被篡改

    可以从反编译过来的程序安装包获取二进制文件或者图片等文件,进行修改之后替换回到安装包中。对于设备已经越狱的用户,大多数更倾向于从网上下载ipa安装包进行安装。攻击者修改文件内容并诱骗给用户安装,会造成用户敏感信息被窃取的风险。

    检测ipa文件是否被篡改可以通过以下方法:
    1. 通过对CodeResources读取资源文件原始hash,和当前hash进行对比,判断是否经过篡改,被篡改过的文件应从服务器重新请求资源文件进行替换;
    2. 可以通过检测SignerIdentity判断是Mach-O文件否被篡改;
    3. 可以通过检测cryptid的值来检测Mach-O文件是否被篡改,篡改过cryptid的值为1。
    这里主要介绍方法2.通过检测SignerIdentity判断是Mach-O文件否被篡改

    原理是:SignerIdentity的值在info.plist中是不存在的,开发者不会加上去,苹果也不会,只是当ipa包被反编译后篡改文件再次打包,需要伪造SignerIdentity。

        NSBundle *bundle = [NSBundle mainBundle];
        NSDictionary *info = [bundle infoDictionary];
        if ([info objectForKey:@"SignerIdentity"] != nil)
        {
            return YES;
        }
        return NO;
    

    如果不是很明白可以参考文章:
    iOS平台游戏安全之IPA破解原理及防御

    特殊说明:

    在防ipa篡改检测的方法上会有不足,只能判断一般的篡改手法,比较好的处理方式为判断"cryptid"的值,但我能力有限没找到代码获取该值的方式...如果看到此代码的大神,能够有更好的处理方式,麻烦告知,谢谢。

    demo地址 >>> github上的demo

    相关文章

      网友评论

      本文标题:iOS开发/App安全/设备是否越狱检测、ipa文件是否被篡改检

      本文链接:https://www.haomeiwen.com/subject/kajvgxtx.html