iOS应用逆向:Mach-O二进制分析与class-dump实战

一、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,持久化修改行为