ipa包重签名探究


为什么要对ipa包重签名?如果是非越狱手机,你会发现从第三方商店下载的非企业证书分发的ipa包无法安装到手机上,也就无法实现动态调试。这时候我们可以对ipa包重签名,用来运行在自己的手机上,在进行重签名之前,首先要了解🍎是如何签名的

上图即是整个苹果对项目安装到手机上的加密流程。在这整个流程中,用到了两对公/私钥,图中的私钥2是存在于苹果服务器,公钥2则内置在每一台手机中

公钥1其实就是证书请求文件(csr文件),公钥1是通过私钥1产生的,通过openssl命令可以查看这个证书请求文件,可见使用的是RSA加密算法,并对这个公钥做了sha256信息摘要。在开发者网站上,我们通过CSR文件向🍎请求证书,🍎则通过私钥2对这个文件进行加密生成了证书。证书中包含了公钥1和对应的hash值。下载下来证书后双击安装,Mac电脑中的私钥会和下载下来的证书相关联,这时候会在钥匙串中看到对应的私钥。然后在通过Xcode打包的时候,使用私钥1对这个二进制文件进行加密,同时使用到的证书也被打包到ipa文件中。在手机进行安装前,会首先用公钥2对证书进行解密,通过解密拿到证书中的公钥1,由于需要安装的二进制文件是通过私钥1加密的,所以使用公钥1进行解密,这个流程可以确保手机安装的app都是通过苹果授权允许的,从而确保了安全性

上述流程其实还存在问题,如果申请了一个证书,那就可以安装所有的app,导致应用的滥用安装。🍎又通过了描述文件(mobileprovision),描述文件也是向🍎请求所得,文件中包含了设备唯一标示、项目的Bundle iD、权限文件等,打包时会一并打包进去,这时候经常会出现问题,如设备ID没有注册、项目Bundle Id不对等。手机安装前会判断当前设备iD是否已注册,Bundle Id是否正确等。Mac电脑中可以通过Security命令查看描述文件内容,SecurityMac系统中钥匙串和安全模块的命令行管理工具,(图形化工具为Keychain Access.app)。钥匙串(Keychain)实质上就是一个用于存放证书、密钥等安全认证实体的仓库,使用时不需要写路径,直接用文件名即可,Security工具会自动搜索。由上图可见,描述文件其实是一个XML文件,拷贝放到Xcode,新建一个Plist文件打开,可以很清楚的看到,文件中包含创常见时间、失效时间、注册的设备数、每台设备的设备Id、团队名称等。在ipa包中可以看到这个描述文件(embedded.mobileprovision)

上述则是🍎整个签名流程。如果我们获取到ipa包想安装到自己的手机上进行动态调试,就需要我们自己给这个包进行重签名,下面粗略介绍三种签名方法,其实是一种签名方法的三种形式。之前提到过,也可以直接使用Monkey Dev就可以完成整个过程,省去我们繁琐的重签名,但毕竟Monkey Dev属于第三方工具,我们有必要去了解实践整个重签流程。以前使用iOS App Signer工具也可以重签,现在也已经签不成功

一.手动重签

通过PP助手首先下载一个ipa包,相当于一个zip包,解压出来, 使用codesign命令可以查看这个ipa包的签名信息

也可以通过otool命令查看可执行文件的加密信息

  • 1 这里以微信为例,删除插件Plugins文件夹里面的内容,个人证书无法对插件重签

  • 2 直接删除Watch文件夹

  • 3 对 Frameworks 进行签名,要使用Xcode正在使用的证书进行重签

查看本地所有可用证书

Framework进行重签

  • 4 给可执行文件添加执行权限

    chmod +x 可执行文件名

  • 5 将当前工程的描述文件拷贝到目标文件中

  • 6 修改info.plist 的Bundle Id

  • 7 生成plist的权限文件

查看第五步中的描述文件

将其中的权限文件部分复制出来,即下图圈起来的部分,通过Xcode创建空的plist文件,将权限文件转成plist文件

然后将这个权限文件放到WeChat.app同级目录下

  • 8 签名整个App

  • 9 生成ipa文件

WeChat.app替换掉Payload中的WeChat.app文件,压缩成ipa文件

  • 10 安装到手机

注意,ipa包重签是一个和🍎博弈的过程,有些ipa包可能用此方法并不能重签成功

上面用到了几个常用命令

查看描述文件信息:

security cms -D -i 描述文件路径

查看app的签名信息

codesign -vv -d app路径

查看本机所有可用证书

security find-identity -v -p codesigning

查看可执行文件的加密信息

otool -l 可执行文件路径 | grep crypt

Framework重签

codesign -fs "证书" 需要签名的文件路径

二.使用Xcode重签

  • 1 新建一个空工程,编译,将微信越狱包替换掉编译后的包

  • 2 依然需要对ipa包中的Framrworks进行重签

  • 3 修改info.plist中的Bundle Id为这个空工程的Bundle Id

  • 4 对包中的可执行文件赋予可执行权限

    chmod +x 可执行文件路径

  • 5 依然需要删除Plugins文件夹和Watch文件夹

  • 6 重新编译工程即可

三.使用脚本自动重签

知道了重签的流程,就可以使用脚本来流程化这个操作

  • 1.新建一个空工程,模仿Monkey Dev来操作,先在根目录下建一个文件夹APP来承接要重签名的ipa

  • 2.然后新建一个Run Script,脚本的整个流程其实就是对ipa进行解压,将.app文件替换掉当前空工程打包的文件,然后将.app文件中的PluginsWatch文件夹删除,重签Framework和修改Info.plist中的Bundle Id

  • 3.重新运行即可

或者直接输入脚本路径

脚本内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
TEMP_PATH="${SRCROOT}/Temp"
ASSETS_PATH="${SRCROOT}/APP"
TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa"
rm -rf "${SRCROOT}/Temp"
mkdir -p "${SRCROOT}/Temp"

unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH"
TEMP_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app;echo "$1")

TARGET_APP_PATH="$BUILT_PRODUCTS_DIR/$TARGET_NAME.app"

rm -rf "$TARGET_APP_PATH"
mkdir -p "$TARGET_APP_PATH"
cp -rf "$TEMP_APP_PATH/" "$TARGET_APP_PATH"

rm -rf "$TARGET_APP_PATH/PlugIns"
rm -rf "$TARGET_APP_PATH/Watch"

/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"

APP_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`
chmod +x "$TARGET_APP_PATH/$APP_BINARY"

TARGET_APP_FRAMEWORKS_PATH="$TARGET_APP_PATH/Frameworks"
if [ -d "$TARGET_APP_FRAMEWORKS_PATH" ];
then
for FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"*
do

/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
done
fi

AutoSignature


如有任何疑问或问题请联系我:fishnewsdream@gmail.com,欢迎交流,共同提高!

Objective-C/Swift技术开发交流群201556264,讨论何种技术并不受限,欢迎各位大牛百家争鸣!

微信公众号OldDriverWeekly,欢迎关注并提出宝贵意见

老司机iOS周报,欢迎关注或订阅

刚刚在线工作室,欢迎关注或提出建设性意见!

刚刚在线论坛, 欢迎踊跃提问或解答!

如有转载,请注明出处,谢谢!

本站总访问量 本文总阅读量