-
-
iOS逆向工程常用工具完全指南(2026最新版)
-
发表于: 12小时前 253
-
iOS逆向工程常用工具完全指南(2026最新版)
本文旨在为安全研究人员和开发者提供iOS逆向工程的技术学习资料,请遵守相关法律法规,仅用于合法授权的安全测试和学习研究。
前言
iOS逆向工程是移动安全领域的重要研究方向,涉及应用安全分析、漏洞挖掘、恶意软件检测等多个方面。本文将系统介绍iOS逆向工程中常用的工具链,并提供详细的使用指南,帮助初学者快速入门。
一、环境准备
1.1 硬件要求
- 开发机:macOS系统(推荐macOS 13+)
- 测试设备:iOS设备(建议使用备用机)
- 数据线:原装或MFi认证的Lightning/USB-C线缆
1.2 软件基础
- Xcode 15+(包含iOS SDK和命令行工具)
- Homebrew(macOS包管理器)
- Python 3.8+
- Node.js 16+
1.3 法律与道德提醒
⚠️ 重要提醒:
- 逆向工程仅限学习研究、安全评估或授权测试
- 不得用于破解、盗版或侵犯他人知识产权
- 在测试前务必获得应用所有者的书面授权
- 尊重开发者劳动成果,遵守软件许可协议
二、静态分析工具
2.1 class-dump - 类信息提取
简介:从Mach-O文件中提取Objective-C类、协议和方法的头文件。
安装:
brew install class-dump
基本用法:
# 提取单一文件
class-dump /path/to/AppName.app/AppName
# 输出到头文件目录
class-dump -H /path/to/AppName.app/AppName -o ./headers/
# 显示更多信息
class-dump -I -H /path/to/AppName.app/AppName -o ./headers/
常用参数:
-H:生成头文件-o <dir>:指定输出目录-I:显示继承信息-r:递归处理
示例输出:
@interface ViewController : UIViewController
@property (nonatomic, strong) UILabel *titleLabel;
- (void)updateUI;
+ (instancetype)sharedInstance;
@end
2.2 Hopper Disassembler - 交互式反汇编
简介:功能强大的交互式反汇编器,支持ARM64架构,界面友好。
安装:
- 官网下载:d6dK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2Z5L8%4m8H3k6i4u0S2M7s2m8Q4x3X3g2U0L8$3#2Q4x3V1j5`.
- 申请免费试用或购买许可证
基本操作:
- 文件加载:直接拖拽IPA或Mach-O文件到Hopper
- 导航:
- 使用左侧符号列表定位类和方法
- 按
Cmd+K进入方法实现 - 按
Cmd+G跳转到指定地址
- 分析:
- 按
Cmd+A重新分析函数 - 使用
Pseudo-code模式查看伪代码 - 按
Tab在汇编和伪代码间切换
- 按
实用功能:
- 重命名:双击符号重命名,提高可读性
- 注释:选中代码行按
:添加注释 - 流程图:按
Ctrl+Shift+C查看控制流程图 - 字符串查找:
Cmd+Shift+S查找字符串引用
2.3 IDA Pro - 专业逆向分析平台
简介:业界标准的逆向工程工具,功能全面但价格昂贵。
安装:
- 访问Hex-Rays官网购买许可证
- 下载并安装对应版本
核心功能:
- 多架构支持:ARM, ARM64, x86, x64等
- 脚本支持:Python和IDC脚本扩展
- 插件系统:丰富的第三方插件
- 协作分析:支持团队协作项目
基础工作流:
# IDAPython脚本示例 - 查找加密函数
import idc
import idautils
def find_encryption_functions():
for func in idautils.Functions():
func_name = idc.get_func_name(func)
if any(keyword in func_name.lower() for keyword in ['encrypt', 'decrypt', 'aes', 'rsa']):
print(f"Found: {func_name} at 0x{func:X}")
2.4 Ghidra - 开源逆向框架
简介:NSA开源的免费逆向工具,功能强大。
安装:
# 通过Homebrew安装
brew install --cask ghidra
# 或从官网下载
# 85aK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6z5j5i4c8A6L8$3&6S2L8q4y4W2j5%4g2J5K9i4c8&6b7h3N6W2L8X3y4&6i4K6u0r3k6$3S2A6k6s2u0S2i4K6u0r3M7X3g2D9k6h3q4K6k6i4x3`.
基本使用:
- 创建项目:File → New Project
- 导入文件:拖拽或File → Import File
- 分析:点击"Analyze"按钮开始自动分析
- 查看代码:双击函数进入反汇编视图
优势:
- 完全免费开源
- 支持脚本和插件开发
- 社区活跃,更新频繁
三、动态分析工具
3.1 Frida - 动态插桩框架
简介:功能强大的动态插桩工具,支持JavaScript脚本注入。
安装:
# 安装Frida工具包
pip install frida-tools
# 查看设备连接
frida-ps -U
# 安装iOS端
# 在Cydia中添加源:f3fK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1N6h3W2D9k6q4)9J5k6h3k6J5K9h3c8S2i4K6u0W2M7X3f1`.
# 搜索安装Frida
基本脚本示例:
// 基础Hook脚本
Java.perform(function() {
// Hook Objective-C类
var className = "ViewController";
var methodName = "- viewDidLoad";
var targetClass = ObjC.classes[className];
if (targetClass) {
Interceptor.attach(targetClass[methodName].implementation, {
onEnter: function(args) {
console.log("[+] " + className + " " + methodName + " called");
console.log(" self: " + args[0]);
},
onLeave: function(retval) {
console.log(" returned: " + retval);
}
});
}
});
常用命令:
# 附加到运行中的应用
frida -U -f com.example.app
# 注入脚本
frida -U -f com.example.app -l script.js
# 列出进程
frida-ps -Uai
# 端口转发(用于非越狱设备)
iproxy 2222 22 # USB到TCP转发
3.2 Cycript - 运行时脚本环境
简介:在运行时操作Objective-C的脚本环境,语法类似JavaScript。
安装(越狱设备):
# 在Cydia中添加源:406K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3y4&6k6r3W2S2i4K6u0W2M7$3q4#2M7X3W2C8i4K6u0W2j5$3!0E0
# 搜索安装Cycript
基本用法:
// 连接到进程
cycript -p SpringBoard
// 获取当前应用
var app = [UIApplication sharedApplication]
// 获取keyWindow
var keyWindow = app.keyWindow
// 递归打印视图层次
function printViewHierarchy(view, depth) {
var indent = "";
for (var i = 0; i < depth; i++) indent += " ";
console.log(indent + view.toString());
var subviews = view.subviews;
for (var i = 0; i < subviews.count; i++) {
printViewHierarchy(subviews.objectAtIndex(i), depth + 1);
}
}
printViewHierarchy(keyWindow, 0);
3.3 MonkeyDev - 非越狱调试框架
简介:在非越狱设备上调试和Hook应用的集成环境。
安装:
# 使用安装脚本
sudo /bin/sh -c "$(curl -fsSL a05K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6J5j5i4N6Q4x3X3g2Y4K9i4c8Z5N6h3u0#2M7$3g2J5j5$3!0F1N6r3g2F1N6q4)9J5k6h3y4G2L8g2)9J5c8V1q4D9L8$3&6W2e0h3!0F1K9$3g2&6i4K6u0r3e0h3!0F1K9$3g2&6c8r3g2$3i4K6u0r3L8h3q4K6N6r3g2J5i4K6u0r3j5X3W2F1i4K6u0r3L8h3c8Q4x3X3c8A6L8Y4y4@1j5h3I4D9i4K6t1&6"
项目创建:
- Xcode → File → New → Project
- 选择"MonkeyDev"模板
- 配置Bundle ID和目标应用
Hook示例:
#import <CaptainHook/CaptainHook.h>
CHDeclareClass(ViewController);
CHMethod0(void, ViewController, viewDidLoad) {
CHSuper0(ViewController, viewDidLoad);
// 修改界面
self.titleLabel.text = @"Hooked!";
self.titleLabel.textColor = [UIColor redColor];
NSLog(@"[MonkeyDev] ViewController viewDidLoad hooked");
}
CHConstructor {
CHLoadLateClass(ViewController);
CHHook0(ViewController, viewDidLoad);
}
四、调试与脱壳工具
4.1 LLDB + debugserver - 调试套件
配置debugserver:
# 从设备提取debugserver
scp root@iOS-IP:/Developer/usr/bin/debugserver ~/
# 给debugserver添加权限(在macOS上)
/usr/bin/codesign --force --sign - --entitlements entitlements.plist debugserver
# entitlements.plist内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "634K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3q4H3M7r3I4W2i4K6u0W2j5$3!0E0i4K6u0r3c8q4c8p5M7#2)9J5c8W2m8J5L8%4m8W2M7Y4c8&6e0r3W2K6N6q4)9J5k6o6q4Q4x3X3f1H3i4K6u0W2k6s2c8V1">
<plist version="1.0">
<dict>
<key>com.apple.springboard.debugapplications</key>
<true/>
<key>run-unsigned-code</key>
<true/>
<key>get-task-allow</key>
<true/>
<key>task_for_pid-allow</key>
<true/>
</dict>
</plist>
LLDB常用命令:
# 连接设备
process connect connect://iOS-IP:2222
# 附加进程
process attach -n AppName
# 断点管理
breakpoint set -n "[ViewController viewDidLoad]"
breakpoint set -a 0x100012345
breakpoint list
breakpoint delete 1
# 内存操作
memory read -c 100 0x100012345
memory write 0x100012345 0x41
# 寄存器操作
register read
register write x0 0x0
# 继续执行
continue
step
next
4.2 frida-ios-dump - 内存脱壳工具
安装:
git clone 3ebK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6m8L8r3!0F1k6f1#2G2L8X3E0W2P5g2)9J5c8X3k6J5K9h3c8S2i4K6u0V1K9h3!0K6i4K6u0V1k6s2g2E0M7l9`.`.
cd frida-ios-dump
pip install -r requirements.txt
# 配置USB端口转发
iproxy 2222 22
使用步骤:
- 准备环境:
# SSH到设备
ssh -p 2222 root@127.0.0.1
# 启动Frida服务(如果未运行)
frida-server
- 执行脱壳:
# 查看应用列表
python dump.py -l
# 脱壳指定应用
python dump.py com.example.app
# 指定输出名称
python dump.py -o DecryptedApp.ipa com.example.app
工作原理:
- 通过Frida注入脚本到目标进程
- 定位内存中的Mach-O镜像
- 遍历Load Commands找到加密段
- 在内存中解密并重建IPA文件
4.3 clutch - 经典脱壳工具
安装(越狱设备):
# 添加源:20eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2M7s2c8Q4x3X3g2@1K9r3g2T1K9h3N6T1L8%4y4K6i4K6u0W2L8%4u0Y4i4K6u0r3M7X3g2H3L8$3k6A6L8r3g2K6i4K6u0r3j5%4W2V1K9h3p5`.
# 搜索安装Clutch
使用:
# 列出可脱壳应用
Clutch -i
# 脱壳应用(使用序号)
Clutch -d 1
# 脱壳应用(使用Bundle ID)
Clutch -d com.example.app
# 批量脱壳
Clutch -b
注意事项:
- Clutch对iOS 11+的支持有限
- 建议配合Frida使用更现代的脱壳方案
五、开发与Hook框架
5.1 Theos - 越狱插件开发
安装:
# 安装依赖
brew install ldid xz
# 下载Theos
export THEOS=/opt/theos
sudo git clone --recursive e17K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6@1K9r3g2G2M7#2)9J5c8Y4c8Z5k6h3!0K6i4K6u0W2k6$3W2@1 $THEOS
# 配置环境变量
echo 'export THEOS=/opt/theos' >> ~/.zshrc
echo 'export PATH=$THEOS/bin:$PATH' >> ~/.zshrc
创建项目:
# 创建新项目
$THEOS/bin/nic.pl
# 选择模板(通常选择iphone/tweak)
Choose a Template (required): 11
# 配置项目信息
Project Name: MyTweak
Package Name: com.yourcompany.mytweak
Author: Your Name
[iphone/tweak] MobileSubstrate Bundle filter: com.apple.springboard
[iphone/tweak] List of applications to terminate upon installation: SpringBoard
Tweak.xm示例:
#import <SpringBoard/SpringBoard.h>
%hook SpringBoard
- (void)applicationDidFinishLaunching:(id)application {
%orig;
UIAlertController *alert = [UIAlertController
alertControllerWithTitle:@"Tweak Loaded"
message:@"MyTweak is working!"
preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *ok = [UIAlertAction
actionWithTitle:@"OK"
style:UIAlertActionStyleDefault
handler:nil];
[alert addAction:ok];
// 显示提示
[[UIApplication sharedApplication].keyWindow.rootViewController
presentViewController:alert animated:YES completion:nil];
}
%end
构建与安装:
# 编译
make
# 打包
make package
# 安装到设备
make install THEOS_DEVICE_IP=192.168.1.100 THEOS_DEVICE_PORT=22
5.2 Logos语法参考
基本语法:
// Hook类方法
%hook ClassName
- (void)methodName {
%orig; // 调用原始方法
// 添加的代码
}
%end
// Hook类方法(带参数)
%hook ClassName
- (void)methodWithArg:(id)arg1 anotherArg:(int)arg2 {
NSLog(@"Args: %@, %d", arg1, arg2);
%orig(arg1, arg2);
}
%end
// 构造函数(自动加载)
%ctor {
%init(ClassName = ActualClassName); // 初始化Hook
NSLog(@"Tweak loaded");
}
控制流:
// 条件Hook
%hook ClassName
- (void)methodName {
if (someCondition) {
%orig;
} else {
// 替代实现
}
}
%end
// 分组Hook
%group GroupName
%hook ClassName
- (void)methodName {
%orig;
}
%end
%end // GroupName
六、实用工具集
6.1 网络分析工具
Charles Proxy配置:
安装证书:
- Help → SSL Proxying → Install Charles Root Certificate
- 钥匙串访问中信任证书
iOS设备配置:
# 查看电脑IP ifconfig en0 # 设备设置:Wi-Fi → HTTP代理 → 手动 # 服务器:电脑IP,端口:8888SSL代理设置:
- Proxy → SSL Proxying Settings
- 添加:Host: *,Port: 443
Burp Suite使用:
# 启动Burp
java -jar burpsuite_pro.jar
# 配置iOS设备代理
# 端口通常为8080
6.2 文件管理工具
iFunBox基础操作:
- 连接设备:USB连接后自动识别
- 文件传输:拖拽文件到应用目录
- 应用管理:查看应用沙盒文件
- 备份恢复:完整备份应用数据
Filza(越狱设备):
# 常用目录
/var/mobile/Containers/Data/Application/ # 应用数据
/var/mobile/Containers/Bundle/Application/ # 应用Bundle
/User/Library/Preferences/ # 偏好设置
/User/Library/Keychains/ # 钥匙串
6.3 调试辅助工具
Reveal配置:
# 1. 下载Reveal Loader(Cydia)
# 2. 安装Reveal Server(macOS应用)
# 3. 启动应用即可查看UI层次
flex使用:
- 安装flex(Cydia)
- 在应用内下拉通知中心启动flex
- 选择要Hook的类和方法
- 实时修改和测试
七、实战案例
7.1 案例一:分析登录加密
目标:分析某应用的登录参数加密方式
步骤:
- 静态分析:
class-dump -H AppName -o headers
grep -r "login\|encrypt\|password" headers/
- 动态追踪:
// Frida脚本追踪加密函数
Interceptor.attach(ObjC.classes.CryptoManager["- encryptData:"].implementation, {
onEnter: function(args) {
this.data = args[2];
console.log("Encrypting data: " + this.data.readUtf8String());
},
onLeave: function(retval) {
console.log("Encrypted result: " + retval.readUtf8String());
}
});
- 断点调试:
# LLDB断点
breakpoint set -n "[CryptoManager encryptData:]"
breakpoint command add -o "po $x0" -o "po $x1"
7.2 案例二:绕过越狱检测
目标:Hook越狱检测方法
Tweak.xm:
%hook JailbreakDetection
- (BOOL)isJailbroken {
return NO; // 总是返回NO
}
- (BOOL)checkCydia {
return NO;
}
- (BOOL)checkSuspiciousFiles {
return NO;
}
%end
%ctor {
%init(JailbreakDetection = ActualDetectionClass);
}
八、常见问题与解决
8.1 工具无法连接设备
检查步骤:
- 确认设备已信任电脑
- 检查USB连接是否正常
- 重启usbmuxd服务:
brew services restart usbmuxd - 重新插拔数据线
8.2 应用闪退
可能原因:
- 代码签名问题
- 权限配置错误
- Hook冲突
- 内存访问异常
解决方法:
# 查看崩溃日志
idevicesyslog | grep "AppName"
# 检查entitlements
codesign -d --entitlements - AppName.app
8.3 脱壳失败
排查方法:
- 确认应用有加密(otool -l | grep crypt)
- 检查Frida是否正常运行
- 尝试不同脱壳工具
- 更新工具到最新版本
九、安全建议与最佳实践
9.1 环境隔离
- 使用虚拟机或独立测试机
- 定期备份重要数据
- 避免在生产环境测试
9.2 代码规范
// 良好的Hook实践
%hook SensitiveClass
- (void)sensitiveMethod {
@try {
%orig;
} @catch (NSException *e) {
NSLog(@"[ERROR] Hook failed: %@", e);
}
}
%end
9.3 学习资源
- 官方文档:各工具官方文档
- GitHub仓库:关注工具更新
- 技术社区:iOSRE论坛、Reddit相关板块
- 安全会议:看雪、MOSEC等会议资料
十、总结
iOS逆向工程是一个涉及多工具、多技术的复杂领域。掌握这些工具的使用方法只是第一步,更重要的是理解其原理,并能根据实际情况灵活组合使用。
工具选择建议:
- 初学者:从Hopper、class-dump开始,逐步学习Frida
- 中级用户:掌握Theos开发,学习LLDB调试
- 高级研究:深入IDA Pro,研究ARM汇编,开发定制工具
持续学习:
- 关注iOS系统更新带来的变化
- 学习新的保护技术和对抗方法
- 参与开源社区,分享经验和代码
最后再次强调:请将所学知识用于合法合规的场景,尊重开发者劳动成果,共同维护良好的技术生态。
作者:[小白]更新日期:2026年3月30日版权声明:本文仅供学习交流使用,转载请注明出处
[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!