工具
-
IDA pro
这个就不解释了,至于为什么不用Hopper,后面会看到需要IDA来执行python脚本,给函数绑定符号 -
ida pro的牛逼插件keypatch
用于修改汇编代码 https://github.com/keystone-engine/keypatch -
Il2CppDumper
Unity转换成IL2CPP的符号表提取工具,但是只能在Windows运行。 https://github.com/Perfare/Il2CppDumper/releases -
越狱手机
用于砸壳
过程
-
使用 ida 分析
将脱壳的unix可执行文件拖入 ida 中;(等ida分析完成之后会发现得到的函数名都是形如sub_xxxx,只表示了该函数的静态地址偏移,并没有带来功能方面的任何信息因为基于Unity的iOS二进制文件不同于基于Objc-C下的,其符号表是另外加载。扩展一点说就是Unity在生成iOS二进制的时候,将开发者编写的C#代码编译成Cpp代码,成为IL2CPP。) -
取得 IL2CPP 的符号表
在解压ipa得到的app包中可以得到IL2CPP的符号表,在xxx.app/Data/Managed/Metadata目录下的global-metadata.dat文件。 -
获取 Unity 的语言的版本号
先去Unity官网看一下有哪些版本,从2019.2开始往前推,最后猜到正确的版本号是2018.4 -
使用Il2CppDumper提取符号表
在 windows 中打开Il2CppDumper.exe 需要提供两个文件,将脱壳的unix可执行文件,及其IL2CPP的符号表即global-metadata.dat文件,然后输入Unity的版本2018.4。然后选择使用的模式,官方推荐是3.Auto(Plus),最后得到了两个输出文件script.py和dump.cs。 - 其中script.py可以用于ida,对IL2CPP表中的无名函数进行标记成形成类名$$函数名,****就有头绪了。另一个文件dump.cs是提取的方便阅读的符号表,可以使用任意文本编辑器打开,就像阅读源码的头文件一样。
- 在IDA中选择File - Script file…选择刚才获取的script.py对函数进行命名,完成之后可以看到真的是耳目一新,瞬间清醒如上数学课被点名回答问题一样。
动态调试
- 在 IDA中选择 Remote iOS debugger
-
设置符号路径
将符号路径复制到 IDA的符号路径下 (Xcode将把符号存储在:~/Library/Developer/Xcode/iOS DeviceSupport/11.4.1 (15G77)/Symbols 中, 在IDA中,将此路径复制到Debugger>Debugger options>Set specific options中的“符号路径”) -
获取应用程序可执行文件的路径
为了让IDA调试这个应用程序,它必须知道应用程序可执行文件的路径。 但是,iOS往往隐藏这些关于文件系统的细节,据我们所知,没有办法正式 请问Xcode究竟在哪里安装了你的设备上的应用程序。所以,我们使用以下解决方法:在AppDelegate.m,并在函didFinishLaunchingWithOptions中插入以下行NSLog ( @“app安装路径:%@” ,[[ NSBundle mainBundle ] executablePath ]);这将确保安装路径将在应用程序运行时在Xcode控制台中打印。现在点击Xcode窗口左上角的大播放按钮。 这将构建,安装和在目标设备上启动应用程序。 一旦你看到该应用程序已经启动和应用程序路径已经打印到控制台,请按左上方的“停止”按钮。 -
启动调试器
现在是时候在IDA中打开我们的示例应用程序。 在Xcode窗口的左边,在Project Navigator选项卡,点击Products文件夹下的demo.app. 然后,在“实用程序”选项卡下的Xcode窗口的右侧,可以找到新的路径建立应用程序包。 使用此路径在IDA中打开应用程序的可执行文件: -
设置可执行文件的路径
Debugger> Process options …菜单,并在’Application’和’Input File’字段中使用应用程序可执行文件的路径 -
开始调试
点击 Start process