iOS 逆向之 iPA 重签名

重签名可以让开发者在逆向的学习中必备技能,本文将从基础命令的使用,阐述怎么来做重签名

一、重签名准备工作:

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 文件,对可执行文件进行重签名

/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

猜你喜欢

转载自blog.csdn.net/forwardto9/article/details/81354526