欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

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

来源:本站整理 作者:佚名 时间:2017-02-21 TAG: 我要投稿

在某些场景下,你可能需要在没越狱的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工具列出你现有的签名身份码:

$ security find-identity -p codesigning -v
1) 61FA3547E0AF42A11E233F6A2B255E6B6AF262CE "iPhone Distribution: Vantage Point Security Pte. Ltd."
2) 8004380F331DCA22CC1B47FB1A805890AE41C938 "iPhone Developer: Bernhard Mü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文件中,如下所示。

$ security cms -D -i AwesomeRepackaging.mobileprovision > profile.plist
$ /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' profile.plist > entitlements.plist
$ cat entitlements.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="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来自动化完成这个步骤:

$ git clone https://github.com/alexzielenski/optool.git
$ cd optool/
$ git submodule update --init --recursive
不使用Xcode的情况下,我们可以使用ios-deploy工具来完成应用的部署及调试。

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载