IPA重签名

1.获取一份开发者配置文件和证书

使用iOS开发者账号:
如果你之前曾使用 Xcode 开发和部署过 iOS 应用,那么你已经拥有了一个代码签名证书。使用 security 工具可以列出你当前存在的签名标志。

查看证书

$ security find-identity -p codesigning -v
1) 4582557053E612C97323489465CE4234753B67A5 "iPhone Developer: KDKE (3F8H4H7J32)"
1) 4582557053E612C97322439E65CE4234753B67A5 "iPhone Developer: GESF (3F8H4H7J32)"
开发者配置文件

你可以在 Xcode 里面使用你的 Apple 账号获取这个配置 文件,只需简单的编译一个空的 iOS 工程,然后从 app 资源包里面提取出这个 embedded.mobileprovision 文件。也可以在开发者账号上创建一个新的AppID和Provisioning Profiles。

当你获取到这个配置文件后,你可以使用 security 这个工具来查看它的内容,根据需要修改BundlID跟APP里的plist文件一致。

$ security cms -D -i embedded.mobileprovision > profile.plist
$ /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' profile.plist > entitlements.plist
$ cat entitlements.plist




    application-identifier
    H8QY48C2J9.*
    com.apple.developer.team-identifier
    H8QY48C2J9
    get-task-allow
    
    keychain-access-groups
    
        H8QY48C2J9.*
    


2.准备其他工作

为了在我们的 app 启动的时候加载一个附加的库,我们需要插入一条额外的加载命令到主程序的 Mach-O 头中。这里我们使用optool 工具来自动化这个过程:

$ git clone https://github.com/alexzielenski/optool.git
$ cd optool/
$ git submodule update --init --recursive

我们也将使用到 ios-deploy 这个工具,这个 工具能够在不使用 Xcode 的情况下发布或者调试 iOS 。(npm 是 Nodejs 的包管理器,如果你还没有安装 Nodejs,你可以使用 homebrew 来安装,或者到官网直接下载安装包)

$ brew install Nodejs
$ npm install -g ios-deploy
3.检查依赖项

因为这个代码是我自己写的,所以我知道这个 dylib 除了 mobilesustrate 外没有依赖其它的库。但是如果我们拿到的是别人的 dylib,就需要先进行一下依赖项检查,以确保之后我们将所有的依赖库都打包进 ipa 当中。

使用 macOS 自带的 otool 工具就可以进行依赖项检查

$ otool -L WeChatRedEnvelop.dylib
/Library/MobileSubstrate/DynamicLibraries/WeChatRedEnvelop.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
    /System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1349.1.0)
    /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1348.0.0)
    /System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 3600.5.2)
    /usr/lib/libsubstrate.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.4.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)
WeChatRedEnvelop.dylib (architecture arm64):
    /Library/MobileSubstrate/DynamicLibraries/WeChatRedEnvelop.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
    /System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1349.1.0)
    /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1348.0.0)
    /System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 3600.5.2)
    /usr/lib/libsubstrate.dylib (compatibility version 0.0.0, current version 0.0.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.4.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)

可以看到除了 substrate 库,其它依赖的都是系统自带的库。我们将 libsubstrate.dylib 拷出,使用 install_name_tool 命令修改动态库的路径,指向 app 二进制文件的同级目录。

修改路径:

$ install_name_tool -change /usr/lib/libsubstrate.dylib @loader_path/libsubstrate.dylib WeChatRedEnvelop.dylib
如果你的系统中不是 /usr/lib/libsubstrate.dylib 而是
/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate 的话,
解决方法:
拷出来,改名成 libsubstrate.dylib,
然后在 -change 后面把 /usr/lib/libsubstrate.dylib 改成你的 
/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate。

换成

$ install_name_tool -change /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate @loader_path/libsubstrate.dylib WeChatRedEnvelop.dylib
4.开始签名

解压IPA包,把动态库、砸壳后的可执行文件、dylib的依赖库、embedded.mobileprovision配置文件复制到APP里。
并且使用 optool 工具将一条加载命令插入到 APP的二进制文件 Mach-O头中。

$ optool install -c load -p "@executable_path/FridaGadget.dylib" -t Payload/APP

修改BundlID,需要跟embedded.mobileprovision文件里一致。

$ /usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier sg.vantagepoint.repackage" Payload/APP/Info.plist

删除APP里原来的签名

$ rm -rf Payload/APP/_CodeSignature

签名文件包括dylib Framework Extension

$ /usr/bin/codesign --force --sign 4582557053E612C97322489E65CE4234753B67A3  Payload/APP/FridaGadget.dylib
$ /usr/bin/codesign --force --sign 8004380F331DCA22CC1B47FB1A805890AE41C938 --entitlements entitlements.plist Payload/APP/APP

安装

$ ios-deploy --bundle Payload/APP

你可能感兴趣的:(IPA重签名)