如何对iOS App进行打补丁和重新签名

有没有想过在非越狱设备上运行修改后的iOS二进制文件?比如,你可以使用该技术插装app,以进行动态分析。又或者你需要进行GPS欺骗,从而可以在锁区玩Pokemon,但又担心越狱检测。

福利来了,你可以按照以下过程对修改后的应用程序进行重新签名,然后便可在自己的设备上运行该应用程序。注意,该技术仅适用于非FairPlay加密二进制文件(从应用商店获取的app均为FairPlay加密)。

苹果的配置和代码签名系统本身就让人有点晕头转向,所以,对app进行重新签名着实不易。只有在配置文件和代码签名头完全正确的前提下,app才能在iOS中运行。

这要求我们了解很多概念——不同类型的证书、BundleID、应用程序ID、团队标识符,以及如何使用苹果的构建工具将它们绑定在一起。

总之,让iOS运行未使用默认方式(XCode)构建的特殊二进制文件可谓一大挑战。

我们需要使用的工具集包括optool、苹果的构建工具及一些shell命令。要复现以下步骤,请下载UnCrackableiOS App Level 1。我们的目标是使无法破解的应用程序在启动时加载FridaGadget.dylib,这样我们便可使用Frida来插装它。

获取开发人员配置文件和证书

配置文件是由苹果签名的、将一个或多个设备上的代码签名证书列入白名单的plist文件。

换言之,这是苹果明确允许你的应用程序在某些上下文中运行,比如在选定设备的调试模式下。配置文件还列出了授予你的应用程序的权限。代码签名证书包含将用于进行实际签名的私钥。

下面提供了两种获取证书和配置文件的方法,具体使用哪一种要看你是不是已注册的iOS开发人员。

方法一:使用iOS开发人员帐户

如果你之前使用Xcode开发和部署过app,那你已经拥有一个代码签名证书。使用安全工具列出你现有的签名身份:

已注册开发人员可以从苹果DeveloperPortal获取配置文件。这需要首先创建一个新的App ID,然后发布一个配置文件——从而让该App ID可以在你的设备上运行。

对于重新打包的目的,选择什么App ID并不重要 – 你甚至可以重新使用一个现有的App ID。重要的是要有一个匹配的配置文件。确保你创建的是开发配置文件而不是分发配置文件,因为稍后需要将调试器附加到应用程序。

在下面的shell命令中,作者使用的是与其公司的开发团队相关联的自己的签名身份。

作者创建了app-id“sg.vp.repackaged”,以及一个名为“AwesomeRepackaging”的配置文件,这便生成了一个名为“AwesomeRepackaging.mobileprovision”的文件——运行示例时改为你自己的文件名。

方法二:使用常规的iTunes帐户

即使你不是付费开发人员,苹果也会给你分发一个免费的开发配置文件。你可以使用你的常规苹果账户并通过Xcode获取配置文件,只需要创建一个空iOS项目,然后从app容器提取embedded.mobileprovision,此过程详情请参见ncc博客。

获得配置文件后便可使用安全工具检查其内容。除允许的证书和设备外,在配置文件中还可找到授予app的权限。

稍后的代码签名需要这些,所以按以下所示将这些提取到一个单独的plist文件。还要看一下文件的内容,检查一下是否有任何异常。

注意应用程序标识符(App ID),其是团队ID(LRUD9L355Y)和Bundle ID(sg.vantagepoint.repackage)的组合。该配置文件仅对具有此特定app id的应用程序有效。

“get-task-allow”键也很重要——当设置为“true”时,允许其他进程(比如调试服务器)附加到应用程序(因此,在分发配置文件中应设置为“false”)。

其他准备

为了使我们的应用程序在启动时加载一个附加的库,我们需要通过一定方法将额外的加载命令插入到主可执行文件的Mach-O头中。我们使用optool来自动化这个过程。

我们还将使用ios-deploy,这个工具可以让我们在不使用Xcode的情况下部署和调试iOS应用程序:

要遵循以下示例,你还需要FridaGadget.dylib:

除了上面列出的工具,我们还要使用OS X和Xcode附带的标准工具(确保你已安装Xcode命令行开发工具)。

打补丁、重新打包及重新签名

现在要步入正题了。IPA文件实际上是ZIP文件,所以要使用任意一款zip工具解压。然后,将FridaGadget.dylib复制到应用程序目录中,然后使用optool将加载命令添加到“UnCrackable Level 1”二进制文件。

这种明显的改动无疑会使主可执行文件的代码签名无效,因此这不能在非越狱设备上运行。你需要替换配置文件,然后使用配置文件中列出的证书对主可执行文件和FridaGadget.dylib进行签名。

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

接下来,我们需要确保Info.plist中的Bundle ID与配置文件中指定的匹配。这样做的原因是codesign将在签名期间从Info.plist读取Bundle ID -错误的值将导致签名无效。

最后,我们使用codesign工具对这两个二进制文件进行重新签名:

安装并运行应用程序

一切已经准备就绪,可以运行修改后的app了。按照以下方式在设备上部署并运行app。

如果一切顺利,那么应用程序应该在调试模式下在设备上启动——附加有lldb。Frida现在也应该能够附加到应用程序了。你可以使用frida-ps命令来验证这一点。

现在便可使用Frida像平常一样插装app了。

故障排除

如果出现错误(通常会发生错误),那最有可能是因为配置文件和代码签名头之间不匹配,在这种情况下,最好阅读官方文档并了解整个系统的工作原理。

参考来源:http://www.vantagepoint.sg/blog/85-patching-and-re-signing-ios-apps

本文分享自微信公众号 - FreeBuf(freebuf)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-03-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术之路

【swift学习笔记】六.访facebook登录页面

代码最下边有下载地址。 做这个demo的主要心得就是自适应所有的屏幕,要先布局大的框架,再一步一步设置小的细节。 看一下效果 ? 再看一下自动适应所有屏幕的效果...

25780
来自专栏Alice

ios手势复习值之换图片-转场动画(纯代码)

目标:实现通过手势进行图片的切换   通过左扫右扫 来实现(纯代码) 添加三个属性 1uiImageView 用来显示图片的view        2 inde...

22070
来自专栏技术之路

【swift学习笔记】三.使用xib自定义UITableViewCell

使用xib自定义tableviewCell看一下效果图 ? 1.自定义列 新建一个xib文件 carTblCell,拖放一个UITableViewCell,再拖...

25570
来自专栏向治洪

关于webp图片格式初探

前言 不管是 PC 还是移动端,图片一直是流量大头,以苹果公司 Retina 产品为代表的高 PPI 屏对图片的质量提出了更高的要求,如何保证在图片的精细度...

2.4K100
来自专栏QQ音乐技术团队的专栏

Android动态布局入门及NinePatchChunk解密

摆脱XML布局文件 相信每一个Android开发者,在接触“Hello World”的时候,就形成了一个观念:Android UI布局是通过layout目录下...

66070
来自专栏技术之路

【swift学习笔记】一.页面转跳的条件判断和传值

  在转跳页面之前我们可能会判断一下是否有输入正确的数据,如下图所示,如果没有数据输入则弹出提示,不进行转跳。 ? 一:页面转跳 1.第一个页面的上放上一个La...

23170
来自专栏java达人

现实生活中的SOLID原则

作者:Erik Dietrich 译者:java达人 来源:https://www.infragistics.com/community/blogs/erikd...

19580
来自专栏技术之路

【swift学习笔记】二.页面转跳数据回传

上一篇我们介绍了页面转跳:【swift学习笔记】一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据...

24380
来自专栏技术之路

【swift学习笔记】四.swift使用Alamofire和swiftyJson

  Alamofire是AFNetworking的swift版本,功能灰常强大。 github:https://github.com/Alamofire/Ala...

33580
来自专栏Alice

ios地图小例子和手势的使用 供大家参考一下呦

最近做了一个小例子 做点笔记 供刚入职场的菜鸟学习,也供自己记忆。 目标:在地图上加上标记  同时复习一下手势的使用 效果图: 具体代码 导入框架:MapKit...

21390

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励