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应用重签名的所有内容了。