
iOS Syscall Explorer für IDA 9.X
Ein IDA-Pro-Skript, das ein AArch64-Binary nach SVC-Instruktionen durchsucht, die BSD-Syscall-Nummer aus dem X16-Register ermittelt und jedes Ergebnis in einer umfangreichen andockbaren Benutzeroberfläche präsentiert – mit Navigation zu den einzelnen Vorkommen jedes Syscalls und Live-Abruf der Man-Pages.
Entwickelt für das Reverse Engineering von iOS / macOS mit IDA Pro 9.x. Der einzige Grund für die Erstellung war das Reverse Engineering von iOS-Plattformen mit Anti-Manipulationsmaßnahmen bis hinab zu den Syscalls. Ich hatte es satt, die Syscalls auf der Konsole auszugeben, und wollte etwas, das man sich angenehm ansehen kann und das gleichzeitig Live-Dokumentation abruft.
Diese gesamte ReadMe ist KI-generiert, ebenso wie die meisten Teile des Skripts. Ich habe die Basis dafür geschrieben und dann Claude Opus 4.7 seine Magie entfalten lassen, um alles mit einer schönen Benutzeroberfläche zusammenzuführen.
SVC #0x80-Instruktion und ermittelt das MOV X16, #num-Setup bis zu 8 Instruktionen zurück0x5, 5) oder Funktionsname; zusätzlich Filter nach Kategorie über ein Dropdown-MenüEnter springt zu dieser Adresse in IDAman 2-Seite in einem Hintergrundthread von man.freebsd.org ab (Darwin basiert auf BSD); Ergebnisse werden pro Sitzung zwischengespeichertCtrl+F fokussiert das Suchfeld; Enter bei einem ausgewählten Vorkommen navigiert dorthin| Anforderung | Version |
|---|---|
| IDA Pro | 9.x (auf 9.3 getestet) |
| Python | ist in IDA enthalten |
| PySide6 | wird mit IDA 9 mitgeliefert |
requests | optional — nur für den Abruf der Man-Pages erforderlich |
PyQt5-Fallback — das Skript funktioniert auch mit IDAs PyQt5-Shim für ältere Versionen.
Um requests in IDAs Python-Umgebung zu installieren, führen Sie dies in IDAs Python-Konsole aus:
import subprocess, sys
subprocess.run([sys.executable, "-m", "pip", "install", "requests"])
syscall_ios.py an einen beliebigen Ort auf Ihrem Rechner.Das Analyzer-Panel öffnet sich automatisch und beginnt mit dem Scannen.
File → Script file… → syscall_ios.py
Oder verwenden Sie IDAs Script command (Shift+F2), um den Code direkt einzufügen und auszuführen.

Die Farben spiegeln IDA Pros eigene Disassembler-Hervorhebungspalette wider, damit sich die Ausgabe nativ anfühlt.
Export JSON erzeugt eine Datei wie:
[
{
"name": "read",
"number": 3,
"number_hex": "0x3",
"address": "0x1001a4bc",
"rva": "0x4bc",
"function": "sub_1001A0000",
"category": "File I/O"
},
...
]
Die eingebettete Tabelle umfasst 556 Syscalls aus der Darwin/XNU-BSD-Ebene (Klasse 0x2000000), darunter:
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 und libsystem-Wrapper, die über eine andere Trap-Klasse laufen, sind nicht enthalten — abgedeckt wird nur die BSD-Klasse (SVC #0x80 mit X16 = 0x2000000 | num).
SVC-Instruktion rückwärts innerhalb von 8 Instruktionen nach einem MOV X16, #imm gesucht wird. Indirekte Ladevorgänge (z. B. LDR X16, [...]) werden als UNKNOWN angezeigt.SLIDE am Anfang der Datei hat keinen Einfluss auf die angezeigten Adressen — sie dient als Kommentar-Referenz zur Korrelation mit einer laufenden lldb-Sitzung.| Kategorie | Farbe | IDA-Äquivalent |
|---|
| File I/O | #4EC9B0 | Typ / Struktur |
| Network | #569CD6 | Schlüsselwort |
| Memory | #DCDCAA | Funktionsname |
| Process | #CE9178 | String-Literal |
| Threading | #9CDCFE | Variable |
| IPC | #C586C0 | Enum / Makro |
| Security | #F44747 | Fehler / Warnung |
| Time | #6A9955 | Kommentar |
| Misc | #858585 | — |
bsdthread_*workq_open, workq_kernreturn, kqueue_workloop_ctl, …)audit_*, __mac_*)