stolevchristian/sylvia
GitHub: stolevchristian/sylvia
一款 IDA Pro 9.x 脚本插件,用于在 AArch64 二进制中扫描 SVC 指令、解析 BSD syscall 编号并提供可视化浏览面板。
Stars: 14 | Forks: 1
# iOS AArch64 Syscall 分析器
一个 IDA Pro 脚本,用于扫描 AArch64 二进制文件中的 `SVC` 指令,从 `X16` 寄存器解析出 BSD syscall 号,并在功能丰富的可停靠 UI 中展示所有结果,提供针对每个 syscall 出现位置的导航以及实时 man-page 文档抓取。
专为在 IDA Pro 9.x 上进行 iOS / macOS 逆向工程而构建。
我开发它的唯一目的,是为了应对那些防篡改措施深入到 syscall 层面的 iOS 平台逆向工程。我已经厌倦了将 syscall 打印到控制台,想要一个更直观的查看界面,同时还能获取实时文档。
整个 Readme 都是 AI 生成的,脚本的大部分也是如此。我写好了基础代码,然后让 Claude Opus 4.7 发挥它的魔法,用一个美观的用户界面将一切完美结合起来。
## 功能
- **全二进制扫描** — 查找每一条 `SVC #0x80` 指令,并向前回溯最多 8 条指令以解析出 `MOV X16, #num` 设置
- **556 条 syscall 映射** — 完整的 iOS/macOS AArch64 BSD syscall 表
- **9 种颜色编码分类** — File I/O、Network、Memory、Process、Threading、IPC、Security、Time、Misc;颜色复用了 IDA 自带的反汇编调色板
- **可停靠面板** — 像 IDA 原生工具一样驻留在 IDA 中;重新运行脚本即可重新聚焦同一窗口
- **实时过滤** — 按名称、编号 (`0x5`, `5`) 或函数名进行搜索;也可通过下拉菜单按分类过滤
- **出现位置表** — 列出指定 syscall 出现的每一个地址和 RVA,并已排序;双击或按 `Enter` 键即可在 IDA 中跳转至该地址
- **实时文档** — 在后台线程中从 `man.freebsd.org` 获取完整的 `man 2` 页面(Darwin 衍生自 BSD);结果会在当前会话中缓存
- **内置描述** — 约 250 个 syscall 拥有一行描述,无需网络请求即可立即查看
- **导出 JSON** — 将所有找到的 syscall(名称、编号、地址、RVA、函数、分类)导出至 JSON 文件
- **右键上下文菜单** — 复制名称、复制编号、跳转到首次出现位置、获取 man page(syscall 表);复制地址、复制函数名(出现位置表)
- **键盘快捷键** — `Ctrl+F` 聚焦搜索框;在选中的出现位置上按 `Enter` 进行导航
## 需求
| Requirement | Version |
|---|---|
| IDA Pro | 9.x (已在 9.3 上测试) |
| Python | IDA 自带 |
| PySide6 | 随 IDA 9 提供 |
| `requests` | 可选 — 仅在获取 man-page 时需要 |
要在 IDA 的 Python 环境中安装 `requests`,请在 IDA 的 Python 控制台中运行以下命令:
```
import subprocess, sys
subprocess.run([sys.executable, "-m", "pip", "install", "requests"])
```
## 安装说明
1. 将 `syscall_ios.py` 复制到您机器上的任意位置。
2. 在 IDA Pro 中打开您的目标二进制文件。
3. 通过 **File → Script file…** 运行脚本,或将其拖入 IDA 窗口。
分析面板将自动打开并开始扫描。
## 用法
### 运行脚本
```
File → Script file… → syscall_ios.py
```
或者使用 IDA 的 **Script command** (`Shift+F2`) 直接粘贴并运行。
### 面板概览


## 分类颜色参考
颜色映射了 IDA Pro 自身的反汇编高亮调色板,因此输出感觉就像原生的。
| Category | Color | IDA Equivalent |
|---|---|---|
| File I/O | `#4EC9B0` | Type / struct |
| Network | `#569CD6` | Keyword |
| Memory | `#DCDCAA` | Function name |
| Process | `#CE9178` | String literal |
| Threading | `#9CDCFE` | Variable |
| IPC | `#C586C0` | Enum / macro |
| Security | `#F44747` | Error / warning |
| Time | `#6A9955` | Comment |
| Misc | `#858585` | — |
## 导出格式
**Export JSON** 会生成如下文件:
```
[
{
"name": "read",
"number": 3,
"number_hex": "0x3",
"address": "0x1001a4bc",
"rva": "0x4bc",
"function": "sub_1001A0000",
"category": "File I/O"
},
...
]
```
## Syscall 覆盖范围
内嵌表涵盖了来自 Darwin/XNU BSD 层(`0x2000000` 类)的 **556 个 syscall**,包括:
- 标准 POSIX (`read`, `write`, `open`, `mmap`, `socket`, …)
- Darwin 扩展 (`csops`, `guarded_open_np`, `memorystatus_control`, `kevent_qos`, …)
- iOS 特有 (`pid_hibernate`, `abort_with_payload`, `necp_*`, `os_fault_with_payload`, …)
- Pthread 内核辅助 (`psynch_mutexwait`, `psynch_cvwait`, `bsdthread_*`, …)
- GCD / 工作队列 (`workq_open`, `workq_kernreturn`, `kqueue_workloop_ctl`, …)
- 审计和 MAC 框架 (`audit_*`, `__mac_*`)
不包含 Mach traps 和通过不同 trap 类调用的 `libsystem` 包装器 —— 本工具仅涵盖 BSD 类(带 `X16 = 0x2000000 | num` 的 `SVC #0x80`)。
## 注意事项
- syscall 编号是通过从 `SVC` 指令向前回溯最多 8 条指令,寻找 `MOV X16, #imm` 来解析的。间接加载(如 `LDR X16, [...]`)将显示为 `UNKNOWN`。
- 文件顶部的 `SLIDE` 常量对显示的地址没有影响 —— 保留它是作为与实时 `lldb` 会话进行关联的注释参考。
- 重新扫描会针对当前加载的二进制文件重新运行完整分析;之前获取的 man-page 仍保持缓存。
标签:Hpfeeds, IDA插件, iOS, 云安全监控, 云资产清单, 系统调用, 逆向工具, 逆向工程, 静态分析