×

iOS App的Patching和Resigning

96
Mad_Mark
2017.06.19 21:35* 字数 725

本实验主要针对修改后的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:

  1. 打开Xcode,创建一个SimpleViewApp
  2. 运行环境选中你的设备,运行一次
  3. 选中左边导航栏Products中的app
  4. 点击最右面板中,Full Path右下角的箭头,定位到app所在的目录
  5. 右击app选择“显示包内容”,即可看到embedded.mobileprovision
xcode-provisionpath.png

接下来,在命令行中使用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

结果如图:

entitlements.png

二、修改二进制文件

下载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。

copyfiles.png

好,接下来使用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和执行文件进行重签:

resigning.png

这里有一点需要注意,这两个文件的重签命令是不一样的,执行文件重签时需要额外包含权限文件entitlements.plist。
还有一点,记得先砸壳先砸壳先砸壳,否则会在最后deploy app时出错。

最后,使用ios-deploy工具重新构建和安装app,完成后会自动lldb attach。

deploy.png

OK,修改过的app已经安装到你手机上,并且可以调试啦~~~

iOS 技术总结分享
Web note ad 1