
iOS Syscall Explorer per IDA 9.X
Uno script IDA Pro che analizza un binario AArch64 alla ricerca di istruzioni SVC, risolve il numero di syscall BSD dal registro X16 e presenta ogni risultato in una ricca interfaccia ancorabile, con navigazione tra le occorrenze di ogni syscall e recupero live della documentazione man-page.
Progettato per il reverse engineering di iOS / macOS su IDA Pro 9.x. L'unico motivo per cui l'ho creato è stato il reverse engineering di piattaforme iOS con misure anti-tamper che arrivano fino al livello delle syscall. Mi ero stancato di stampare le syscall sulla console e volevo qualcosa di gradevole da guardare che, allo stesso tempo, recuperasse la documentazione live.
Questa intera ReadMe è generata dall'IA, così come la maggior parte dello script. Avevo scritto la base e poi ho lasciato che Claude Opus 4.7 facesse la sua magia per mettere tutto insieme con una bellissima interfaccia utente.
SVC #0x80 e risale alla configurazione MOV X16, #num fino a 8 istruzioni indietro0x5, 5) o nome funzione; filtra anche per categoria da un menu a tendinaEnter per saltare a quell'indirizzo in IDAman 2 da man.freebsd.org in un thread in background (Darwin deriva da BSD); i risultati vengono memorizzati nella cache per sessioneCtrl+F porta il focus sulla casella di ricerca; Enter su un'occorrenza selezionata salta a essa| Requisito | Versione |
|---|---|
| IDA Pro | 9.x (testato su 9.3) |
| Python | incluso con IDA |
| PySide6 | fornito con IDA 9 |
requests | opzionale — necessario solo per il recupero delle man page |
Fallback PyQt5 — lo script funziona anche con lo shim PyQt5 di IDA per le versioni precedenti.
Per installare requests nell'ambiente Python di IDA, esegui questo nella console Python di IDA:
import subprocess, sys
subprocess.run([sys.executable, "-m", "pip", "install", "requests"])
syscall_ios.py in qualsiasi posizione sul tuo computer.Il pannello dell'analizzatore si apre automaticamente e inizia la scansione.
File → Script file… → syscall_ios.py
Oppure usa il comando Script di IDA (Shift+F2) per incollare ed eseguire direttamente.

I colori rispecchiano la palette di evidenziazione del disassemblatore di IDA Pro, così l'output risulta nativo.
Esporta JSON genera un file come questo:
[
{
"name": "read",
"number": 3,
"number_hex": "0x3",
"address": "0x1001a4bc",
"rva": "0x4bc",
"function": "sub_1001A0000",
"category": "File I/O"
},
...
]
La tabella integrata copre 556 syscall del layer BSD Darwin/XNU (classe 0x2000000), tra cui:
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, , …)Le Mach trap e i wrapper libsystem che passano attraverso una classe di trap diversa non sono inclusi — qui è coperta solo la classe BSD (SVC #0x80 con X16 = 0x2000000 | num).
SVC alla ricerca di MOV X16, #imm entro 8 istruzioni. I caricamenti indiretti (ad es. LDR X16, [...]) verranno mostrati come UNKNOWN.SLIDE all'inizio del file non ha alcun effetto sugli indirizzi visualizzati — viene mantenuta come riferimento nei commenti per la correlazione con una sessione lldb live.| Categoria | Colore | Equivalente IDA |
|---|
| File I/O | #4EC9B0 | Tipo / struct |
| Network | #569CD6 | Parola chiave |
| Memory | #DCDCAA | Nome funzione |
| Process | #CE9178 | Stringa letterale |
| Threading | #9CDCFE | Variabile |
| IPC | #C586C0 | Enum / macro |
| Security | #F44747 | Errore / avviso |
| Time | #6A9955 | Commento |
| Misc | #858585 | — |
bsdthread_*workq_open, workq_kernreturn, kqueue_workloop_ctl, …)audit_*, __mac_*)