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

2020-11-17  本文已影响0人  ForestSen

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

一、iOS 签名机制的目的


二、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 证书的组成

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

iReSign

https://github.com/maciekish/iReSign

LTResign

https://github.com/gltwy/LTResign

上一篇 下一篇

猜你喜欢

热点阅读