iOS逆向工程(8)菜鸟也能懂的iOS签名机制

为了方便广大网友手动砸壳和鉴于目前 PP 助手已经下载不到脱壳的应用还有 itunes 新版本也不支持下载 ipa 了,所以个人跟朋友一起只做了,自动化免费砸壳平台 - www.dumpapp.com ,希望多多支持。

一、iOS 签名机制的目的


  • 在 iOS 出来之前,在主流操作系统(Mac/Windows/Linux)上开发和运行软件是不需要签名的,软件随便从哪里下载都能运行,导致平台对第三方软件难以控制,盗版流行。

  • 苹果希望解决这样的问题,在 iOS 平台对第三方 APP 有绝对的控制权,一定要保证每一个安装到 iOS 上的 APP 都是经过苹果官方允许的,怎样保证呢?就是通过签名机制。

二、iOS 签名机制的实现


1. iOS 上架 APP,签名证书的过程

(1)生成 CertificateSigningRequest.certSigningRequest 文件
(钥匙串 --- 从证书颁发机构请求证书 ---- 生成)

(2)获得 ios_development.cer / ios_distribution.cer 证书
(需要上传 CertificateSigningRequest.certSigningRequest 文件)

(3)注册设备,添加 Appid (生成描述文件的准备)

(4)获得 *.mobileprovision 文件
(需要选择 appiddevicescer证书 等文件)

2. iOS APP 签名流程图

(1)iOS 签名 通过Mac 公钥Apple 私钥 进行加密生成公钥证书

(2)然后加上 appiddevicescer 证书entitlements 然后再次用 Apple 私钥 进行加密 生成 mobileprovision 文件

(3)然后 再加上 APP 二进制的 签名APP 二进制,最后就是最终ipa安装包的组成。

三、iOS 签名 APP 的组成


1. cer 证书的生成与组成

(1)生成Mac设备的公私钥(通过证书助理)

生成 CertificateSigningRequest.certSigningRequest文件
(钥匙串 --- 从证书颁发机构请求证书 ---- 生成)

(2)获得证书

从开发者平台 上传Mac电脑生成的 CSR 文件,获得 ios_development.cer / ios_distribution.cer 证书

总结 - cer 证书的组成

  • 证书 = 利用 Apple 后台的私钥,对 Mac 设备生成的公钥进行签名后的生成的 cer 证书文件
  • Mac公钥 = CertificateSigningRequest.certSigningRequest
  • Apple私钥 = Apple后台生成

2. mobileprovision 描述文件的生成

(1)从开发者平台 选择 appid + devices + 证书 生成的 描述文件
(2)mobileprovision 证书的组成

Mobileprovision = 证书 + devices + appid + entitlements + Apple私钥加密签名

总结 App 构成

APP = APP + Mac私钥加密签名
ipa安装包 = APP + mobileprivision

AppStore 的下载安装验证

如果APP是从AppStore下载安装的,你会发现里面是没有mobileprovision文件的
它的验证流程会简单很多:直接用 Apple的公钥 去验证 签名 然后获取到 APP

四、如何手动重签名一个 APP


1. 为什么需要重签名

一旦改变了应用的二进制文件,或者增加修改了里面的资源,或者修改了包名 等,应用本身的签名就会被破坏。

如果还要想将修改后的 ipa 安装到手机上,就需要对应用做重签名,让 ipa 包和签名保持一致。
(其实就是手动完成 Xcode 签名)

当然如果是越狱手机在 cydia 中安装了 appsync 插件后也可以去掉苹果的签名验证,进行随意安装 ipa。不过大多数人的手机都是非越狱的,所以想要修改 ipa 就必须重签名操作。

2. ipa 包中 需要重签名的文件

.app 包内部的所有动态库(.framework、.dylib)、AppExtension(PlugIns文件夹,拓展名是appex)、WatchApp(Watch文件夹)都需要重新签名。

一般 PlugIns 和 Watch 文件夹 可以进行删除操作。

3. 重签名的步骤 - 概述版

  1. 下载 ipa,对 ipa 进行脱壳,解压 ipa 得到 Payload 文件夹(确保 ipa 是脱壳后的才能进行重签名)
  2. 进入 Payload 中的 .app 文件夹中,删除 PlugInsWatch 文件夹(如果有这两个文件夹的话无法进行签名,需要进行删除)
  3. 删除info.plist中的 UISupportedDevices 字段(如果有此字段会存在安装 ipa 失败的情况)
  4. 如果有需要,修改BundleId 或者包名字,或者针对app 进行逆向hook 注入动态库 修改。
  5. 使用 security 命令 获取当前证书的序号,然后获取对应证书的 mobileprovision文件。
  6. 获取 mobileprovision 文件中 的 entitlements.plist 放到 .app 同级目录下。
  7. 使用 codesign 命令 对 APP 中资源framework等进行 签名
  8. 使用 codesign 命令,对整个.app 文件 用 entitlements.plist 进行重签名。
  9. 使用 zip 命令 打包 Payload.ipa 文件。

使用个人证书重签名的时候,必须保持 重签名包 info.plist 里的 bundleid 和 描述文件生成中的 bundleid 一致。

4. 重签名步骤 - 简化版

(1)准备一个embedded.mobileprovision文件(appid、device一定要匹配),并放入.app包中

可以通过 Xcode自动生成,然后在编译后的APP包中找到。或者在开发者证书网站生成下载。

(2)从embedded.mobileprovision文件中提取出entitlements.plist权限文件

security cms -D -i embedded.mobileprovision > temp.plist
/usr/libexec/PlistBuddy -x -c 'Print :Entitlements' temp.plist > entitlements.plist

(3)查看可用的证书

security find-identity -v -p codesigning

(4)对.app内部的动态库、AppExtension等进行签名

codesign -fs   证书ID   xxx.dylib

(5)对.app包进行签名

codesign -fs 证书ID  --entitlements entitlements.plist xxx.app

五、重签名的步骤 -- 详细演示操作


下面以 《LIANKS》 这个 app 演示重签名。

脱壳后的 ipa 可从 www.dumpapp.com 进行获取

1. 准备工作

(1)获取 ipa,解压 Payload 文件夹

下载 ipa,对 ipa 进行 脱壳解压 ipa 得到 Payload 文件夹(需要确保 ipa 是脱壳后的才能进行重签名)

(2)删除无用文件夹

进入 Payload 中的.app 文件夹中,删除 PlugInsWatch 文件夹。

如果有这两个文件夹的话无法进行签名,需要进行删除。

rm -r PlugIns
rm -r Watch
(3)删除APP的 info.plist 中的 UISupportedDevices 字段

如果有此字段会存在安装 ipa 失败的情况

/usr/libexec/PlistBuddy -c "Delete :UISupportedDevices" info.plist
(4)对 ipa 进行修改,破坏签名。

如果有需要,修改 BundleId 或者包名字,或者针对app 进行逆向 hook 修改注入动态库。

/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.lianks.client3" Info.plist 
/usr/libexec/PlistBuddy -c "Set :CFBundleDisplayName 重签名 APP" Info.plist 
/usr/libexec/PlistBuddy -c "Set :CFBundleName 重签名 APP2" Info.plist 

记住,使用个人证书重签名的时候,必须保持 重签名包 info.plist 得到 bundleid 和 描述文件mobileprovision 生成中的 bundleid 一致。

(5)使用个人证书,新建项目,编译获取证书对应 mobileprovision

新建一个新的项目工程,然后选择对应的 team 生成对应的个人证书,然后 编译后进入 Products 下,找到编译后的 .app 进入后,获取对应的 mobileprovision 文件。

获取对应的 mobileprovision 文件后,把 mobileprovision 放到 Payload 文件夹下。

如果自己手里有 P12 证书 和 对应 mobileprovision 文件,那么可以直接使用对应的mobileprovision 文件,只要确保 证书 和 mobileprovision 文件对应。

获取 mobileprovision 文件中 的 entitlements.plist 放到 .app 同级目录下。

当对整个 app 进行签名,所以需要用到 mobileprovision 中的 entitlements 描述。

下面演示是如何从 mobileprovision 提取 entitlements.plist 的方法

security cms -D -i embedded.mobileprovision > temp.plist
/usr/libexec/PlistBuddy -x -c 'Print :Entitlements' temp.plist > entitlements.plist
(6)使用 security 命令 获取当前证书的 ID。然后获取对应证书的 mobileprovision文件。

例如证书 ID:D575192406813F8C403E9F419F6C7EB59FE5B6B7 "Apple Development: Dasen Zhang (YL8475CD7Q)"

security find-identity -v -p codesigning

2. 正式开始签名

这个时候我们已经拿到 D575192406813F8C403E9F419F6C7EB59FE5B6B7证书 ID 和 entitlements.plist 描述文件,然后就可以 对 app 内 framework 等资源进行签名了。

(1)使用 codesign 命令 对 APP 中资源framework,dylib等进行 签名
执行签名命令:
codesign -fs D575192406813F8C403E9F419F6C7EB59FE5B6B7 *.*
(2) 最后使用 codesign 命令,对整个.app 文件 用 entitlements.plist 进行重签名。
codesign -fs D575192406813F8C403E9F419F6C7EB59FE5B6B7 --entitlements entitlements.plist HiFi\ Pro.app
(3)对Payload 文件夹进行压缩成 ipa,进行安装测试

压缩完成后,就可以用爱思助手进行安装

zip -ry hifi.ipa Payload
(4) 使用爱思注入进行导入测试
(5)安装成功

这个时候发现能够安装成功,并且名字已经变了,说明我们已经重签名成功了。

六、其它签名方法

对 iOS ipa 进行签名目前已经有很多工具了,其实这些工具底层都是根据手动签名的原理进行了封装和自动化。

iOS App Signer

https://github.com/DanTheMan827/ios-app-signer

  • 可以对.app重签名打包成ipa
  • 需要再.app包中提供对应的embedded.mobileprovision文件

iReSign

https://github.com/maciekish/iReSign

  • 可以对ipa进行重签名
  • 需要提供entitlements.plist、embedded.mobileprovision文件的路径

LTResign

https://github.com/gltwy/LTResign

  • 可以对ipa进行重签名,一款基于 Python 写的脚本
  • 需要提供embedded.mobileprovision文件的路径·
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,635评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,543评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,083评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,640评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,640评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,262评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,833评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,736评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,280评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,369评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,503评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,870评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,340评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,460评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,909评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,512评论 2 359

推荐阅读更多精彩内容