
iOS Syscall Explorer for IDA 9.X
An IDA Pro script that scans an AArch64 binary for SVC instructions, resolves the BSD syscall number from the X16 register, and presents every result in a rich dockable UI, with per-syscall occurrence navigation and live man-page documentation fetching.
Built for iOS / macOS reverse engineering on IDA Pro 9.x. The sole purpose of why I created this was when reverse engineering iOS platforms with anti-tamper measures down to the syscalls. I was bored of printing the syscalls to the console and wanted something reasonable to look at and at the same time fetch live documentation.
This entire ReadMe is AI generated, same with most parts of the script. I had written the base for it and then let Claude Opus 4.7 do its magic to bring everything together with a beautiful user-interface.
SVC #0x80 instruction and resolves the MOV X16, #num setup up to 8 instructions back0x5, 5), or function name; also filter by category from a dropdownEnter to jump to that address in IDAman 2 page from man.freebsd.org in a background thread (Darwin is BSD-derived); results are cached per sessionCtrl+F focuses the search box; Enter on a selected occurrence navigates to it| Requirement | Version |
|---|---|
| IDA Pro | 9.x (tested on 9.3) |
| Python | bundled with IDA |
| PySide6 | ships with IDA 9 |
requests | optional — only needed for man-page fetching |
PyQt5 fallback — the script also works with IDA's PyQt5 shim for older versions.
To install requests into IDA's Python environment, run this in IDA's Python console:
import subprocess, sys
subprocess.run([sys.executable, "-m", "pip", "install", "requests"])
syscall_ios.py anywhere on your machine.The analyzer panel opens automatically and begins scanning.
File → Script file… → syscall_ios.py
Or use IDA's Script command (Shift+F2) to paste and run directly.

Colors mirror IDA Pro's own disassembly highlight palette so the output feels native.
Export JSON produces a file like:
[
{
"name": "read",
"number": 3,
"number_hex": "0x3",
"address": "0x1001a4bc",
"rva": "0x4bc",
"function": "sub_1001A0000",
"category": "File I/O"
},
...
]
The embedded table covers 556 syscalls from the Darwin/XNU BSD layer (0x2000000 class), including:
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 traps and libsystem wrappers that go through a different trap class are not included — this covers BSD class (SVC #0x80 with X16 = 0x2000000 | num) only.
SVC instruction for a MOV X16, #imm within 8 instructions. Indirect loads (e.g. LDR X16, [...]) will show as UNKNOWN.SLIDE constant at the top of the file has no effect on the addresses displayed — it is kept as a comment reference for correlating with a live lldb session.| 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 | — |
bsdthread_*workq_open, workq_kernreturn, kqueue_workloop_ctl, …)audit_*, __mac_*)