
iOS Syscall Explorer for IDA 9.X
一个 IDA Pro 脚本,用于扫描 AArch64 二进制文件中的 SVC 指令,从 X16 寄存器解析 BSD 系统调用编号,并在一个功能丰富的可停靠 UI 中展示所有结果,支持按系统调用位置导航和实时手册文档获取。
专为 iOS / macOS 逆向工程设计,适用于 IDA Pro 9.x。
我创建它的唯一目的是,在逆向具有反篡改机制(直至系统调用层)的 iOS 平台时,厌倦了将系统调用打印到控制台,想要一个更直观的查看方式,同时能够获取实时文档。
整个 ReadMe 由 AI 生成,脚本的大部分内容也是如此。我编写了基础代码,然后让 Claude Opus 4.7 施展魔法,将其整合成漂亮的用户界面。
SVC #0x80 指令,并回溯最多 8 条指令解析 MOV X16, #num 的传参设置0x5、5)或函数名搜索;也可从下拉菜单按类别筛选Enter 即可跳转到 IDA 中的对应地址man.freebsd.org 获取完整的 man 2 手册页(Darwin 衍生自 BSD);结果在会话中缓存Ctrl+F 聚焦搜索框;在选中的出现位置上按 Enter 可导航| 要求 | 版本 |
|---|---|
| IDA Pro | 9.x(已在 9.3 上测试) |
| Python | 与 IDA 捆绑 |
| PySide6 | 随 IDA 9 提供 |
requests | 可选 —— 仅在获取手册页时需要 |
PyQt5 回退 —— 该脚本也适用于较早版本的 IDA 的 PyQt5 shim。
要将 requests 安装到 IDA 的 Python 环境中,在 IDA 的 Python 控制台中运行:
import subprocess, sys
subprocess.run([sys.executable, "-m", "pip", "install", "requests"])
syscall_ios.py 复制到机器上的任意位置。分析器面板将自动打开并开始扫描。
File → Script file… → syscall_ios.py
或者使用 IDA 的 Script command(Shift+F2)直接粘贴并运行。

颜色模仿 IDA Pro 自身的反汇编高亮调色板,使输出感觉更原生。
Export JSON 生成的文件格式如下:
[
{
"name": "read",
"number": 3,
"number_hex": "0x3",
"address": "0x1001a4bc",
"rva": "0x4bc",
"function": "sub_1001A0000",
"category": "File I/O"
},
...
]
内嵌表格覆盖了 Darwin/XNU BSD 层(0x2000000 类别)的 556 条系统调用,包括:
read、write、open、mmap、socket……)csops、guarded_open_np、memorystatus_control、kevent_qos……)pid_hibernate、abort_with_payload、necp_*、os_fault_with_payload……)psynch_mutexwait、psynch_cvwait、……)Mach 陷阱以及通过不同陷阱类调用的 libsystem 包装器不包含在内 —— 本工具仅覆盖 BSD 类别(SVC #0x80 且 X16 = 0x2000000 | num)。
SVC 指令向前回溯最多 8 条指令,寻找 MOV X16, #imm 来解析。间接加载(例如 LDR X16, [...])将显示为 UNKNOWN。SLIDE 常量对显示的地址没有影响 —— 它作为注释保留,用于关联实时的 lldb 会话。| 类别 | 颜色 | IDA 对应项 |
|---|
| 文件 I/O | #4EC9B0 | 类型 / 结构体 |
| 网络 | #569CD6 | 关键字 |
| 内存 | #DCDCAA | 函数名 |
| 进程 | #CE9178 | 字符串字面量 |
| 线程 | #9CDCFE | 变量 |
| IPC | #C586C0 | 枚举 / 宏 |
| 安全 | #F44747 | 错误 / 警告 |
| 时间 | #6A9955 | 注释 |
| 杂项 | #858585 | — |
bsdthread_*workq_open、workq_kernreturn、kqueue_workloop_ctl……)audit_*、__mac_*)