iOS应用重签名技术

了解了iOS应用签名之后,发现苹果就是通过签名来验证我们的证书能否能签名我们的 App ,那我们能不能用我们的证书对别人的 App 进行签名呢?理论上只要我们有了这个证书就能对这个 App 进行签名,那么我们就可以用我们的证书对其他 App 进行签名。

1、App的签名是由谁签的?

平常我们使用 Xcode 开发,我们基本上没有关注过这些,其实 App 的签名是由我们 Mac系统 里面的 CodeSign 工具完成的,只不过 Xcode 帮我们干了这些事情而已。

2、准备工作

首先我们需要一个砸过壳的 App ,砸过壳的 App 就是越狱应用,可以前往 PP助手 下载。 使用 otool -l WeChat | grep cry 可以查看是否砸过壳

localhost : ~/Documents/SecurityProducts/003-CodeSign应用重签名/ipa/微信-7.0.5(越狱应用)/Payload/WeChat.app : otool -l WeChat | grep cry
     cryptoff 16384
    cryptsize 100237312
      cryptid 0  

注意: cryptid

0代表未加密(也就是说砸过壳的)
1代表加密的

3、如何使用 CodeSign 进行重签名?

注意此方式安装的微信登录后会被封号

下方有详细流程截图。

步骤如下:

  • 需要一个砸过壳的 WeChat.ipa
  • 解压 WeChat.ipa
  • 找到 WeChat.app 拷贝到一个新建文件夹 WeChatCodeSign 下
  • 右键 显示包内容 删除无法签名的插件( PlugIns 和 Watch )
  • 终端输入 security find-identity -v -p codesigning 寻找证书,拷贝需要使用的 证书名称
  • 进入 WeChat.app/FrameWork 文件夹,然后对文件夹下面的所有 Framework 签名 ,终端进入当前目录,输入签名代码 codesign -fs "证书名称" xxx.framework
  • 新建一个 Xcode 项目 WeChatDemo ,并且运行到手机上一次
  • 在 WeChatDemo 中找到 WeChatDemo.app
  • 右键显示包内容,拷贝描述文件 embedded.mobileprovision 到 WeChatCodeSign 下,并且拷贝到 WeChat.app 中一份。
  • 在 WeChatDemo 中,新建一个 plist 文件 ent.plist (命名随意)
  • 终端输入 security cms -Di embedded.mobileprovision 打开 embedded.mobileprovision
  • 拷贝 embedded.mobileprovision 下 key 为 Entitlements 的 Value (签名信息)到 ent.plist
  • 拷贝 ent.plist 到 WeChatCodeSign 下
  • 进入 WeChat.app 下找到 info.plist 更改成 WeChatDemo 的 bundle id
  • 最后进入 WeChatCodeSign 目录下,对 App 包进行签名,终端输入 codesign -fs "证书名称" --no-strict --entitlements=ent.plist WeChat.app
  • Command + Shift + 2 安装

详细流程截图

下载好的越狱的 WeChat.ipa 包

我们下载好了这样一个 WeChat.ipa 包后,解压 ipa 包然后找到 WeChat.app 拷贝到一个新建文件夹 WeChatCodeSign 下

对 WeChat.app 右键 显示包内容 删除无法签名的插件( PlugIns 和 Watch )

终端输入 security find-identity -v -p codesigning 寻找证书,拷贝需要使用的 证书名称 ( "Apple Development: ZZZZZZ (ABENW7IAHK)" )

注意:这里有一个坑,如果你有多个同名证书,但是证书前面的编号不同,记得删除无用的证书,不然签名时候会报:签名时使用了模棱两可的证书。

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这有个iOS交流群:642363427,不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术!

终端输入 codesign -fs "证书名称" xxx.framework ,依次对 WeChat.app/FrameWork 下的 xxx.frameWork 签名

新建工程 WeChatDemo ,真机编辑或运行一次,找到 WeChatDemo.app 拷贝 embedded.mobileprovision 到 WeChatCodeSign 下,并且拷贝到WeChat.app中一份。

在 WeChatDemo 中,新建一个 plist 文件 ent.plist (命名随意)

终端输入 security cms -Di embedded.mobileprovision 打开 embedded.mobileprovision 并拷贝 embedded.mobileprovision 下 key 为 Entitlements 的 Value (签名信息)到 ent.plist

拷贝 ent.plist 到 WeChatCodeSign 下,然后进入 WeChat.app 下找到 info.plist 更改成 WeChatDemo 的 bundle id ,最后进入 WeChatCodeSign 目录下,终端输入 codesign -fs "证书名称" --no-strict --entitlements=ent.plist WeChat.app 对 App 包进行签名

Command + Shift + 2 安装 WeChat

4、使用 Xcode 进行重签名

使用 Xcode 重签名的方式其实和我们手动签名基本差不多,只是 Xcode 帮我们完成了将描述文件拷贝到 .app 包里,然后生成 ent.plist 和最后对 App 包的签名而已,下方的工作还是需要做的。

  • 上述同样的准备工作
  • 删除该删除的文件
  • 签名FrameWork包
  • 然后将 WeChat.app 覆盖我们新建工程的 .app 包
  • 运行就可以了

注意: 这有一个坑:使用 Xcode 重签名的时候,新建的功能一定要和 WeChat 同名,不然 Xcode 读取 WeChat 的 MacOView 文件时会因为找不到而不执行替换的包。

5、使用 Shell 进行重签名

使用 Shell ( 关于Shell )重签名也就是把上面繁琐的步骤写成一个脚本让 Xcode 去执行一步到位。

重签名脚本如下:

# ${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. 更新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. 重签名第三方 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

  

拷贝上述内容,打开终端输入 touch appShell.sh 新建一个 Shell 文件,再输入 vim appShell.sh 打开文件,按 i 后再粘贴内容,最后按 Esc 输入 :wq 保存并退出。

然后将我们的 appShell.sh 拷贝到我们刚才的 WeChatDemo 下,在 WeChatDemo 下新建 App 文件夹将 WeChat.ipa 放入。

在 WeChatDemo 下添加 New Run Script Phase

我们运行一下真机,咦,报错了,告诉我们运行 appShell.sh 权限不足

那我们使用终端 ls -l 看看权限

tancheng@localhost ~/Documents/SecurityProducts/003-CodeSign应用重签名/代码/WeChatDemo : ls -l
total 8
drwxr-xr-x     3      tancheng     staff        96          10 17 11:07        APP
drwxr-xr-x    13      tancheng     staff       416          10 19 10:21        WeChatDemo
drwxr-xr-x     5      tancheng     staff       160          10 19 10:50        WeChatDemo.xcodeproj
drwxr-xr-x     4      tancheng     staff       128          10 19 10:02        WeChatDemoTests
drwxr-xr-x     4      tancheng     staff       128          10 19 10:02        WeChatDemoUITests
-rw-r--r--     1      tancheng     staff      1979          10 19 10:40        appShell.sh
 

看明白了权限说明,搞清楚了改变权限的方法,我们终端试一下,

这样我们看到了权限已经更改了,我们再试试运行一下刚才的代码发现我们就成功的运行了 WeChat 。

以上就是iOS应用重签名的所有内容了。

posted @ 2020-10-28 14:31  iOS__峰公众号iOSVNL  阅读(474)  评论(0编辑  收藏  举报