iOS应用商店应用的IPA重新打包/重新签名

5

问题描述

我需要控制iOS设备上的任何应用程序,我的计划是将一个可执行文件注入到IPA中(其中包含远程控制逻辑),然后重新打包。

由于应用程序应在受控环境(特定设备)中运行,因此我计划使用我的开发证书和配置文件进行重新打包/签名。

首先,我正在尝试重新打包第三方应用程序,而不注入任何代码,这是通过以下方式完成的:

 1. Unzip the existing IPA
 2. Copy the provisioning profile to %APP_NAME%.app/embedded.mobileprovisioning
 3. export CODESIGN_ALLOCATE="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/codesign_allocate"
 4. signcode --force --deep -s "%Dev Cert Name%" "%Path/To/APP_NAME%.app"
 5. zip the re-signed code back together

上述方法对我手动使用Xcode构建的应用程序非常有效,但是当使用从AppStore下载的IPA文件时,无法解决以下设备日志错误:

<Debug>: AppleFairplayTextCrypterSession::fairplayOpen() failed, error -42112

检查应用程序的“Mach-O”可执行文件后,我已经验证了相关架构的“代码签名”部分已被完全更改(使用“signcode”工具)。

问题

  • 为什么我无法重新打包从AppStore下载的应用程序,而我手动使用Xcode创建的应用程序可以成功重新打包/签名?
  • 如何使用我的开发证书和配置文件重新打包/签名AppStore应用程序?
  • FairPlay如何区分我手动制作的应用程序(使用Xcode)和从应用商店下载的应用程序?应用商店应用程序有哪些残留物,手动制作的应用程序没有?

参考资料

1个回答

7

AppStore中的应用不仅被签名,二进制文件也被加密

App Store的二进制文件由开发者和苹果公司共同签名。这样可以加密二进制文件,使得需要解密密钥才能读取二进制文件。当iOS执行二进制文件时,解密密钥被用来将二进制文件解密为可读状态,然后加载到内存并执行。iOS可以通过LC_ENCRYPTION_INFO MachO加载命令的cryptid结构成员来判断二进制文件的加密状态。如果cryptid是非零值,则该二进制文件已经加密。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接