iPA重签名 + 香色闺阁、微信重签名实战

背景

换手机之后，原来的香色闺阁不能下载，转移的时候就丢失了。又最近看到有人截屏 iPhone 上装了两个微信，一个是自己重签名的；想到自己有开发者账号，但是还没试过重签名 APP，是不是可以通过重签名来安装香色闺阁，以及实现多开微信？

步骤

说干就干，首先从简单的开始，先来尝试重签名香色闺阁，再尝试微信，因为香色闺阁的包内容比微信的少很多，文件容易找，相对简单，步骤如下：

重签名香色闺阁

首先从网上搜素下载香色闺阁的 ipa 包，没有的可以从这里yuedu.ipa下载。

然后将 ipa 改为 zip，然后解压，会出现一个 Payload 文件夹，里面有一个StandarReader.app的文件。选中StandarReader.app，右键显示包内容，可以看到 APP 包中的所有内容，如下图：

重签名就是用自己的账号新建一个 APP（bundleID 自己定义），运行到手机上，找到运行的包 (xxx/DriveData/xxx/Build/Products/Debug-iphoneos/xxx.app) 或者通过打包的方式，使用AdHoc方式生成一个 iPA（用于获取到描述文件和Entitlements.plist），这里需要注意选择的描述文件包含要安装的设备，然后把待签名的 iPA 中的bundleID、证书和描述文件，替换成自己创建的 APP 的。

所以通常需要修改的有以下内容：

Info.plist 中的 bundleID

embedded.mobileprovision 签名文件

_CodeSignature 中的内容

因为普通账号不能对插件进行签名，在包内容路径中找到 Watch 和 PlugIns 文件夹直接删除

重签 framework

而针对香色闺阁的 ipa 来说，没有插件，没有 framework，所以需要修改的文件有：Info.plist、embedded.mobileprovision、_CodeSignature中的内容，下面具体来看如何修改：

修改 Info.plist 中的 bundleID

找到Payload/StandarReader.app中的 Info.plist，用 Xcode 打开，或者其他编辑器打开，找到Bundle identifier，可以看到香色闺阁的 bundleID 为com.appbox.StandarReader，替换com.appbox.StandarReader为自己创建 APP 的 bundleID， 如下图：

Ps: 如果不是 Xcode 打开可以直接搜索替换

替换embedded.mobileprovision

从自己新建 APP 的 iPA 中获取到新的embedded.mobileprovision，步骤同上：改为 zip -> 解压缩 -> 查看包内容，找到embedded.mobileprovision拷贝出来，可以放到要替换的Payload目录的外层，如下图:

然后用这个新的替换原 APP 中embedded.mobileprovision，可以通过命令行，如下：

删除原 APP 中的描述文件
Copy
rm -rf Payload/xxx.app/embedded.mobileprovision

把新的描述文件，放入 xxx.app 中
Copy
cp embedded.mobileprovision Payload/xxx.app/

重新签名

从自己创建的 APP 的embedded.mobileprovision中获取Entitlements.plist，注意是自己创建的 APP 中获取，而不是香色闺阁的包中获取，然后删除香色闺阁包中的_CodeSignature，再用生成的Entitlements.plist给香色闺阁包生成新的签名，具体步骤如下：

生成Entitlements.plist
Copy
/usr/libexec/PlistBuddy -x -c "print:Entitlements " /dev/stdin <<< $(security cms -D -i xxx.app/embedded.mobileprovision) > Entitlements.plist

删除香色闺阁包中的_CodeSignature
Copy
rm -rf Payload/xxx.app/_CodeSignature/

用新的Entitlements.plist给香色闺阁包生成新的签名
Copy
// 首先获取证书名称
security find-identity -v -p codesigning
// 选择创建APP时使用的证书进行签名
codesign -f -s "证书名称" --entitlements entitlements.plist Payload/xxx.app

打包，安装

将Payload文件夹在压缩为ipa文件，命令如下：

Copy
zip -r xxx.ipa Payload/

最后安装，可以选中 Xcode，然后选择 Windows -> Device And Simulators，或者选中 Xcode 后使用快捷键Shift+CMD+2打开，选中设备，点击+，选择生成的 ipa，即可安装。

重签名微信

第一步，获取微信的 ipa 文件，要注意下载 ipa 的可用性，要不然辛苦半天最后发现不能用，误以为是步骤有问题，有可能是包的问题。。。笔者最终可用的是从这里下载的微信 ipa

ipa 下载完成后，和上面步骤类似，改为.zip，解压，获取到 Payload/WeChat.app，如下图：

用自己的账号新建一个 APP（bundleID 自己定义），运行到手机上，找到运行的包 (xxx/DriveData/xxx/Build/Products/Debug-iphoneos/xxx.app) 或者通过打包的方式，使用AdHoc方式生成一个 iPA（用于获取到描述文件和Entitlements.plist），这里需要注意选择的描述文件包含要安装的设备，然后把待签名的 iPA 中的bundleID、证书和描述文件，替换成自己创建的 APP 的。

修改 info.plist 的 bundleIdentifier

然后查看 WeChat.app 的包内容，找到info.plist，并替换其中的bundleIdentifier为自己创建的 (WeChat.app 中内容很多，可以按修改日期排序，会相对容易找到要修改的文件)，如下图：

替换embedded.mobileprovision

从自己创建的 APP 中获取到embedded.mobileprovision，然后替换WeChat.app中的embedded.mobileprovision，可以直接复制替换。

重签名 Frameworks

对比上面的香色闺阁，这里多了重签名 Frameworks 的步骤，需要把Frameworks中的所有库，都用自己的证书重新签名一下，Frameworks中内容如下图（这里可能有非官方的库，一并签名了，不影响）：

重签名的命令如下，重复执行，直到Frameworks下所有库都签名完成：

Copy
codesign -fs "你的证书" xxx.framework

删除 Plugins

笔者下载的这个版本的WeChat.app的 Content 中未找到Plugins的内容，故而不需要处理

替换签名

从自己创建的 APP 中获取到的embedded.mobileprovision生成Entitlements.plist，命令如下：

Copy
/usr/libexec/PlistBuddy -x -c "print:Entitlements " /dev/stdin <<< $(security cms -D -i xxx.app/embedded.mobileprovision) > Entitlements.plist

然后删除WeChat.app中的_CodeSignature，再用生成的Entitlements.plist，给WeChat.app重签名，命令如下，执行时注意Entitlements.plist和WeChat.app的路径：

Copy
codesign -fs "你的证书" --no-strict --entitlements=Entitlements.plist Payload/WeChat.app/

然后压缩/Payload/WeChat.app，生成xxx.ipa，命令如下：

Copy
zip -r xxx.ipa Payload/

最后使用 Xcode 安装 xxx.ipa 到手机，步骤如下：
选中 Xcode，Shipt+CMD+2打开窗口，然后选中设备，点击 "+"，选择xxx.ipa，等待安装

最后安装后效果如下：

总结

总结一下，ipa 重签名是用自己的证书和描述文件替换对应包中的证书和描述文件的过程，总的步骤如下：

找到可用的 ipa

新建项目，编译或者打包，获取到对应的embeded.mobileprovision

修改替换包的bundleIdentifier为自己创建项目的bundleIdentifier

用自己的embeded.mobileprovision更新替换包中的

重签名Frameworks

删除Plugins

用自己的embeded.mobileprovision生成Entitlements.plist，然后重签名xxx.app

最后打包xxx.app成xxx.ipa，安装

参考

iOS 逆向 应用重签名 + 微信重签名实战

iOS ipa 重签名