iOS12 非官方重签名工具研究遇到问题,想请教一下同道中人

目的:实现非官方codesign工具,能在 linux环境 下正常签名app,并且在 非越狱的设备 上安装运行。

ios12之前的工具有: ldidisignjtool 、以及本人用C++参考前面的工具实现了一个集成重签名和注入的工具

但是,现在以上的工具以及我能找到的所有第三方工具中没有一个可以通过ios12的签名校验。在这里我将自己研究的内容简单分享一下:

  1. codesign签名段数据简介
    简单来说就是由一个“索引块”和多个“功能块”组成,每个“功能块”表示某一种用途。
    –SuperBlob(索引)
    –CodeDirectory(程序的bundle id,各个数字签名)
    –Requirements(这里应该就是苹果文档里对应的internal requirements,各个requirement使用codesign requirement language表示,最终内容是text->binary的形式,即compiled后的内容)
    –Entitlements(这里就是entitlement文件了)
    Certificates (将CodeDirectory的数据作为数据源进行非对称加密后的密文)

  2. 官方文档收集
    CodeSigningGuide
    codesign官方源码

  3. 第三方文档参考
    在iOS12中,内核增加了CMS(Cryptographic Message Syntax)校验,而业界常用的自签名工具ldid以及jtool中CMS都是为空的,导致上述解决方案失效。同时内核增加了CoreTrust模块用于对抗hardcoded证书,因此要伪造签名并通过苹果校验的难度大大提高。

  4. 我的问题
    (1) CMS是如何在codesign的过程中添加的?添加的什么信息?与mobileprovision是否有关系?
    (2) 苹果的openssl采用的是自己开发的LibreSSL,和标准的openssl有差异,这种差异会不会导致触发ios12的检测机制从而判断为非官方codesign?
    (3) 能否实现非官方的能在linux环境下运行的兼容ios12的codesign?

  5. 我目前的研究进展

  • 从二进制mach-o文件的格式来讲,已经完全实现除了Certificates段以外的与官方codesign所有信息的匹配;
  • 而老版本的官方codesign签出来的app是可以通过ios12校验的;
  • 剩下唯一需要研究的就是苹果官方的LibreSSL是如何将CMS信息添加入Certificates段。
3 个赞

消除0回复!

该问题我从ios12刚发布beta版就基本上研究到上面所述的地步,然后将近1年的时间也毫无进展,我也时刻在关注逆向圈里这方面的动态,感觉做这方面的研究太少?或者说没啥价值?

貌似还有一个工具签名ipa的,叫做Cydia Impactor,没用过,只知道他在爱思助手给用户重签名Chimera iOS12的 越狱工具

感谢提醒,我去研究研究

一年。。。。:rofl:

我的意思是暂停了将近1年没有去管这事,最近才重新重视这个项目,现在我就是想看看有没有跟我一样在研究这块的人,学习下别人的思路:grinning:

非常感谢!非常感谢!非常感谢!

大概看了一下

  1. reprovision只支持支持32位和64位 iOS 9~11.4 b3 的【越狱】设备。pass
  2. DerekSelander 的 dsresign 是调用mac环境下的标准codesign。pass
  3. inside-code-signing 这篇文章是详细介绍codesign内部原理,这些资料在我去年写重签名工具时早就翻烂了。
  4. 目前来看cydia impactor 好像可以参考一下。

非常感谢 @pengkeming@9BD83913 提供的信息!

大神有没有可以联系方式可否交流下

苹果的openssl采用的是自己开发的LibreSSL,和标准的openssl有差异,这种差异会不会导致触发ios12的检测机制从而判断为非官方codesign?

  1. 解答你这个疑问,其实是没差别的,就是openssl在生成CMS段的时候对于插入数据的方式很生硬
  2. Cydia Impactor 使用的也是 ldid 的源码,不过版本预估比你能下到的还超前

感谢 @Young 的回复!

这是ldid中采用openssl签名的代码片段:

    std::vector<const char *> args;
    args.push_back(_openssl_path.c_str());
    args.push_back("cms");
    args.push_back("-sign");
    args.push_back("-binary");
    args.push_back("-outform");
    args.push_back("DER");
    args.push_back("-md");
    args.push_back("SHA1");
    args.push_back("-signer");
    args.push_back(_cert_path.c_str());
    args.push_back("-inkey");
    args.push_back(_key_path.c_str());
    args.push_back("-in");
    args.push_back(in_file_path.c_str());
    args.push_back("-out");
    args.push_back(out_file_path.c_str());

    // Worldwide Developer Relations certificates.
    args.push_back("-certfile");
    args.push_back(_applecerts_path.c_str());
    args.push_back(NULL);
    execvp(_openssl_path.c_str(), (char **) &args[0]);

我也保留了原样不变,看命令行参数里是有CMS的,但不知道为啥这样签出来的包iOS12就是不认呢?

我也试过Impactor,发现的确是可以在iOS12中安装的,但需要登录自己的appleId并且还要输入专用密码。我的理解是这样操作是利用了苹果支持临时开发证书的特性所以才能安装,如果用正规的开发者证书是否就可以正常签名安装呢? (关于Impactor的源码网上没有找到,最近正在逆向看里面的逻辑,希望能找到点线索)

既然Impactor也是ldid的源码,如果有更新的版本但没有放出来而已,说明已经搞定了ios12的签名机制,感觉还是有机会的 O(∩_∩)O~

全都一样,没区别

再次感谢你的回复!不过我对回复的理解有两种情况:

一是目前ldid最多只能达到 在ios12中安装重签名的APP需要登录自己的appleId并且还要输入专用密码 的程度?而不像官方codesign一样签完后直接安装运行的效果?

二是impactor实际上已经完全解决ios12重签名问题,但需要使用者自己提供签名证书,登录自己的appleId并且再输入专用密码 仅仅只是生成重签名证书而已,其它操作完全一样。

不知道你想表达的是哪种情况呢?如果是第二种的话,这就更加坚定我对impactor研究的决心。

免费个签,收费个签,企业签名,都是一样的签名方式,双重验证到一站式自动签名打包 ,客官了解一下

刚想到前段时间苹果强制双重验证耶,一站式应该不行吧

可以的,用impactor亲测,但要单独生成一个app安装密码就可以了

CMS的内容,你把它从二进制文件中截取出来,作为一个单独的文件,然后放到linux里,用openssl就能分析它的格式了。
mac也有Openssl,但是没有CMS的功能,所以要用linux上的

1 个赞

你重写的工具是开源的吗?:thinking:

厉害了,在看看…

也可以接入验证码,只是可能不那么稳定,验证码服务器经常嗝屁,倒是可以在一台绑定的机器上生成验证码