什么是逆向工程
逆向工程(又称逆向技术),是一种产品设计技术再现过程,即对一项目标产品进行逆向分析及研究,从而演绎并得出该产品的处理流程、组织结构、功能特性及技术规格等设计要素,以制作出功能相近,但又不完全一样的产品。 –来自百度百科。
必备知识:
分析思路
界面分析 -> 动态分析 -> 静态分析 -> 动态库注入 -> …
界面分析:
在Mac上面也有类似iOS Reveal的工具叫做Interface Inspector。
动态分析:
动态跟踪的方法有多种,除了iOS逆向中使用的Frida, lldb , Mac上面还可以使用Dtrace。
通过执行了一些操作去分析问题。静态分析:
根据假设的某个条件(因素)静止不变去分析。
动态库注入:
动态库注入可以通过DYLD_INSERT_LIBRARIES注入,也可以直接注入到可执行文件的Load Command。
–
界面分析之-Interface Inspector:
这个工具跟iOS Reveal类似,可以分析当前页面元素等。

Interface Inspector通过这个工具 可以得知当前页面的ClassName,控件以及布局方式。
作用:
控件:得知控件的显示后,方便以后修改UI或插入UI等。
通过ClassName 可以hook住当前VC 里面的方法,从而通过调用方法来修改某个控件或者执行想要的操作。
注意:使用这个工具时,需要Rootless,关闭内核的保护。
–
动态分析:动态跟踪
动态跟踪的方法有多种,除了iOS逆向中使用的Frida, lldb , Mac上面可以使用Dtrace。
Dtrace:
可以通过它来监控应用程序或者内核的调用,所以这里可以用于监控OC函数的调用。
动态库注入:
Xcode 新建dylib项目
找到了函数之后,可以写个动态库注入为了方便调试以及动态库注入这里创建一个dylib的Xcode项目,选择macOS Library,点击创建,Type选择Dynamic。
为了Hook函数,先选择一个现成的库来做,可以选择:
- ZKSwizzle
- Aspects
- substitute
- ……
我们拿GitHUB星数最多Aspects 第三方去在SoureTree 应用添加按钮。效果如下:

–
程序重新签名打包:
方式一:
通过optool命令:
语法:
optool install -c load -p 动态库路径 -t 主程序路径
实例:
optool install -c load -p /Users/lvmam/Desktop/op/libinvoke.dylib -t /Applications/ SourceTree.app/Contents/MacOS/SourceTree
方式二:
通过第三方封装好的框架打包。
见:
1、安装:https://github.com/AloneMonkey/MonkeyDev/wiki/安装
2、项目搭建:https://github.com/AloneMonkey/MonkeyDev/wiki/Mac应用插件
打包成dmg文件见打包dmg文件
–
反编译工具:
Hopper
Hopper 是一种适用于 OS X 和 Linux 的逆向工程工具,可以用于反汇编、反编译和调试 32位/64位英特尔 处理器的 Mac、Linux、Windows 和 iOS 可执行程序!IDADataRescue IDA Pro Disassembler and Debugger 是目前最棒的一个静态反编译软件,为众多0day世界的成员和ShellCode安全分析人士不可缺少的利器!IDA Pro Disassembler and Debugger是一款交互式的,可编程的,可扩展的,多处理器的,交叉Windows或Linux WinCE MacOS平台主机来分析程序, 被公认为最好的花钱可以买到的逆向工程利器。IDA Pro已经成为事实上的分析敌意代码的标准并让其自身迅速成为攻击研究领域的重要工具。它支持数十种CPU指令集其中包括Intel x86,x64,MIPS,PowerPC,ARM,Z80,68000k,c8051等等。它的优点是可以更好的反汇编和更有深层分析。可以快速到达指定的代码位置;可以看到跳到指定的位置的jmp的命令位置;可以看参考字符串;可以保存静态汇编等。
–
Hopper使用:
1、鼠标右键XX应用,点击进入显示包内容,然后进入Content文件夹——>MacOS文件夹
2、找到exec格式文件拖入到Hopper
如下图所示:

在Labels选项卡中一般呈现的是应用用到的Class
在Strings选项卡中一般呈现的是方法(函数)
编辑某个指令并生效:
- 在Labels选项下,选择某个类方法
- 选择Modify菜单->assemable Instruction
- 在弹出的框中输入要修改的值
- 选择File菜单->Produce New Execuable 保存修改的指令
- 替换Content文件夹——>MacOS文件夹原来的exec文件即可。
–