
用于IDA 9.X的iOS系统调用浏览器
Скрипт для IDA Pro, который сканирует AArch64-бинарник на наличие инструкций SVC, определяет номер системного вызова BSD из регистра X16 и отображает каждый результат в насыщенной закрепляемой панели с навигацией по вхождениям каждого системного вызова и динамической загрузкой man-страниц.
Разработан для реверс-инжиниринга iOS/macOS в IDA Pro 9.x.
Единственная причина, по которой я его создал — при реверс-инжиниринге платформ iOS с мерами защиты от модификации на уровне системных вызовов. Мне надоело печатать системные вызовы в консоль, хотелось иметь что-то удобное для просмотра с возможностью получать живую документацию.
Этот ReadMe полностью сгенерирован ИИ, как и большая часть скрипта. Я написал основу, а затем позволил Claude Opus 4.7 сделать свою магию и объединить всё в красивый пользовательский интерфейс.
SVC #0x80 и определяет настройку MOV X16, #num с поиском до 8 инструкций назад0x5, 5) или имени функции; также фильтрация по категории из выпадающего спискаEnter переходит к этому адресу в IDAman 2 с man.freebsd.org в фоновом потоке (Darwin основан на BSD); результаты кэшируются в течение сессииCtrl+F фокусирует поле поиска; Enter на выбранном вхождении переходит к нему| Требование | Версия |
|---|---|
| IDA Pro | 9.x (протестировано на 9.3) |
| Python | встроенный в IDA |
| PySide6 | поставляется с IDA 9 |
requests | опционально — требуется только для загрузки man-страниц |
Запасной вариант PyQt5 — скрипт также работает с прослойкой PyQt5 от IDA для старых версий.
Чтобы установить requests в среду Python IDA, выполните в консоли Python IDA:
import subprocess, sys
subprocess.run([sys.executable, "-m", "pip", "install", "requests"])
syscall_ios.py в любое место на вашем компьютере.Панель анализатора откроется автоматически и начнёт сканирование.
File → Script file… → syscall_ios.py
Или используйте Script command (Shift+F2) IDA, чтобы вставить и выполнить напрямую.

Цвета повторяют палитру подсветки дизассемблера IDA, чтобы вывод выглядел естественно.
| Категория | Цвет | Аналог в IDA |
|---|---|---|
| Ввод/вывод файлов | #4EC9B0 | Тип / структура |
| Сеть | #569CD6 | Ключевое слово |
| Память | #DCDCAA | Имя функции |
| Процессы | #CE9178 | Строковый литерал |
| Потоки | #9CDCFE | Переменная |
| IPC | #C586C0 | Перечисление / макрос |
| Безопасность | #F44747 | Ошибка / предупреждение |
| Время | #6A9955 | Комментарий |
| Прочее | #858585 | — |
Экспорт в JSON создает файл вида:
[
{
"name": "read",
"number": 3,
"number_hex": "0x3",
"address": "0x1001a4bc",
"rva": "0x4bc",
"function": "sub_1001A0000",
"category": "File I/O"
},
...
]
Встроенная таблица охватывает 556 системных вызовов из уровня BSD Darwin/XNU (класс 0x2000000), включая:
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, bsdthread_*, …)workq_open, workq_kernreturn, kqueue_workloop_ctl, …)audit_*, __mac_*)Ловушки Mach и обёртки libsystem, использующие другой класс ловушек, не включены — покрыт только класс BSD (SVC #0x80 с X16 = 0x2000000 | num).
SVC на наличие MOV X16, #imm в пределах 8 инструкций. Косвенные загрузки (например, LDR X16, [...]) будут отображаться как UNKNOWN.SLIDE в начале файла не влияет на отображаемые адреса — она оставлена как справочный комментарий для сопоставления с активной сессией lldb.