专业知识分享(iOS)ReverseiOS安全

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

2017-12-28  本文已影响1302人  Grabin
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

上一篇下一篇

猜你喜欢

热点阅读