Skip to main content

重签名3-new

作为一个iOS开发者自然非常熟悉Applications的重要性,那么本篇文章讲解一下如果常规操作下对日常的Application进行重签名操作。

![图片] (ios/resources/0F067663E0A8B6739E56C4A2D2BA4BD4.gif)

接下来呢我们要讲的内容

1

分析Apple对Application加密的需求

2

什么是双层签名验证

3

手动对Application进行重签名

4

使用Shell脚本进行重签名

01

分析一下Apple对Application加密的需求

首先明确一点,对App加密肯定是用要非对称加密而不是对称加密!这我默认大家都懂了,应该不用解释。

如果所有的APP都是从App Store下载的那么,这就简单了,只需要对APP进行一层RSA加密就可以了,App Store持有私钥,我们iPhone持有公钥。那么问题就解决了。但事实上肯定不是这样,我们已知的渠道除了App Store就包括XCode打包,Ad-hoc证书分发,企业证书分发等等。为了解决这个问题,我们就得先了解Apple的具体需求是什么。

02

什么是双层签名验证

什么是「双层签名验证」,如图:

![图片] (resources/DD30C95D52845C53E1BF200185144822)

具体不细说了,说了也看不懂![图片] (ios/resources/BB764515951C7E67DD48AADFE3002D0C.png) ![[ios/resources/BB764515951C7E67DD48AADFE3002D0C.png]] (assets/ios/resources/BB764515951C7E67DD48AADFE3002D0C.png)

03

手动对Application进行重签名(如不看可跳至末尾总结)

注:对APP进行重新签名,前提是这个APP已经被砸壳了。下载已经砸壳成功的APP,以下用WeChat7.0.2(软件包在QQ群群文件中提取即可,回复公众号QQ群即可)为例子。

** **

进入应用目录

解压出 ipa,进入WeChat目录

// 进入WeChat的目录下载到桌面解压打开终端cd /Users/用户名/Desktop/iOS逆向-Application重签名-WeChat7.0.2/Payload

查看应用状态

codesign -d -vv「WeChat.app路径」

![图片] (resources/42047D7BB3FF51667CCF1417128795FC)

验证应用是否被加密

进入APP的包内容可以看到其中有一个WeChat的可执行文件,也就是是MachO文件,就是要查看这个MachO文件时候被加密

otool -l WeChat | grep cryp

其中cryptid0代表已经砸壳,即解密,

如果是1或者2,则表示以第1类或者第2类加密方案加密。

查看本地证书,并记录

security find-identity -v -p codesigning

![图片] (resources/D1352CE841B1A3E614DC8373E04CDDA7)

删除应用内不可签名的插件(包括Watch文件夹中的插件)

由于本地存在一些插件,这些插件是不可被我们重签,并且这个过程我们用不着,所以我们索性就删掉。其中包括:整个目录PlugIns目录和整个Watch目录(因为Watch.app中也有个PlugIns)

Framework重签名

这一步就是比较繁琐的了,需要将Frameworks下的所有Framework进行重签名,运用到XCode提供的codesign指令,参数中的证书就是步骤四中的一个。具体使用哪个就看个人了

codesign –fs 「证书串」 「文件名」

![图片] (resources/7AE1AF22E20752A5C94A32E86944B49B)

给MachO添加可执行权限

由于MachO本身就有可执行权限,所以这一步跳过。

给Application重签名

一、新建一个WeChat工程(以下称NewVX);

二、Build NewVX工程,进入被编译出的WeChat.app目录,找到其中的embedded.mobileprovision文件,将其复制到WeChat.App(越狱微信)中

![图片] (resources/F600F290FCB6FD4D55C0FD0DF112F648)

![图片] (ios/resources/83C509B95BCBB74906568C283AB5420C.png) ![[ios/resources/83C509B95BCBB74906568C283AB5420C.png]] (assets/ios/resources/83C509B95BCBB74906568C283AB5420C.png)

![图片] (ios/resources/493B9FEFD2E52DE41632046FD0A74FF6.png) ![[ios/resources/493B9FEFD2E52DE41632046FD0A74FF6.png]] (assets/ios/resources/493B9FEFD2E52DE41632046FD0A74FF6.png)

在WeChat.App找到info.plist,并修改其中的BundleId为NewWeChat的BundleId

这里改了就是共存版,修改Bundle id,能基本共存市面上99%应用

查看embedded文件

security cms -D -i 「 embedded文件路径」

找到其中的entitlements字段,并且复制entitlements字段和其中的内容

![图片] (resources/11F8C3AB3E909F6D25DEC85F6487808B)

![图片] (resources/A0E5E402A4C8403FBFD468643EE5CF31)

在NewVX中新建entitlements.plist文件,

将上一步复制得到的「entitlements字段内容」

拷贝入新的entitlements.plist文件,

然后将entitlements.plist复制到WeChat.app的同级目录下。

![图片] (resources/D72627950C0A28BEBEB6AA36668309B2)

![图片] (ios/resources/7DE2F9838B4924FE8193BE9A7E6700C5.png) ![[ios/resources/7DE2F9838B4924FE8193BE9A7E6700C5.png]] (assets/ios/resources/7DE2F9838B4924FE8193BE9A7E6700C5.png)

对APP重新签名 进入WeChat目录,

codesign -fs 「证书串」 --no-strict --entitlements=entitlements.plist

压缩Playload文件夹

 zip –ry 「输出文件名」 「输入文件名」

安装新的ipa

用各种第三方助手安装即可,比如爱思助手,PP助手等。

如果想用LLDB调试微信,可以将重签后的WeChat.app替换NewVX Build后的WeChat.app,然后直接运行(Run)项目,就会发现我们可以用LLDB了

验证ipa是否真的重签成功

这一步其实是重复第三步

codesign -d -vv「WeChat.app路径

步骤总结:

1、cd WeChat // 进入WeChat的目录2、codesign -d -vv「WeChat.app路径」 // 查看APP的证书情况3、otool –l WeChat | grep cryp // 查看APP是否被加密4、security find-identity -v -p codesigning // 查看本地证书5、删除不可签名的插件(还有Watch中的插件)6、codesign –fs 「证书串」 「文件名」 // Framework重签名7、chmod +x 可执行文件 // 给文件添加权限8、App重签名 ① 新建一个项目并且命名为 WeChat(下文称NewWeChat,原来的微信APP称之为WeChat) -\> Build -\> 找到APP中的权限文件 embedded.mobileprovision ② 复制embedded.mobileprovision到WeChat.app中 ③ 修改WeChat.app中info.plist的BundleId ④ security cms -D -i 「 embedded文件路径」  //查看WeChat中的embedded文件,复制WeChat中entitlements.plist文件的entitlements字段 ⑤ 在NewWeChat中新建entitlements.plist文件,将上一步复制得到的「entitlements字段和其中的内容」拷贝入新的entitlements.plist文件 ⑥ codesign -fs 「证书串」 --no-strict --entitlements=entitlements.plist  //复制新的entitlements到WeChat.app的同级目录,并且对APP重新签名 ⑦ zip –ry 「输出文件名」 「输入文件名」  // 压缩Playload9、安装ipa 10、再次验证新的ipa是否真的重签成功

注意:有些人会安装失败,或者安装成功会有Crash(闪退/崩溃)的问题,这是因为当前描述文件在我们的手机还不受信任,用新工程NewWeChat在手机上跑一遍,然后删除NewWeChat,在尝试安装新的ipa,问题可以解决。

04

使用脚本进行Application重签

上面所有的步骤其实是固定不变的,而且所有需要操作的文件相对于ipa文件的「相对地址」也是固定的,所以就可以用脚本来代替所有的操作。以下脚本适用于使用XCode直接调试,牵扯使用AppReSign,项目下载地址:

https://github.com/Acreson/AppReSign

以下是脚本代码

\# ${SRCROOT} 它是工程文件所在的目录TEMP\_PATH="${SRCROOT}/Temp"\#资源文件夹,我们提前在工程目录下新建一个APP文件夹,里面放ipa包ASSETS\_PATH="${SRCROOT}/APP"\#目标ipa包路径TARGET\_IPA\_PATH="${ASSETS\_PATH}/\*.ipa"\#清空Temp文件夹rm -rf "${SRCROOT}/Temp"mkdir -p "${SRCROOT}/Temp"
\#----------------------------------------\# 1\. 解压IPA到Temp下unzip -oqq "$TARGET\_IPA\_PATH" -d "$TEMP\_PATH"\# 拿到解压的临时的APP的路径TEMP\_APP\_PATH=$(set -- "$TEMP\_PATH/Payload/"\*.app;echo "$1")\# echo "路径是:$TEMP\_APP\_PATH"
\#----------------------------------------\# 2\. 将解压出来的.app拷贝进入工程下\# BUILT\_PRODUCTS\_DIR 工程生成的APP包的路径\# TARGET\_NAME target名称TARGET\_APP\_PATH="$BUILT\_PRODUCTS\_DIR/$TARGET\_NAME.app"echo "app路径:$TARGET\_APP\_PATH"
rm -rf "$TARGET\_APP\_PATH"mkdir -p "$TARGET\_APP\_PATH"cp -rf "$TEMP\_APP\_PATH/" "$TARGET\_APP\_PATH"
\#----------------------------------------\# 3\. 删除extension和WatchAPP.个人证书没法签名Extentionrm -rf "$TARGET\_APP\_PATH/PlugIns"rm -rf "$TARGET\_APP\_PATH/Watch"
\#----------------------------------------\# 4\. 更新info.plist文件 CFBundleIdentifier\# 设置:"Set : KEY Value" "目标文件路径"/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT\_BUNDLE\_IDENTIFIER" "$TARGET\_APP\_PATH/Info.plist"\#----------------------------------------
\# 5\. 给MachO文件上执行权限\# 拿到MachO文件的路径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"
\#----------------------------------------\# 6\. 重签名第三方 FrameWorksTARGET\_APP\_FRAMEWORKS\_PATH="$TARGET\_APP\_PATH/Frameworks"if [ -d "$TARGET\_APP\_FRAMEWORKS\_PATH" ];thenfor FRAMEWORK in "$TARGET\_APP\_FRAMEWORKS\_PATH/"\*do
\# 签名/usr/bin/codesign --force --sign "$EXPANDED\_CODE\_SIGN\_IDENTITY" "$FRAMEWORK"donefi