【iOS安全-iOS逆向工程常用工具完全指南(2026最新版)】此文章归类为:iOS安全。
本文旨在为安全研究人员和开发者提供iOS逆向工程的技术学习资料,请遵守相关法律法规,仅用于合法授权的安全测试和学习研究。
iOS逆向工程是移动安全领域的重要研究方向,涉及应用安全分析、漏洞挖掘、恶意软件检测等多个方面。本文将系统介绍iOS逆向工程中常用的工具链,并提供详细的使用指南,帮助初学者快速入门。
⚠️ 重要提醒:
简介:从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
简介:功能强大的交互式反汇编器,支持ARM64架构,界面友好。
安装:
基本操作:
Cmd+K进入方法实现Cmd+G跳转到指定地址Cmd+A重新分析函数Pseudo-code模式查看伪代码Tab在汇编和伪代码间切换实用功能:
:添加注释Ctrl+Shift+C查看控制流程图Cmd+Shift+S查找字符串引用简介:业界标准的逆向工程工具,功能全面但价格昂贵。
安装:
核心功能:
基础工作流:
# 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}")
简介:NSA开源的免费逆向工具,功能强大。
安装:
# 通过Homebrew安装
brew install --cask ghidra
# 或从官网下载
# ca9K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6z5j5i4c8A6L8$3&6S2L8q4y4W2j5%4g2J5K9i4c8&6b7h3N6W2L8X3y4&6i4K6u0r3k6$3S2A6k6s2u0S2i4K6u0r3M7X3g2D9k6h3q4K6k6i4x3`.
基本使用:
优势:
简介:功能强大的动态插桩工具,支持JavaScript脚本注入。
安装:
# 安装Frida工具包
pip install frida-tools
# 查看设备连接
frida-ps -U
# 安装iOS端
# 在Cydia中添加源:af1K9s2c8@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转发
简介:在运行时操作Objective-C的脚本环境,语法类似JavaScript。
安装(越狱设备):
# 在Cydia中添加源:af4K9s2c8@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);
简介:在非越狱设备上调试和Hook应用的集成环境。
安装:
# 使用安装脚本
sudo /bin/sh -c "$(curl -fsSL f35K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6J5j5i4N6Q4x3X3g2Y4K9i4c8Z5N6h3u0#2M7$3g2J5j5$3!0F1N6r3g2F1N6q4)9J5k6h3y4G2L8g2)9J5c8V1q4D9L8$3&6W2e0h3!0F1K9$3g2&6i4K6u0r3e0h3!0F1K9$3g2&6c8r3g2$3i4K6u0r3L8h3q4K6N6r3g2J5i4K6u0r3j5X3W2F1i4K6u0r3L8h3c8Q4x3X3c8A6L8Y4y4@1j5h3I4D9i4K6t1&6"
项目创建:
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);
}
配置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" "7d3K9s2c8@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
安装:
git clone e9aK9s2c8@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
工作原理:
安装(越狱设备):
# 添加源:a9bK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2M7s2c8Q4x3X3g2@1K9r3g2T1K9h3N6T1L8%4y4K6i4K6u0W2L8%4u0Y4i4K6u0r3M7X3g2H3L8$3k6A6L8r3g2K6i4K6u0r3j5%4W2V1K9h3p5`.
# 搜索安装Clutch
使用:
# 列出可脱壳应用
Clutch -i
# 脱壳应用(使用序号)
Clutch -d 1
# 脱壳应用(使用Bundle ID)
Clutch -d com.example.app
# 批量脱壳
Clutch -b
注意事项:
安装:
# 安装依赖
brew install ldid xz
# 下载Theos
export THEOS=/opt/theos
sudo git clone --recursive cd8K9s2c8@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
基本语法:
// 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
Charles Proxy配置:
安装证书:
iOS设备配置:
# 查看电脑IP
ifconfig en0
# 设备设置:Wi-Fi → HTTP代理 → 手动
# 服务器:电脑IP,端口:8888
SSL代理设置:
Burp Suite使用:
# 启动Burp
java -jar burpsuite_pro.jar
# 配置iOS设备代理
# 端口通常为8080
iFunBox基础操作:
Filza(越狱设备):
# 常用目录
/var/mobile/Containers/Data/Application/ # 应用数据
/var/mobile/Containers/Bundle/Application/ # 应用Bundle
/User/Library/Preferences/ # 偏好设置
/User/Library/Keychains/ # 钥匙串
Reveal配置:
# 1. 下载Reveal Loader(Cydia)
# 2. 安装Reveal Server(macOS应用)
# 3. 启动应用即可查看UI层次
flex使用:
目标:分析某应用的登录参数加密方式
步骤:
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"
目标:Hook越狱检测方法
Tweak.xm:
%hook JailbreakDetection
- (BOOL)isJailbroken {
return NO; // 总是返回NO
}
- (BOOL)checkCydia {
return NO;
}
- (BOOL)checkSuspiciousFiles {
return NO;
}
%end
%ctor {
%init(JailbreakDetection = ActualDetectionClass);
}
检查步骤:
brew services restart usbmuxd可能原因:
解决方法:
# 查看崩溃日志
idevicesyslog | grep "AppName"
# 检查entitlements
codesign -d --entitlements - AppName.app
排查方法:
// 良好的Hook实践
%hook SensitiveClass
- (void)sensitiveMethod {
@try {
%orig;
} @catch (NSException *e) {
NSLog(@"[ERROR] Hook failed: %@", e);
}
}
%end
iOS逆向工程是一个涉及多工具、多技术的复杂领域。掌握这些工具的使用方法只是第一步,更重要的是理解其原理,并能根据实际情况灵活组合使用。
最后再次强调:请将所学知识用于合法合规的场景,尊重开发者劳动成果,共同维护良好的技术生态。
作者:[小白]更新日期:2026年3月30日版权声明:本文仅供学习交流使用,转载请注明出处
更多【iOS安全-iOS逆向工程常用工具完全指南(2026最新版)】相关视频教程:www.yxfzedu.com