当前位置: 首页 > 科技观察

如何修改和重签iOS应用

时间:2023-03-15 18:42:59 科技观察

前言在某些场景下,您可能需要在未越狱的iOS设备上运行修改后的iOS应用,尤其是当您手中的越狱iPhone突然变砖时。当你可以被迫升级到非越狱版本的iOS系统时,这种需求就更加迫切了。再比如,你需要使用这个技术动态分析和测试应用,或者你可能需要使用GPS欺骗来绕过口袋妖怪的区域锁定限制,捕捉非洲区域的口袋妖怪,但是你又不想承担它带来的安全性越狱风险。在任何一种情况下,您都可以使用本文中描述的方法对修改后的应用程序重新签名并在您的设备上成功运行它。需要注意的是,只有应用程序未经过FairPlay加密(即从应用程序商店下载),此技术才能正常工作。由于Apple更为复杂的配置和代码签名系统,在iOS系统上重新签名程序会比想象的困难得多。如果使用正确的配置文件并且代码签名标头完全正确,iOS系统将只允许应用程序正常运行。这使得你需要熟悉很多概念:比如不同类型的证书、BundleID、应用程序ID、团队ID,以及如何使用Apple的编译工具将这些东西绑在一起。总之,要让没有默认方法(即XCode环境)编译生成的程序在iOS上正确运行,将是一个艰难的过程。我们在本文中使用的工具集包括optool、Apple的构建环境和一些shell命令。我们使用的方法受到VincentTan的Swizzler项目的启发。此外,NCC工作组已经使用其他工具集完成了相同的工作。要重现下面列出的步骤,请从OWASP移动测试指南存储库下载UnCrackableIosAppLevel1示例应用程序。我们的目标是修改UnCrackable应用程序,使其在启动时加载FridaGadget.dylib,以便它可以使用Frida加载应用程序进行测试。获取供应配置文件和证书供应配置文件是一个由Apple签名的plist文件,它将一个或多个设备的开发人员的代码签名证书列入白名单。也就是说,通过这种方式,Apple明确允许开发者的应用程序在某些设备的上下文中运行(例如调试特定设备)。配置文件还列出了应用程序可以获得的权限信息。代码签名证书包含开发人员用来签署应用程序的私钥。1)使用iOS开发者账号时,如果你之前使用过Xcode开发部署过iOS应用,那么你已经获得了代码签名证书。你可以使用security工具列表出你现在拥有的签名身份代码:$securityfind-identity-pcodesigning-v1)61FA3547E0AF42A11E233F6A2B255E6B6AF262CE"iPhoneDistribution:VantagePointSecurityPte.Ltd."2)8004380F331DCA22CC1B47FB1A805890AE41C938"iPhoneDeveloper:BernhardMüller(RV852WND79)"已经注册的开发者可以GettheprovisioningprofilefromtheAppleDeveloperPortal.首先您需要创建一个新的AppID,然后发起一个配置请求,以便AppID可以在您的设备上运行。如果你只是想重新打包应用,选择哪个AppID都无所谓,你甚至可以重复使用之前使用过的AppID。关键是您需要一个正确匹配的配置文件,因为调试器需要附加到应用程序才能工作,请确保您创建的是开发配置文件而不是分发配置文件。在下面的shell命令中,我使用了我的签名身份,它与我公司的开发团队相关联。我创建了一个名为“sg.vp.repackaged”的app-id,和一个名为“AwesomeRepackaging”的配置文件,并生成了一个名为“AwesomeRepackaging.mobileprovision”的文件,实际操作中请将这些字段替换成你自己的文件名。2)幸运的是,当你使用普通的iTunes帐户时,即使你不是付费开发者,Apple也会发给你一个免费的开发配置文件。您可以使用自己的Apple帐户通过Xcode环境获取此配置文件-只需创建一个空的iOS项目并从应用程序容器中提取embedded.mobileprovision。NCC博客上详细描述了整个过程。获取配置文件后,您可以使用安全工具检查其内容。除了证书和设备信息,您还可以从配置文件中找到运行应用程序的权限。这些信息会在后续的代码签名工作中用到,所以需要将它们提取到单独的plist文件中,如下图。$securitycms-D-iAwesomeRepackaging.mobileprovision>profile.plist$/usr/libexec/PlistBuddy-x-c'打印:Entitlements'profile.plist>entitlements.plist$catentitlements.plist应用程序标识符LRUD9L355Y.sg.vantagepoint.repackagecom.apple.developer.team-identifierLRUD9L355Yget-task-allow钥匙串访问组LRUD9L355Y.*/plist>还需要检查生成的plist文件,看文件内容是否生成正确。其中,应用标识(AppID)由TeamID(LRUD9L355Y)和BundleID(sg.vantagepoint.repackage)组成。此配置文件仅对使用该应用程序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.gitcdios-deploy/gitsubmoduleupdate--init--recursive你需要FridaGadget.dylib来完成本文的例子。$curl-Ohttps://build.frida.re/frida/ios/lib/FridaGadget.dylib除了以上工具,我们还会使用OSX和XCode自带的标准工具集,请确保Xcode命令已安装在您的环境中运行开发人员工具。应用修改、重新打包和重新签名IPA文件实际上是一个ZIP文件,所以我们可以解压ipa包,将FridaGadget.dylib复制到app目录下,然后使用optool在“UnCrackableLevel1”中添加加载命令应用。$unzipUnCrackable_Level1.ipa$cpFridaGadget.dylibPayload/UnCrackable\Level\1.app/$optoolinstall-cload-p"@executable_path/FridaGadget.dylib"-tPayload/UnCrackable\Level\1.app/UnCrackable\Level\1FoundFATHeaderFoundthinheader...Foundthinheader...InsertingaLC_LOAD_DYLIBcommandforarchitecture:armSuccessfullyinsertedaLC_LOAD_DYLIBcommandforarmInsertingaLC_LOAD_DYLIBcommandforarchitecture:arm64SuccessfullyinsertedaLC_LOAD_DYLIBcommandforarm64WritingexecutabletoPayload/UnCrackableLevel1.app/UnCrackableLevel1...上述操作肯定会使主执行文件的代码签名无效,因此应用不能在非越狱设备上运行。Youneedtoreplacetheconfigurationfileinit,andsignthemainexecutablefileandFridaGadget.dylibwiththecertificatelistedintheconfigurationfile.First,weaddourownprofiletothepackage:$cpAwesomeRepackaging.mobileprovisionPayload/UnCrackable\Level\1.app/embedded.mobileprovision\Next,wemakesurethattheBundleIDintheInfo.plistmatchestheBundleIDintheprovisioningfile.CodesignwillreadtheBundleIDinformationfromInfo.plistduringthesigningprocess.Ifthetwoareinconsistent,theapplicationsignaturewillbeinvalid.$/usr/libexec/PlistBuddy-c"Set:CFBundleIdentifiersg.vantagepoint.repackage"Payload/UnCrackable\Level\1.app/Info.plist***,我们使用codesign工具对修改后的application/$rm重新签名-rfPayload/F/_CodeSignature$/usr/bin/codesign--force--sign8004380F331DCA22CC1B47FB1A805890AE41C938Payload/UnCrackable\Level\1.app/FridaGadget.dylibPayload/UnCrackableLevel1.app/FridaGadget.dylibsigns/bin/codeusistingforce--sign8004380F331DCA22CC1B47FB1A805890AE41C938--entitlementsentitlements.plistPayload/UnCrackable\Level\1.app/UnCrackable\Level\1Payload/UnCrackableLevel1.app/UnCrackableLevel1.app/UnCrackableLevel1:replacingexistingsignature在设备上安装并运行修改后的应用。部署并运行修改后的应用程序。$ios-deploy--debug--bundlePayload/UnCrackable\Level\1.app/如果一切顺利,应用程序应该在连接IIdb的调试模式下开始在设备上运行。Frida也应该在应用程序中正确加载和运行,您可以使用frida-ps命令验证这一点:$frida-ps-UPIDName--------499Gadget现在您可以使用Frida正常测试应用程序。故障处理如果上述操作出现错误,您可以检查配置文件和代码签名头是否匹配正确。通常,错误是由两者不匹配引起的。在这种情况下,你可以参考苹果的官方文档来了解整个系统是如何工作的。此外,Apple的故障排除页面也是一个很好的参考。