5

问题描述

我需要控制 iOS 设备上的任意应用程序,我的计划是将可执行文件注入 IPA(实现远程控制逻辑的地方),然后重新打包。

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

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

 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 应用程序?
  • FairPaly 如何区分我手动生成的应用程序(使用 Xcode)和从应用商店下载的应用程序?appstore 应用程序有哪些手工制作的应用程序没有的残差?

参考

4

1 回答 1

7

AppStore 中的应用程序不仅是签名的,二进制文件也是加密的。

App Store 二进制文件由其开发人员和 Apple 共同签署。这会加密二进制文件,因此需要解密密钥才能使二进制文件可读。当 iOS 执行二进制文件时,解密密钥用于将二进制文件解密为可读状态,然后将其加载到内存中并执行。iOS 可以通过 LC_ENCRYPTION_INFO MachO 加载命令的 cryptid 结构成员来判断二进制文件的加密状态。如果 cryptid 是一个非零值,那么二进制是加密的。

于 2014-09-09T13:48:20.247 回答