方式1:Codesign重签名
在iOS中,Xcode为我们提供了签名工具,即codesign
,通过一些命令即可完成重签名,如下所示
$
security find-identity -v -p codesigning
: 列出钥匙串里可签名的证书$
Codesign –fs
“证书串” 文件名 :强制替换签名$
Chmod +x
可执行文件 : 给文件添加权限$
security cms -D -i ../embedded.mobileprovision
:查看描述文件$
codesign -fs
“证书串” --no-strict --entitlements=权限文件.plist APP包$
Zip –ry
输出文件 输入文件 将输入文件压缩为输出文件
如何获取越狱手机的ipa包
1、建立链接:
sh usbConnect.sh
2、连接手机:
sh usbX.sh
3、查看进程:
ps -A
4、筛选进程,找到微信进程:
ps -A | grep WeChat
5、拷贝:
scp -r -P 12345 root@localhost:路径 ./
6、查看拷贝的app包:
cd WeChat.app
7、查看可执行文件:
otool -l WeChat | grep crypt
(此时的cryptid 是 1,表示加密过的)8、查看app的权限:
codesign -vv -d WeChat.app
(有签名权限)
准备工作
-
1、准备一个微信的越狱包,这里准备的是通过
MyZip
解压微信-7.0.8.ipa
-
其中的
WeChat.app
包含两个东西:app + app签名信息
-
-
2、查看app包的签名信息(CMD+G):
codesign -vv -d WeChat.app
3、查看钥匙串的证书:
security find-identity -v -p codesigning
4、查看可执行文件详细信息:
otool -l WeChat > ~/Desktop/123.txt
。其中有cryptid
加密id(0表示没有使用加密算法)
codesign重签名步骤
给应用重签名的步骤如下:
1、删除插件和带有插件的.app包(例如Watch、plugins)
2、对
Frameworks
里面的库进行重签名
3、给可执行文件
+x(可执行)权限
4、新建一个空工程
5、添加描述文件(4中的空工程通过真机编译得到,且要运行,因为需要将描述文件安装到手机)
6、替换.app包中
BundleID
(.app包中info.plist文件的BundleID要和描述文件中的BundleID保持一致)-
7、通过授权文件(Entilements)重签.app包、
1)查看描述文件:
$security cms -D -i embedded.mobileprovision
2)将描述文件中Entilements 拷贝出来,生成plist文件。(文件名称
entitlements.plist
)3)用权限文件签名APP包:
$ codesign -fs "Apple Development: XX(XX)" --no-strict --entitlements=entitlements.plist WeChat.app
8、最后通过Xcode安装
注:mach-o最重要的两块:
代码块 + 数据块
,其中加密主要是加密代码
codesign重签名演示
-
前提:
需要签名:wechat可执行文件(即
Mach-O文件
) +Frameworks
需要删除:
Plugins
(免费普通账户无法签名,可以删除) +Watch
(也无法签名,删除)
-
1、查看Frameworks,也是有签名信息的:
codesign -vv -d andromeda.framework
2、重签名Frameworks:
codesign -fs "Apple Development: 916770982@qq.com (565XXC9ZYA)" andromeda.framework
➜ Frameworks codesign -fs "Apple Development: 916770982@qq.com (565XXC9ZYA)" andromeda.framework
andromeda.framework: replacing existing signature
➜ Frameworks codesign -fs "Apple Development: 916770982@qq.com (565XXC9ZYA)" mars.framework
mars.framework: replacing existing signature
➜ Frameworks codesign -fs "Apple Development: 916770982@qq.com (565XXC9ZYA)" marsbridgenetwork.framework
marsbridgenetwork.framework: replacing existing signature
➜ Frameworks codesign -fs "Apple Development: 916770982@qq.com (565XXC9ZYA)" matrixreport.framework
matrixreport.framework: replacing existing signature
➜ Frameworks codesign -fs "Apple Development: 916770982@qq.com (565XXC9ZYA)" OpenSSL.framework
OpenSSL.framework: replacing existing signature
➜ Frameworks codesign -fs "Apple Development: 916770982@qq.com (565XXC9ZYA)" ProtobufLite.framework
ProtobufLite.framework: replacing existing signature
然后执行退出 cd ..
- 3、查看可执行文件:
ls -l WeChat
ls -l WeChat
-rwxr-xr-x@ 1 xxx staff 126048560 10 16 2019 WeChat
注:重签名必须要有可执行权限,即
- x
4、新建一个工程,运行 ,进入得到的包中,获取
Apple Development: 916770982@qq.com (565XXC9ZYA)
对应的描述文件 ,例如xxx xxx(Personal Team)
获取可执行文件中的描述文件,拷贝至WeChat包
5、描述文件和BundleID有关系,需要修改WeChat的BundleID
com.tencent.xin
为xxx.com.test
-
6、查看描述文件的权限:
security cms -D -i embedded.mobileprovision
查看
Entitlements
(权限),是一个plist文件将其拷贝至一个plist文件(名称为
entitlements
,需要新建)(路径:propertyList - open sourceCode - 拷贝 <dict></dict>)将其拷贝至payload文件夹中
7、签名app(即mach-o签名):
codesign -fs "Apple Development: xxxxxxxxx@qq.com (565XXC9ZYA)" --no-strict --entitlements=Entitlements.plist WeChat.app
8、查看WeChat签名:
codesign -vv -d WeChat.app
, 此时签名信息已经替换
➜ Payload codesign -vv -d WeChat.app
Executable=/Users/jiangshicheng/Desktop/逻辑进阶IOS/逆向/010--应用重签名原理/资料/微信-7.0.8/Payload/WeChat.app/WeChat
Identifier=com.jsc.weChatDemo
Format=app bundle with Mach-O thin (arm64)
CodeDirectory v=20400 size=972598 flags=0x0(none) hashes=30383+7 location=embedded
Signature size=4819
Authority=Apple Development: 916770982@qq.com (565XXC9ZYA)
Authority=Apple Worldwide Developer Relations Certification Authority
Authority=Apple Root CA
Signed Time=Jun 2, 2021 at 2:36:45 PM
Info.plist entries=68
TeamIdentifier=99EJLR3Y3N
Sealed Resources version=2 rules=10 files=1470
Internal requirements count=1 size=184
-
9、安装
10、调试:Debug - Attach to process - WeChat
Codesign重签名缺点:过程太繁琐
方式2:Xcode重签名
下面我们通过Xcode来进行重签名,步骤如下:
1、删除Plugins、Watch
2、重签名Frameworks
3、创建并运行一个空工程
4、修改
Info.plist
中的BundleID改为空工程的BundleID
5、利用修改后的app包,替换空工程的app包
6、直接运行
与CodeSign重签名相比:少了其中的3(执行文件权限)、5(添加描述文件)、7(通过授权文件重签.app包)
xcode重签名演示
-
1、将product中的WeChat替换成 需要我们之前重签名的WeChat
2、CMD+R再次运行
方式3:Shell脚本
shell重签名演示
准备工作
首先跑一遍空项目获得签名信息
- 项目中配置shell:
Build Phase -> + Run Script
,会在编译时执行
-
./
表示工程目录 -
SRCROOT
(环境变量)-- 根目录
-
shell重签名演示
1、根目录下创建shell文件:
touch 123.sh
2、添加执行权限:
chmod +x 123.sh
3、Run Script 中直接执行 123.sh :
./123.sh
其中123.sh中的重签名脚本如下所示,主要有以下几步:
1、解压
IPA
到Temp
下2、将解压出来的.app拷贝进入工程下
3、
删除extension
和WatchAPP
,因为个人证书没法签名Extention4、
更新
info.plist文件CFBundleIdentifier
5、给
Mach-O
文件上执行权限
6、重签名第三方
FrameWorks
7、替换签名
# ${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" "目标文件路径"
# PlistBuddy工具修改info.plist文件中的BundleID为工程的BundleID
/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
#签名
#--force --sign 替换签名
# EXPANDED_CODE_SIGN_IDENTITY 当前工程的证书
/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
done
fi