本实验主要针对修改后的app,进行重新打包和重签名,并最终能运行在自己的手机上。
工具:
Xcode 获取自己的embedded.mobileprovision
optool 用来添加Mach-O二进制文件的load commands
ios-deploy 脱离Xcode在手机上构建和调试iOS应用
codesign 重签名工具
FridaGadget.dylib 用来修改app,在Mach-O文件的load command中注入这个动态库的链接。注入后能够通过frida来调试和分析。
基本概念
重签名的过程中涉及到两个很重要的文件:
provisioning profile:一个plist格式的配置文件,可以将你的代码签名证书,也就是code signing certificate加入白名单。其中还包括你app被授予的权限。
code signing certificate:包含你实际用来签名的私钥。
一、获取证书
如果你跟我一样不是付费开发者,你也可以通过另一种方式来获取provisioning pofile:
- 打开Xcode,创建一个SimpleViewApp
- 运行环境选中你的设备,运行一次
- 选中左边导航栏Products中的app
- 点击最右面板中,Full Path右下角的箭头,定位到app所在的目录
- 右击app选择“显示包内容”,即可看到embedded.mobileprovision
接下来,在命令行中使用security查看并提取这个配置文件的内容到一个profile.plist文件:
security cms -D -i embedded.mobileprovision
执行这条命令,你就可以看到一个profile.plist文件,接下来生成entitlements.plist:
$ /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' profile.plist > entitlements.plist
$ cat entitlements.plist
结果如图:
二、修改二进制文件
下载FridaGadget并拷贝到你要重签名的app目录下
$ curl -O https://build.frida.re/frida/ios/lib/FridaGadget.dylib**
并将你的embedded.mobileprovision文件也拷贝到app目录下。
然后使用PlistBuddy,将entitlements.plist文件中的BundleID来替换掉app中Info.plist文件中的BundleID。因为codesign签名时会验证这个BundleID。
好,接下来使用optool来添加load command到app的Mach-O二进制文件中。
$ optool install -c load -p "@executable_path/FridaGadget.dylib" -t Payload/UnCrackable\ Level\ 1.app/UnCrackable\ Level\ 1
Found FAT Header
Found thin header...
Found thin header...
Inserting a LC_LOAD_DYLIB command for architecture: arm
Successfully inserted a LC_LOAD_DYLIB command for arm
Inserting a LC_LOAD_DYLIB command for architecture: arm64
Successfully inserted a LC_LOAD_DYLIB command for arm64
Writing executable to Payload/UnCrackable Level 1.app/UnCrackable Level 1..
三、重签名并重新部署应用
至此,准备工作全部完成了,接下来就是重签名了。但是,先要移除app中原来的代码签名文件。
$ rm -rf Payload/UnCrackable\ Level\ 1.app/_CodeSignature
然后,用security获取你的签名标示符,并对FridaGadget.dylib和执行文件进行重签:
这里有一点需要注意,这两个文件的重签命令是不一样的,执行文件重签时需要额外包含权限文件entitlements.plist。
还有一点,记得先砸壳先砸壳先砸壳,否则会在最后deploy app时出错。
最后,使用ios-deploy工具重新构建和安装app,完成后会自动lldb attach。
OK,修改过的app已经安装到你手机上,并且可以调试啦~~~