重签名可以让开发者在逆向的学习中必备技能,本文将从基础命令的使用,阐述怎么来做重签名
一、重签名准备工作:
1.准备签名证书(开发者)和配置文件
列出本地Keychain中可以用于签名的identifier(签名证书),使用下面的命令:
security find-identity -p codesigning -v
2.沙箱化(enable App Sandbox)
使用要选择签名证书对应的 mobileprovision 文件生成 entitlements.plist 文件,使用如下命令:
security cms -D -i XX.mobileprovision > profile.plist
/usr/libexec/PlistBuddy -x -c 'Print :Entitlements' profile.plist > entitlements.plist
// 查看其中声明的权限信息
cat entitlements.plist
3.签名文件替换
把上一步中的文件XX.mobileprovision
复制到XX.app文件夹下:
cp XX.mobileprovision Payload/XX.app/embedded.mobileprovision
4.修改BundleID
修改XX.app文件夹下Info.plist中的Bundle Identifier,使其与XX.mobileprovision
文件中的Bundle Identifier保持一致,其要求与开发调试时对配置文件的要求一致(唯一identifier,通配identifier)
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.XX.XX" Payload/XX.app/Info.plist
如果需要修改重签名后的App名称,则使用命令:
/usr/libexec/PlistBuddy -c "Set : CFBundleName NewName" Payload/XX.app/Info.plist
5.删除原先的签名文件
rm -rf Payload/XX.app/_CodeSignature
二、Resign
1. Resign Framework
这一步必须先进行,对App包中的嵌入的 Framework 进行重签名
在Payload/xx.app/Frameworks文件下可以看到嵌入的framework
其中 identity 则是 (一)中第 1 步中查到的签名的标识串 和 第 2 步 生成的entitlement 文件
/usr/bin/codesign --force --sign identity --entitlements entitlements.plist /Payload/XX.app/Frameworks/xx.framework
// Ex
/usr/bin/codesign --force --sign 84A4B9F1F902462CC33D01E9FF72C1BA04A97653 --entitlements entitlements.plist /Payload/XX.app/Frameworks/xx.framework
2. Resign Mach-o
待上一步完全执行之后,使用相同的 identity 和 entitlement 文件,对可执行文件进行重签名
![](/qrcode.jpg)
/usr/bin/codesign --force --sign identity --entitlements entitlements.plist Payload/XX.app/XX
3. Check Resign info
检查签名信息是不是符合要求,即自有的证书、bundle identifier、配置信息等
codesign -vv -d Payload/XX.app
注意:重签名有顺序,先把framework和dylib签名,最后再签名:xx.app文件下的可执行文件,顺序弄错了,就算签名成功也可能会安装失败!
三、Install & Debug
1. Install ios-deploy
使用homebrew安装必要的自动化工具 ios-deploy
brew search ios-deploy
brew install ios-deploy
2. Install App to Device
ios-deploy -b Payload/XX.app
如果需要安装并启动lldb进行调试,可以使用以下命令:
ios-deploy -d -b Payload/XX.app
过程中如果遇到错误提示:“AMDeviceSecureInstallApplication(0, device, url, options, install_callback, 0)”
错误原因:可能存在有framework或者dylib未签名的情况
解决方案:把app文件夹下面的framework全部签名
四、References
1. 重签名自动化工具
基础版:iReSign
升级版:ios-app-signer
2. 关于签名的原理
请参照Apple官方文档:Code Signing Guide