美文网首页
iOS 签名&重签名

iOS 签名&重签名

作者: oncezou | 来源:发表于2020-02-24 14:22 被阅读0次

    前言

    前段时间因为要做防止重签名的工作,在这方面的理解出现了错误,所以现在来整理下。

    主要内容包括:

    • App签名
    • App重签名
    • 防止重签名

    签名

    bang神的这篇iOS App 签名的原理能很好的帮助我们理解签名的原理。

    这里回顾下主要的签名流程:

    App Store签名
      1. Apple官方生成一对公私钥,在 iOS 里内置一个公钥,私钥由Apple后台保存。
      1. 上传 App 至 AppStore 时,Apple后台用私钥对 App 数据进行签名。
      1. iOS 系统下载这个 App 后,用公钥验证这个签名。

    注意:AppStore 下载的安装包是没有 embedded.mobileprovision 文件

    开发环境的签名
      1. 在你的 Mac 开发机器生成一对公私钥,这里称为公钥L,私钥L。L:Local
      1. 苹果自己有固定的一对公私钥,跟上面 App Store 例子一样,私钥在苹果后台,公钥在每个 iOS 设备上。这里称为公钥A,私钥A。A:Apple
      1. 把公钥 L 传到苹果后台,用苹果后台里的私钥 A 去签名公钥 L。得到一份数据包含了公钥 L 以及其签名,把这份数据称为证书。
      1. 在苹果后台申请 AppID,配置好设备 ID 列表和 APP 可使用的权限,再加上第③步的证书,组成的数据用私钥 A 签名,把数据和签名一起组成一个 Provisioning Profile 文件,下载到本地 Mac 开发机。
      1. 在开发时,编译完一个 APP 后,用本地的私钥 L 对这个 APP 进行签名,同时把第④步得到的 Provisioning Profile 文件打包进 APP 里,文件名为 embedded.mobileprovision,把 APP 安装到手机上。
      1. 在安装时,iOS 系统取得证书,通过系统内置的公钥 A,去验证 embedded.mobileprovision 的数字签名是否正确,里面的证书签名也会再验一遍。
      1. 确保了 embedded.mobileprovision 里的数据都是苹果授权以后,就可以取出里面的数据,做各种验证,包括用公钥 L 验证APP签名,验证设备 ID 是否在 ID 列表上,AppID 是否对应得上,权限开关是否跟 APP 里的 Entitlements 对应等。

    注: 以上内容都源自于iOS App 签名的原理

    重签名

    重签名是一个逆向App的工作,可简单理解为替换App的BunldID。

    简单步骤:

      1. 获取需要重签名的App的ipa,对ipa进行脱壳操作。
      1. 准备一个embedded.mobileprovision文件,并配置好信息。
      1. 删除插件、对.framework 进行重签名、更改动态库的加载地址等。
      1. 对上面修改的安装包重签名,生成新的ipa。

    以上只是重签名的一个简单步骤说明,不做具体操作的参考。如果想实践,网上有很多的实践教程,可以去学习。

    目前我了解到的重签名主要用途:(虽然很不推荐)

      1. 应用多开。 eg: 微信多开(一个iPhone安装多个微信)
      1. 付费应用的破解。将付费应用重签名,实现免费。

    防止重签名

    签名->重签名可以知道:

      1. AppStore下载的App中是没有 embedded.mobileprovision 文件。
      1. 重签名是需要添加embedded.mobileprovision文件。

    可以得出: 重签名就是将AppStore签名方式转化为开发环境签名的形式,然后通过第三方工具安装在手机上。

    如何防止重签名:
    解决方案:验证embedded.mobileprovision中的配置信息

    // 不能单纯的判断是否存在embedded.mobileprovision,因为开发环境+Testflight是存在当前文件的。
    + (BOOL)checkResign 
    {
        NSString *mobileProvisionPath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"embedded.mobileprovision"];
        FILE *fp=fopen([mobileProvisionPath UTF8String],"r");
        char ch;
        if(fp==NULL) {
            // 1. embedded.mobileprovision文件不存在(App Store环境)
            // 2. 打开embedded.mobileprovision失败
            return NO;
        }
        NSMutableString *str = [NSMutableString string];
        while((ch=fgetc(fp))!=EOF) {
            [str appendFormat:@"%c",ch];
        }
        fclose(fp);
        
        NSString *teamIdentifier = nil;
        NSRange teamIdentifierRange = [str rangeOfString:@"<key>com.apple.developer.team-identifier</key>"];
        if (teamIdentifierRange.location != NSNotFound)
        {
            NSInteger location = teamIdentifierRange.location + teamIdentifier.length;
            NSInteger length = [str length] - location;
            if (length > 0 && location >= 0)
            {
                NSString *newStr = [str substringWithRange:NSMakeRange(location, length)];
                NSArray *val = [newStr componentsSeparatedByString:@"</string>"];
                NSString *v = [val firstObject];
                NSRange startRange = [v rangeOfString:@"<string>"];
                
                NSInteger newLocation = startRange.location + startRange.length;
                NSInteger newLength = [v length] - newLocation;
                if (newLength > 0 && location >= 0)
                {
                    teamIdentifier = [v substringWithRange:NSMakeRange(newLocation, newLength)];
                }
            }
        }
        // developer ->  Account -> Membership -> Team ID
        return ![teamIdentifier isEqualToString:@"Team ID"];
    }
    

    其他的思路: 在重签名过程中一般会注入CydiaSubstrate,可以尝试检测CydiaSubstrate来判断是否被重签名。(作者未验证)

    相关链接

    iOS App 签名的原理
    iOS APP重签名

    相关文章

      网友评论

          本文标题:iOS 签名&重签名

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