一、iOS逆向概述
iOS逆向工程常用于:
- 安全研究与App安全审计
- 了解优秀App的实现思路
- CTF竞赛与安全学习
- 自有App的调试分析
二、iOS应用文件结构
MyApp.ipa └── Payload/ └── MyApp.app/ ├── MyApp # Mach-O可执行文件 ├── Info.plist # 应用配置 ├── Assets.car # 编译后的资源 └── Frameworks/ # 动态库
三、Mach-O文件格式分析
3.1 基本结构
Mach-O文件结构: ┌──────────────────┐ │ Mach-O Header │ ← 魔数、架构、文件类型 ├──────────────────┤ │ Load Commands │ ← 段/节布局、依赖库 ├──────────────────┤ │ __TEXT Segment │ ← 代码段(只读) │ (__text节) │ ├──────────────────┤ │ __DATA Segment │ ← 数据段(读写) ├──────────────────┤ │ __LINKEDIT │ ← 符号表、签名 └──────────────────┘
3.2 使用otool分析
# 查看文件架构 otool -hv MyApp # 列出所有Load Commands otool -l MyApp | grep -A4 LC_SEGMENT # 查看依赖库 otool -L MyApp # 反汇编__text节 otool -tv MyApp | head -50
3.3 使用nm查看符号表
# 列出所有符号 nm MyApp | grep " T " # 代码段符号 nm MyApp | grep " U " # 未定义(外部)符号 # 过滤Objective-C方法 nm MyApp | grep "_OBJC_CLASS_"
四、class-dump:提取头文件
4.1 安装与使用
# 安装class-dump brew install class-dump # 提取所有类头文件 class-dump -H MyApp -o ./headers/ # 提取特定架构 class-dump -a arm64 -H MyApp -o ./headers/
4.2 读懂头文件
// 提取出的头文件示例 @interface LoginViewController : UIViewController @property (nonatomic, strong) UITextField *usernameField; @property (nonatomic, strong) UITextField *passwordField; - (void)loginButtonTapped:(id)arg1; - (BOOL)validateCredentials:(NSString *)username password:(NSString *)password; - (void)showErrorAlert:(NSString *)message; @end
五、Hopper Disassembler静态分析
Hopper是macOS下最优秀的反汇编工具: 1. 打开Mach-O文件 2. 自动识别Objective-C/Swift方法 3. 可切换:汇编/伪代码(Pseudo-code)视图 4. 搜索字符串、方法名 5. 交叉引用分析(xref)
关键功能:
- Procedure Analysis:自动标注函数边界
- Pseudo-code生成:ARM汇编转C-like代码
- String搜索:快速定位硬编码字符串
- XREF(交叉引用):追踪某方法被哪里调用
六、Cycript:运行时注入
Cycript是越狱设备上的ObjC/JS混合REPL:
# 附加到进程 cycript -p SpringBoard # 常用命令 cy# UIApp # 获取UIApplication实例 cy# UIApp.keyWindow # 获取主窗口 cy# UIApp.keyWindow.recursiveDescription() # 打印视图层级 cy# choose(UIViewController) # 列出所有VC实例 # 调用方法 cy# var vc = choose(LoginViewController)[0] cy# [vc loginButtonTapped:nil]
七、Cydia Substrate动态Hook
// Tweak.xm(越狱插件格式)
%hook LoginViewController
- (BOOL)validateCredentials:(NSString *)username password:(NSString *)password {
NSLog(@"[MyTweak] username: %@, password: %@", username, password);
// 调用原始方法
BOOL result = %orig;
NSLog(@"[MyTweak] result: %d", result);
return result;
// 直接返回YES绕过验证(需自己负责)
// return YES;
}
%end八、总结
iOS逆向核心工具链:
1. class-dump:提取类头文件,了解API结构
2. Hopper:反汇编与伪代码,理解核心逻辑
3. Cycript:运行时REPL,快速探索对象状态
4. Cydia Substrate:编写Tweak,持久化修改行为