郑重声明:此篇文章,或者后续本人关于逆向的文章,其中的内容只做技术讨论,请勿随意进行恶意的商业活动。否则后果自负。

可能很多人见过别人安装多个微信在手机中,想知道是怎么回事儿,这篇文章就将告诉你。

因为苹果需要对App的安装和使用进行控制,苹果服务器对App加了签名验证,所以不能像安卓那样随便来个包就安装到手机上。

苹果的签名是我们前几篇文章中介绍到的RSA完成的,想要破解是肯定不行的,我们想要安装只能不使用它的签名,使用自己的签名,这就是重签名。

先行都是获取IPA

我们这里以重签微信为例,首先需要获取微信的IPA,有三种方式:

  1. pp助手(或者别的助手)中下载,这是已经砸壳的包,可以直接使用;
  2. 越狱手机中直接copy,当时是copy非正版的包;
  3. iTunes 12.6.3 中下载官方的IPA,但是需要砸壳,网络上有砸壳工具。

为搞明白重签名的原理,我们先进行手动签名。

手动签名

手动签名比较复杂,我们真正开发中是用的很少的,但是有助于明白其中的原理。如果你在按照步骤操作的过程中出现了一些不明所以的问题,不用着急,明白步骤就行,主要看下面的利用Xcode重签和shell脚本重签。

拿到已经砸壳的IPA过后,解压缩,显示包内容,对其中的文件按照这个步骤进行操作。

第一步、删除不能进行签名的部分,有PlugIns的文件夹。

Watch文件文件夹中也包含可执行文件,需要删除。

第二步、签名frame。需要将framework一个一个的进行签名。

这里介绍一个命令,方便你可以列出可以进行签名的证书,命令:$security find-identity -v -p codesigning 。

签名命令:$Codesign –fs “证书串” 文件名 强制替换签名。

第三步、替换描述文件

1、新建一个工程,运行一下,从Products中ShowInFinder,显示包内容,拿到描述文件。

2、将描述文件copy到微信的包中去。

3、修改微信in中的bundleID为描述文件中的bundleID。

4、这个命令可以查看描述文件信息:$security cms -D -i .. 。

5、将描述文件中的entitlements中的这部分内容copy出来,重现创建一个plist文件。

6、将这个创建好的plist文件放在已经修改过的微信IPA同级目录中。

第四步、签名这个App。

命令: $codesign -fs “证书串” –no-strict –entitlements=权限文件.plist APP包 。

第五步、打包。

命令:$Zip –ry 输出文件 输入文件 将输入文件压缩为输出文件

第六步、通过Xcode安装IPA,运行即可。

Xcode签名

手动签名实在繁琐,而且需要处理的细节部分太多,明白了其中的过程,让我们还是通过Xcode来完成吧。Xcode会帮我们完成对于App的签名,但是其中对于Framework的签名和bundleID的修改还是需要自己完成的。

通过Xcode建一个同名工程后。

第一步、仍然是把应该删除的内容先删除掉。

第二步、更改In中的bundleID。

第三步、替换我们的同名成功App包。

第四步、第一次安装需要信任签名。

第五步、Commond + R,然后就成功了。

shell脚本自动签名

Xcode签名还需要修改一下东西,shell完全自动化操作,让我们的操作直接飞起来。明白其中语句含义,将来签名其它的App也只需要稍作修改。

第一步、通过Xcode建一个同名功能后,在工程目录中创一个叫APP的文件夹,并将IPA包放进去。

第二步、然后在Build Phases中创建一个Script。

第三步、输入下面的脚本:

# ${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.个人证书没法签名Extention
rm -rf "$TARGET_APP_PATH/PlugIns"
rm -rf "$TARGET_APP_PATH/Watch"
#—————————————-
# 4. 更新in文件 CFBundleIdentifier
# 设置:"Set : KEY Value" "目标文件路径"
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/In"
#—————————————-
# 5. 给MachO文件上执行权限
# 拿到MachO文件的路径
APP_BINARY=`plutil -convert xml1 -o – $TARGET_APP_PATH/In|grep -A1 Exec|tail -n1|cut -f2 -d>|cut -f1 -d<`
#上可执行权限
chmod +x "$TARGET_APP_PATH/$APP_BINARY"
#—————————————-
# 6. 重签名第三方 FrameWorks
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

当然这个文件可以放在外面,不是直接写在工程中。

在脚本中写出找到这个文件的路径,就可以直接执行了。

但是在执行中这个文件肯定会缺乏执行权限,那么我们需要给它加上,进到这个文件目录,执行命令:chmod +x 。

使用脚本或者Xcode进行重签都非常简单。这样,我们就可以在iPhone中安装多个相同的App啦。

(熟悉的暗号:e8129245b35bae61484a3c2f4ed5e037)

相关推荐