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`) 直接粘贴并运行。 ### 面板概览 ![Pic 1](https://i.imgur.com/eYEl4s8.png) ![Pic 2](https://i.imgur.com/ujWMaZ2.png) ## 分类颜色参考 颜色映射了 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, 云安全监控, 云资产清单, 系统调用, 逆向工具, 逆向工程, 静态分析