iOS App的Patching和Resigning

本实验主要针对修改后的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已经安装到你手机上,并且可以调试啦~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 笔者接触打包已经一段时间了,但一直对签名都是似懂非懂,最近从加密数论知识起回看这部分知识,感觉还是有很多不懂的地方...
    luonaerduo阅读 1,245评论 0 3
  • 项目需求 批量打上百个应用,项目的代码没有变动,应用有不同的icon,启动图,bundleID,第三方账号,和其他...
    奋斗的蜗牛阅读 3,928评论 4 10
  • 1. 应用签名 应用签名原理回顾 上一篇博客“IOS 逆向开发(三)应用签名”中详细讲解了IOS 应用签名,证书的...
    孔雨露阅读 2,532评论 0 4
  • iOS签名原理 在iOS真机调试和发布上线的时候,我们可能已经习惯了配置各种证书、描述文件,等这一繁琐的步骤。但是...
    进击的阿牛哥阅读 5,279评论 2 22
  • 声明:此文章仅是学术探讨类文章,仅仅用于学习研究,也请读者不要用于商业或其他非法途径上,否则一律与笔者无关。 Ap...
    黑夜梦阅读 1,612评论 0 2