首页 未命名正文

如何对iOS应用进行修改并重新签名

访客 未命名 2022-04-10 544 3 iOS签名代码

前言

在某些情况下,你可能需要没有越狱iOS对设备进行操作和修改iOS应用程序,特别是当手已经越狱时iPhone突然变砖,只能被迫升级到非越狱版iOS这种需求在系统中更为迫切。另一个例子是,您需要使用该技术来动态分析和测试应用程序,或者您可能需要使用它GPS绕过欺骗手段Pokemon锁区限制在非洲捕捉宠物精灵,不想承担越狱带来的安全风险。无论如何,您都可以使用本文介绍的 *** 重新签名修改后的应用程序,并在自己的设备上成功运行。需要注意的是,该技术仅在应用程序中没有通过FairPlay加密(即从应用商店下载)才能正常工作。

由于Apple在iOS在系统上重新签名程序要困难得多。只有使用正确的配置文件和完全正确的代码签名头,iOS该系统允许应用程序正常运行。这使得您需要熟悉许多概念,如不同类型的证书BundleID、应用ID、团队ID,以及如何使用Apple编译工具将这些东西结合在一起。简而言之,如果没有默认的 *** (即XCode编译生成的程序在环境中iOS正确操作将是一个困难的过程。

本文使用的工具集包括optool、Apple以及一些编译环境shell命令。我们使用的 *** 灵感来自Vincent Tan的Swizzler项目。NCC工作组也用其他工具集完成了同样的工作。

复制下面列出的步骤,请从OWASP Mobile Testing Guide下载软件仓库UnCrackable Ios App Level 1示例应用,我们的目标是修改UnCrackable该应用程序在启动时加载FridaGadget.dylib,以便后续使用Frida加载该应用程序进行测试。

获取开发者配置文件(Provisioning Profile)及证书

由开发人员配置文件Apple签名的一个plist该文件将开发者的代码签名证书列入一个或多个设备的白名单。换句话说,Apple通过这种方式显式允许开发者的应用程序在某些设备的上下文环境中运行(如对特定设备进行调试)。配置文件还列出了应用程序所能获得的权限信息。代码签名证书包含了开发者在对应用进行签名时所用到的私钥。

1)使用iOS开发人员账号时

假如你以前用过Xcode开发部署iOS应用程序,您已获得代码签名证书。您可以使用它security列出您现有的签名身份码:

  • $securityfind-identity-pcodesigning-v
  • 1)61FA3547E0AF42A11E233F6A2B255E6B6AF262CE"iPhoneDistribution:VantagePointSecurityPte.Ltd."
  • 2)8004380F331DCA22CC1B47FB1A805890AE41C938"iPhoneDeveloper:BernhardMüller(RV852WND79)"
  • 已注册的开发者可以从Apple在开发者门户上获取配置文件。首先,你需要创建一个新的App ID,然后发起配置文件请求,以便应用App ID它可以在你的设备上运行。如果你只是想重新包装应用程序,选择哪个?App ID这并不重要。你甚至可以重复使用以前使用过的东西App ID。关键是您需要正确匹配的配置文件,因为您需要将调试器附加到应用程序中。请确保您创建了一个开发配置文件(development provisioning profile)而非分发配置文件(distribution profile)。

    在下文的shell在命令中,我使用了我的签名身份,这与我公司的开发团队有关。我创建了一个名字“sg.vp.repackaged”的app-id,还有一个名字“AwesomeRepackaging”生成了一个名称的配置文件“AwesomeRepackaging.mobileprovision”请在实际操作中用自己的文件名替换这些字段。

    2)使用普通iTunes账号时

    幸运的是,即使你不是付费开发者,Apple还将向您发送免费的开发配置文件。您可以使用自己的文件Apple账户,通过Xcode环境获得该配置文件——只需要创造一个空的iOS从应用容器中提取工程embedded.mobileprovision即可。NCC博客详细描述了整个过程。

    您可以在获得配置文件后使用它security工具检查其内容。除了证书和设备信息外,您还可以从配置文件中找到应用程序赋予的操作权限。这些信息需要在后续的代码签名工作中使用,因此您需要单独提取它们plist如下所示。

  • $securitycms-D-iAwesomeRepackaging.mobileprovision>profile.plist
  • $/usr/libexec/PlistBuddy-x-c'Print:Entitlements'profile.plist>entitlements.plist
  • $catentitlements.plist
  • <?xmlversion="1.0"encoding="UTF-8"?>
  • <!DOCTYPEplistPUBLIC"-//Apple//DTDPLIST1.0//EN""http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  • <plistversion="1.0">
  • <dict>
  • <key>application-identifier</key>
  • <string>LRUD9L355Y.sg.vantagepoint.repackage</string>
  • <key>com.apple.developer.team-identifier</key>
  • <string>LRUD9L355Y</string>
  • <key>get-task-allow</key>
  • <true/>
  • <key>keychain-access-groups</key>
  • <array>
  • <string>LRUD9L355Y.*</string>
  • </array>
  • </dict>
  • </plist>
  • 你还需要检查生成的。plist查看文件内容是否正确生成。

    其中,应用标识(App ID)是由Team ID(LRUD9L355Y)以及Bundle ID(sg.vantagepoint.repackage)这个配置文件只适用于使用App ID的应用有效。“get-task-allow” 键值也很重要,当键值设置为“true”允许在应用程序中附加其他过程(如调试服务器)。因此,在分配文件中,需要将键设置为“false”。

    其它准备措施

    为了让我们的应用程序在启动时加载一个额外的库,我们使用一些 *** 将额外的加载命令插入主执行文件Mach-O头中。我们用optool完成此步骤的自动化:

  • $gitclonehttps://github.com/alexzielenski/optool.git
  • $cdoptool/
  • $gitsubmoduleupdate--init--recursive
  • 不使用Xcode我们可以使用它ios-deploy完成应用程序的部署和调试。

  • gitclonehttps://github.com/phonegap/ios-deploy.git
  • cdios-deploy/
  • gitsubmoduleupdate--init--recursive
  • 你需要FridaGadget.dylib完成本文示例。

  • $curl-Ohttps://build.frida.re/frida/ios/lib/FridaGadget.dylib
  • 除上述工具外,我们还将使用它们OS X及XCode请确保已安装在您的环境中Xcode命令开发人员工具。

    修改、重新包装和重新签名应用程序

    IPA其实文件是ZIP因此,我们可以解压文件ipa包,将FridaGadget.dylib拷贝至app使用后使用目录optool将load命令添加到“UnCrackable Level 1”在这个应用中。

  • $unzipUnCrackable_Level1.ipa
  • $cpFridaGadget.dylibPayload/UnCrackable\Level\1.app/
  • $optoolinstall-cload-p"@executable_path/FridaGadget.dylib"-tPayload/UnCrackable\Level\1.app/UnCrackable\Level\1
  • FoundFATHeader
  • Foundthinheader...
  • Foundthinheader...
  • InsertingaLC_LOAD_DYLIBcommandforarchitecture:arm
  • SuccessfullyinsertedaLC_LOAD_DYLIBcommandforarm
  • InsertingaLC_LOAD_DYLIBcommandforarchitecture:arm64
  • SuccessfullyinsertedaLC_LOAD_DYLIBcommandforarm64
  • WritingexecutabletoPayload/UnCrackableLevel1.app/UnCrackableLevel1...
  • 上述操作肯定会使主执行文件的代码签名无效,因此应用程序不能在非越狱设备上运行。您需要更换配置文件,并使用配置文件中列出的证书FridaGadget.dylib进行签名。

    首先,我们将自己的配置文件添加到包中:

  • $cpAwesomeRepackaging.mobileprovisionPayload/UnCrackable\Level\1.app/embedded.mobileprovision\
  • 接下来,我们要保证Info.plist中的BundleID在配置文件中BundleID一致。Codesign在签名过程中Info.plist中读取BundleID如果两者不一致,应用签名将无效。

  • $/usr/libexec/PlistBuddy-c"Set:CFBundleIdentifiersg.vantagepoint.repackage"Payload/UnCrackable\Level\1.app/Info.plist
  • ***,我们使用codesign重新签名修改后的应用程序/

  • $rm-rfPayload/F/_CodeSignature
  • $/usr/bin/codesign--force--sign8004380F331DCA22CC1B47FB1A805890AE41C938Payload/UnCrackable\Level\1.app/FridaGadget.dylib
  • Payload/UnCrackableLevel1.app/FridaGadget.dylib:replacingexistingsignature
  • $/usr/bin/codesign--force--sign8004380F331DCA22CC1B47FB1A805890AE41C938--entitlementsentitlements.plistPayload/UnCrackable\Level\1.app/UnCrackable\Level\1
  • Payload/UnCrackableLevel1.app/UnCrackableLevel1:replacingexistingsignature
  • 安装运行修改后的应用

    一切准备就绪,您可以使用以下命令在设备上部署和运行修改后的应用程序。

  • $ios-deploy--debug--bundlePayload/UnCrackable\Level\1.app/
  • 如果一切顺利,应用程序应该可以添加IIdb在设备上启动调试模式。Frida也可以正确加载到应用程序中,您可以使用它frida-ps命令验证这一点:

  • $frida-ps-U
  • PIDName
  • ---------
  • 499Gadget
  • 现在可以用了Frida正常测试应用程序。

    故障排除

    如果您在上述操作中出现错误,您可以检查配置文件和代码签名头是否正确匹配。通常的错误是由两者之间的不匹配引起的。在这种情况下,您可以参考Apple官方文件,了解整个系统的工作原理。Apple故障排除页面也是不错的参考资料。

       
    版权声明

    本文仅代表作者观点,不代表本站立场。
    本文系作者授权发表,未经许可,不得转载。