
Explorador de Syscalls iOS para IDA 9.X
Um script do IDA Pro que verifica um binário AArch64 em busca de instruções SVC, resolve o número da syscall BSD a partir do registrador X16 e apresenta todos os resultados em uma interface rica e encaixável, com navegação por ocorrência de syscall e busca de documentação man-page em tempo real.
Desenvolvido para engenharia reversa de iOS / macOS no IDA Pro 9.x. O único motivo pelo qual criei isto foi para a engenharia reversa de plataformas iOS com medidas anti-adulteração que chegam até as syscalls. Eu estava cansado de imprimir as syscalls no console e queria algo razoável de se olhar e que, ao mesmo tempo, buscasse documentação em tempo real.
Todo este ReadMe foi gerado por IA, assim como a maior parte do script. Eu escrevi a base e depois deixei o Claude Opus 4.7 fazer sua mágica para unir tudo com uma bela interface de usuário.
SVC #0x80 e resolve a configuração MOV X16, #num até 8 instruções antes0x5, 5) ou nome da função; também é possível filtrar por categoria em um menu suspensoEnter para saltar para esse endereço no IDAman 2 em man.freebsd.org em uma thread em segundo plano (o Darwin é derivado do BSD); os resultados ficam em cache por sessãoCtrl+F foca a caixa de busca; Enter em uma ocorrência selecionada navega até ela| Requisito | Versão |
|---|---|
| IDA Pro | 9.x (testado na 9.3) |
| Python | incluído com o IDA |
| PySide6 | acompanha o IDA 9 |
requests | opcional — necessário apenas para buscar páginas man |
Fallback PyQt5 — o script também funciona com o shim PyQt5 do IDA para versões mais antigas.
Para instalar o requests no ambiente Python do IDA, execute o seguinte no console Python do IDA:
import subprocess, sys
subprocess.run([sys.executable, "-m", "pip", "install", "requests"])
syscall_ios.py para qualquer lugar da sua máquina.O painel do analisador abre automaticamente e inicia a verificação.
File → Script file… → syscall_ios.py
Ou use o Script command do IDA (Shift+F2) para colar e executar diretamente.

As cores espelham a paleta de realce de desmontagem do próprio IDA Pro para que a saída pareça nativa.
Exportar JSON gera um arquivo como:
[
{
"name": "read",
"number": 3,
"number_hex": "0x3",
"address": "0x1001a4bc",
"rva": "0x4bc",
"function": "sub_1001A0000",
"category": "File I/O"
},
...
]
A tabela embutida cobre 556 syscalls da camada BSD do Darwin/XNU (classe 0x2000000), incluindo:
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, , …)As Mach traps e os wrappers do libsystem que passam por uma classe de trap diferente não estão incluídos — esta cobertura abrange apenas a classe BSD (SVC #0x80 com X16 = 0x2000000 | num).
SVC em busca de um MOV X16, #imm dentro de 8 instruções. Cargas indiretas (ex.: LDR X16, [...]) serão exibidas como UNKNOWN.SLIDE no topo do arquivo não tem efeito sobre os endereços exibidos — ela é mantida como referência de comentário para correlação com uma sessão ativa do lldb.| Categoria | Cor | Equivalente no IDA |
|---|
| File I/O | #4EC9B0 | Tipo / struct |
| Network | #569CD6 | Palavra-chave |
| Memory | #DCDCAA | Nome de função |
| Process | #CE9178 | Literal de string |
| Threading | #9CDCFE | Variável |
| IPC | #C586C0 | Enum / macro |
| Security | #F44747 | Erro / aviso |
| Time | #6A9955 | Comentário |
| Misc | #858585 | — |
bsdthread_*workq_open, workq_kernreturn, kqueue_workloop_ctl, …)audit_*, __mac_*)