
Analyse binaire parallèle avec IDA Pro, nommage de fonctions assisté par IA, graphe de connaissances Neo4j et moteur d'émulation/hooking/fuzzing phantomrt pour la rétro-ingénierie automatisée des formats PE, ELF et NSO.
Fantôme à travers les binaires.
Un assistant de rétro-ingénierie local, alimenté par l'IA : analyse parallèle d'IDA Pro, nommage de fonctions par IA, un terminal qui ne pue pas, un graphe de connaissances Neo4j de tout ce qu'il a jamais compris, et un serveur MCP pour que Claude puisse rechercher et enchaîner directement dans ce graphe.
Et maintenant — avec phantomrt — il ne se contente pas de lire les murs. Il les traverse : il émule, accroche et fuzze les fonctions qu'il a nommées, et écrit ce qui se passe réellement sur le graphe.
✓ 00 ✓ 01 ✓ 02 ✓ 03 ▸ 04 · 05 · 06 · 07 ✓ 08 ✓ 09 ✓ 10 ✓ 11 ✓ 12 ✓ 13 ▸ 14 · 15
14/16 shards │ 141,203 functions found ████████████████████████████░░░░ 89% ~4s remaining
## Ce que c'est
L'analyse automatique d'IDA Pro est monothread. Sur une DLL il2cpp de 34 Mo, cela prend *des minutes*. spectrIDA divise le binaire en N fragments, les exécute en parallèle via idalib, les fusionne en un seul `.i64`, puis laisse un modèle 8B finement ajusté **nommer chaque fonction** — le tout depuis une interface terminal avec un thème cyberpunk et exactement la bonne dose de sarcasme.
Voilà le chapitre 1, et il se suffit à lui-même : pure vitesse, aucune IA nécessaire si on n'en veut pas.
Le chapitre 2 transforme la sortie en quelque chose qui survit à la session — un graphe Neo4j dans lequel un client MCP (Claude, [pi](https://pi.dev), ou tout ce qui parle MCP) peut réellement vivre, au lieu que vous copiiez-colliez la sortie du décompilateur dans une fenêtre de chat une fonction à la fois :```
Binary ─▶ Parallel IDA Analysis ─▶ Demangle ─▶ AI Naming ─▶ Neo4j Graph ─▶ MCP Server ─▶ Claude
(N idalib shards) (free, real) (stripped (persists, (search/chain/
leftovers forever, rename, live)
only) across sessions)
Chapitre 3 (phantomrt) ajoute la moitié que les outils statiques n'ont jamais : il exécute le code. Émule une fonction sans OS (fonctionne sur des binaires que vous ne pouvez même pas lancer, comme un .nso de Switch), ou accroche le processus en direct, ou le fuzz — et appose le verdict (crashes / needs live state / clean) sur le même nœud de graphe que le nom.
Le détail complet, y compris ce qui reste sur la liste des tâches, se trouve dans le Chapitre 2 et le Chapitre 3.
Ce n'est pas Ghidra. Il fait une chose ennuyeuse (analyse lente + nommage) rapidement, et c'est vraiment amusant à utiliser. 199 téléchargements parlent d'eux-mêmes.
Pas de cloud. Pas de télémétrie. S'exécute entièrement sur votre machine.
| tâche | temps |
|---|---|
| DLL Among Us — IDA mono-thread | ~4 heures |
| DLL Among Us — spectrIDA (16 workers) | 67 secondes |
| Binaire de 153 649 fonctions — passage de nommage complet | nuit |
| Aperçu du binaire (que fait cette chose ?) | ~30 secondes |
Matériel sur lequel ces mesures ont été prises : AMD Ryzen 7 5800X3D (8C/16T), 32 Go de RAM, RTX 4070 12 Go. Un matériel différent déplace les chiffres d'analyse parallèle (plus de cœurs, plus de shards, plus rapide) ; les chiffres de nommage sont principalement liés au GPU. Les chiffres 4 heures/67 secondes pour Among Us datent d'avant le Chapitre 2 et ne sont pas revérifiés indépendamment à chaque version — relancez spectrida analyze vous-même si vous voulez un chiffre pour votre propre machine et binaire, les résultats varient selon la densité des shards et la taille du binaire.
Chiffres effectivement revérifiés pendant le développement du Chapitre 2, même matériel :
Cette ligne NSO est l'équivalent réel de l'ancienne affirmation « 4 heures → 67 secondes » pour Among Us, mesurée à nouveau dans cette version sur un binaire Switch de 74 790 fonctions, sans IA impliquée (démolage uniquement — populate=False). La phase parallèle (16 cœurs, ~55 s) effectue la découverte initiale en shards ; la phase de fusion (~143 s) est mono-thread par conception — une base de données IDA, un écrivain — donc si vous regardez le Gestionnaire des tâches pendant cette partie et voyez 15 cœurs somnoler, ce n'est pas un rapport de bug, c'est de la physique.
Obtenir un nombre honnête ici a été sa propre petite histoire d'horreur. La première version du support NSO s'est exécutée proprement, est sortie avec 0, et a fièrement renvoyé 727 fonctions pour un binaire qui en a environ 75 000 — pas un crash, juste spectaculairement, confiant dans l'erreur, ce qui est en quelque sorte pire. Il s'avère qu'IDA n'a pas de chargeur NSO natif, donc le fichier s'est silencieusement chargé en x86 brut (« metapc ») même si la Switch est en ARM64 depuis le lancement de la console. Chaque shard a exécuté un scan de prologue x86 sur des instructions AArch64 pures et a appelé tout ce qu'il avait accidentellement fait correspondre à une « fonction ». Réparer l'architecture n'a rien résolu en soi, car le binaire était aussi toujours compressé LZ4 en mémoire — donc la moitié de ce qui a été scanné était, généreusement, du bruit. Et même une fois correctement décompressé et signalé AArch64, chaque shard ne cherchait que les cibles d'appels à l'intérieur de sa propre petite tranche du binaire, manquant tous les appels traversant une limite de shard — ce qui, dans un binaire de cette taille, est la plupart d'entre eux. Trois bugs, un nombre, et pas un seul d'entre eux n'a eu la décence de lancer une exception. (Nous avons aussi essayé de réduire la phase de fusion en sautant l'analyse de pile d'IDA — nous avons obtenu une belle accélération et une base de données où Hex-Rays refusait poliment de décompiler la moitié. Cela a été annulé rapidement. À la place, on a gardé le saut de signature FLIRT, beaucoup plus petit et plus sûr, qui vaut un ~3 % haussement d'épaules et n'a rien cassé, ce qui, à ce stade, ressemblait à un trait de personnalité à conserver.)
Sur la précision du nommage : ce n'est pas une vérité de terrain de niveau Ghidra, c'est un modèle 8B qui devine à partir du pseudocode. Les helpers/getters génériques atterrissent bien ; la logique spécifique au jeu est davantage un pile ou face. Renommez tout ce qu'il se trompe — c'est pourquoi rename_function persiste directement dans le graphe.
.i64. Workers configurables via indicateur, configuration ou variable d'environnement..so/Linux) sont inclus ; en ajouter un nouveau est un seul fichier, aucun changement au cœur. spectrida formats liste ce qui est enregistré. Voir Ajout d'un nouveau format binaire.N. Regardez-le réfléchir. Le nom apparaît.B pour nommer chaque fonction sub_* dans la liste. Partez. Revenez.O ou exécutez spectrida overview file.i64. Le modèle lit 120 noms de fonctions échantillonnés et vous dit ce que fait le binaire, quels sont ses sous-systèmes et tout ce qui est pertinent pour la sécurité. A correctement identifié un runtime IL2CPP de 153k fonctions en 30 secondes.C montre les appelants et les appelés. Le modèle les utilise comme contexte lors du nommage — une fonction appelée par est mieux nommée qu'une fonction isolée.pip install spectrida
Prérequis: **IDA Pro 9.x** avec idalib · **Python 3.10+** · **Ollama**```bash
# install Ollama (Windows)
winget install Ollama.Ollama
# pull the model (8.7 GB — go get coffee)
ollama pull hf.co/gdfhhjk/spectrida-re-gguf:latest
# first run — detects your IDA install and sets everything up
spectrida onboard
# or just try the demo right now
spectrida --demo
spectrida analyze GameAssembly.dll spectrida analyze GameAssembly.dll --workers 8 # custom worker count
spectrida open file.i64
spectrida overview file.i64 spectrida overview file.i64 --addr 0x10001000 --addr 0x10353fd0 # include specific functions
spectrida export file.i64 -f idc # IDA script — apply names to any install spectrida export file.i64 -f json # full dump with addresses + sizes spectrida export file.i64 -f csv # spreadsheet spectrida export file.i64 -f symbols # addr name pairs spectrida export file.i64 --named-only # skip sub_* functions
spectrida serve
spectrida onboard
---
## Touches de l'interface TUI
| Touche | Action |
|--------|--------|
| `N` | Nommer la fonction sélectionnée — l'IA diffuse le résultat en direct |
| `R` | Renommer — pré-rempli avec la suggestion de l'IA |
| `D` | Basculer le pseudo-code décompilé (Hex-Rays) |
| `C` | Chaîne d'appels — appelants et appelés |
| `B` | Nommer par lots toutes les fonctions `sub_*` de la liste actuelle |
| `O` | Vue d'ensemble — résumé IA de l'intégralité du binaire |
| `/` | Recherche floue |
| `?` | Aide |
| `Q` | Quitter |
---
## API programmatique
Pas besoin d'interface TUI — pilotez spectrIDA depuis des scripts, Claude Code, notebooks, peu importe :```python
import asyncio
from spectrida.api import open_i64
async def main():
async with open_i64("GameAssembly.i64") as db:
# list all 153k functions
funcs = await db.list_functions()
# name one function — returns name + reasoning + confidence
result = await db.name_function(0x10001000)
print(result["new_name"]) # init_atexit_handler
print(result["reasoning"]) # allocates array of 3 fn ptrs, calls _atexit...
# batch name everything (with live progress)
async def on_progress(done, total, r):
print(f" {done}/{total} {r['old_name']} -> {r['new_name']}")
await db.batch_name(limit=500, rename=True, progress_cb=on_progress)
# ask what the binary does
overview = await db.overview()
print(overview)
# export to IDA script
await db.export("names.idc", fmt="idc", named_only=True)
asyncio.run(main())
hf.co/gdfhhjk/spectrida-re-gguf — Qwen3-8B
affiné pour le reverse engineering.
Entraîné sur :
jtsylve/ida-mcp — IDA sans interface avec idalibApproche d'entraînement : SFT + GRPO ciblé sur les neurones. Seuls les neurones pertinents pour le RE sont ajustés — les connaissances de base de Qwen3 restent intactes, vous ajoutez simplement une compétence très spécifique par-dessus.
S'exécute localement via Ollama. GGUF — fonctionne sur CPU, GPU, ou les deux.
Vous êtes en train de reverser quelque chose. Vous avez un binaire avec 150 000 fonctions. Peut-être 2 000 ont des noms provenant des
métadonnées. Les 148 000 autres sont sub_XXXXXXXX. Vous voulez trouver le code réseau.
Vous ne pouvez pas faire un grep car rien n'a encore de nom.
Un RE humain peut nommer ~50 à 100 fonctions par heure s'il est rapide. À ce rythme, 150k fonctions = 3 ans.
spectrIDA les nomme en une nuit. Pas parfaitement — peut-être 70 % de précision sur les fonctions génériques,
bien plus élevé sur les motifs que le modèle reconnaît. Mais maintenant, au lieu de 148k fonctions sub_, vous avez
network_send_packet, serialize_player_state, validate_checksum — et vous savez où chercher.
Cela ne remplace pas un ingénieur en reverse engineering expérimenté. Cela fait le travail ennuyeux à 80 % pour que vous puissiez vous concentrer sur les 20 % intéressants. C'est la couche d'orientation.
Cas d'utilisation réels :
sub_140001234 pendant 20 minutes en pensant il doit y avoir une meilleure manière~/.spectrida/config.toml :```toml
[ida]
idalib = "C:/Program Files/IDA Professional 9.1"
output_dir = "~/.spectrida/output"
[ollama] base_url = "http://localhost:11434" model = "spectrida-re" # any ollama model name works
[pipeline] workers = 16
Env var overrides: `SPECTRIDA_IDALIB` · `SPECTRIDA_MODEL` · `SPECTRIDA_WORKERS` · `SPECTRIDA_OLLAMA_URL`
---
## Ajout d'un nouveau format binaire
La prise en charge des formats est un système de plugins, pas un tas de branches if/elif — PE, NSO et ELF sont simplement des fichiers sous `spectrida/analysis/formats/`, découverts automatiquement. Exécutez `spectrida formats` pour voir ce qui est actuellement enregistré.```bash
$ spectrida formats
ELF spectrida.analysis.formats.elf.ELFHandler
NSO spectrida.analysis.formats.nso.NSOHandler
PE spectrida.analysis.formats.pe.PEHandler
generic spectrida.analysis.formats.generic.GenericHandler
Le travail d'un gestionnaire de format est restreint : examiner un fichier et dire si vous le possédez, puis décrire sa disposition du code. Tout le reste (stratégie de partitionnement, analyse du prologue GPU, fusion des fragments en un seul .i64) est traité une fois, de manière générique, en dehors du package de format. NSO est l'exemple complet : sa logique de décompression LZ4 + mem2base/add_segm d'idaapi existait déjà dans nso_loader.py (la correction pour les bugs d'architecture erronée/toujours compressée/point d'entrée localement aveugle de l'histoire du chapitre 2) — formats/nso.py est un adaptateur fin exposant ce module existant et validé via le contrat FormatHandler, pas une réécriture.
Pour ajouter un format, déposez un nouveau fichier dans spectrida/analysis/formats/ et rien d'autre. Aucune modification de parallel_analyze.py, shard_worker.py ou du registre — il est détecté en scannant le répertoire pour tout module exposant une instance HANDLER.```python
from spectrida.analysis.formats.base import FormatHandler, PreparedImage, Section
class MyFormatHandler(FormatHandler): name = "MYFMT"
@staticmethod
def sniff(header: bytes, path: str) -> bool:
return header[:4] == b"MYF0" # however you recognize the format
def prepare(self, path: str, workdir: str) -> PreparedImage:
# Format idalib already loads natively (ELF, PE, Mach-O)? Just parse
# the section/segment table — return the original path unchanged.
return PreparedImage(
binary_path=path,
image_base=0,
sections=[Section(name=".text", va=0x1000, raw_off=0x400,
raw_size=0x2000, vsize=0x2000, is_code=True)],
arch=None, # set "x86_64"/"arm64" only if IDA can't detect it itself
)
# Only needed if idalib has NO native loader for this format (NSO is the
# example): do any manual idaapi/ida_segment setup here, called right
# after idapro.open_database() succeeds, before analysis starts.
# def post_open(self) -> None: ...
HANDLER = MyFormatHandler()
Voici l'intégralité du contrat :
| Méthode | Requis ? | Ce qu'il fait |
|---|---|---|
| `sniff(header, path)` | oui | Vérification par magic-byte/extension — ce gestionnaire possède-t-il le fichier ? |
| `prepare(path, workdir)` | oui | Renvoie un `PreparedImage` : le fichier que idalib doit ouvrir + sa table de sections |
| `post_open()` | non (par défaut, aucune opération) | Configuration manuelle des segments pour les formats sans chargeur IDA natif (voir `nso.py`) |
| `make_shard_binary(image, dst, va_start, va_end)` | non (fonctionne par défaut) | Redéfinir uniquement si la mise à zéro des octets de section hors fragment est incorrecte pour votre format (voir `nso.py` — ne jamais mettre à zéro un fichier compressé) |
| `code_range(image)` | non (fonctionne par défaut) | Redéfinir uniquement si « min/max des sections `is_code` » n'est pas la bonne réponse |
| `read_bytes(image, va_start, va_end)` | non (fonctionne par défaut) | Redéfinir si `prepare()` contient déjà les octets pertinents en mémoire (NSO) au lieu du disque |
| `global_entry_points(image, text_start, text_end)` | non (par défaut : None) | Redéfinir uniquement si un scan local par fragment manquerait les véritables points d'entrée — NSO en a besoin car les fonctions feuilles AArch64 ne sont découvrables que via les cibles BL vues ailleurs dans le binaire, pas par un scan local du prologue |
Regardez `formats/pe.py` pour le gestionnaire le plus simple possible (analyse pure des en-têtes, sans redéfinitions) et
`formats/nso.py` pour le cas complet (intègre la décompression + configuration manuelle des segments + chaque redéfinition).
Les paquets tiers peuvent également enregistrer un gestionnaire, sans toucher du tout au source de spectrIDA, via
le groupe de points d'entrée `spectrida.formats` :```toml
# in a separate package's pyproject.toml
[project.entry-points."spectrida.formats"]
myformat = "spectrida_myformat_plugin:HANDLER"
La couverture de test pour le système de format se trouve dans tests/test_formats.py — Python pur, pas besoin d'IDA/idalib, donc elle s'exécute dans le CI.
Le Chapitre 1 était un IDA plus rapide, plus drôle. Le Chapitre 2 est spectrIDA en tant que coéquipier : un graphe de connaissances persistant et interrogeable de chaque fonction qu'il a jamais nommée, et un serveur MCP pour que Claude (ou tout client MCP — pi fonctionne aussi) puisse le rechercher et raisonner à travers lui directement, au lieu que vous copiiez-colliez la sortie du décompilateur dans une fenêtre de chat.```bash spectrida install mcp
C'est tout. Il enregistre le serveur avec Claude Code et pi automatiquement (en incluant `mcp` +
`neo4j` si un simple `pip install spectrida` les a ignorés), écrit leur configuration, et vous indique
quel redémarrage vous lui devez.
**Ce que Claude obtient réellement, une fois Neo4j en cours d'exécution (section `[graph]` de la configuration `spectrida`,
ou pointez-le simplement vers une instance locale) :**
- `search_functions` / `get_function` / `get_callees` / `get_callers` / `trace_chain` — rapides,
lectures en cache du graphe. `get_function` renvoie le pseudocode **et** le désassemblage (limites exactes des instructions
et opérandes — que la couche de pseudocode ne peut pas vous donner, ce qui compte dès que vous
passez de « qu'est-ce que cela fait » à « où exactement devrais-je patcher cela ») ainsi que les
appelants/appelés en ligne, afin que Claude décide s'il doit creuser plus profondément en vérifiant si un appelé
est toujours `sub_*` directement dans la réponse — pas d'aller-retour supplémentaire juste pour découvrir qu'il n'y a
rien de plus à voir.
- `get_full_pseudocode` / `rename_function` — lectures/écritures en direct et autoritaires directement vers le
`.i64` lorsque l'extrait en cache ne suffit pas ou qu'un nom est enfin trouvé.
- `analyze_binary` — donnez-lui un binaire qu'il n'a jamais vu (PE ou NSO, parallélisé par sharding dans les deux cas)
et il exécute tout le pipeline — analyser → démasquer (Itanium *et* MSVC) → nommer par IA les
vestiges réellement strippés → tout pousser dans le graphe — comme une tâche d'arrière-plan que vous interrogez,
de sorte qu'une exécution de plusieurs minutes ne bloque jamais la conversation.
- `doctor` / `start_all` — vérifiez ou démarrez llama-server + Neo4j sans quitter le chat.
Si llama-server lui-même n'est installé nulle part, `start_all` le récupère via winget (Windows) ou
brew (macOS) d'abord — pas besoin de téléchargement/configuration séparé de llama.cpp.
Ce n'est pas magique — une fonction qui est toujours `sub_140001234` parce que personne ne l'a encore regardée est
toujours `sub_140001234`. Mais le graphe se souvient de tout ce que le modèle *a* découvert, pour toujours,
entre les sessions, et Claude peut le parcourir comme un collègue qui a déjà lu la base de code au lieu
de regarder une fonction à la fois.
**À venir :**
- **Nommage contextuel profond** — suivre les arbres d'appels sur N niveaux de profondeur, fournir la chaîne complète au modèle.
Une fonction à 3 sauts de `encrypt_block` devrait savoir qu'elle est dans le chemin crypto.
- **Désobfuscation** — détection de motifs TigressVM et traçage des handlers
- **Patching réel** — le désassemblage est maintenant dans le graphe, donc un agent *peut* planifier un patch
au niveau des octets ; transformer « voici l'instruction exacte à modifier » en « et voici l'écriture » est la prochaine étape.
---
## Chapitre 3 — le fantôme traverse les murs
Les chapitres 1 et 2 lisent le binaire et s'en souviennent. Mais lire une fonction vous dit ce qu'elle *est*,
jamais ce qu'elle *fait* quand vous appuyez sur la gâchette. Le chapitre 3 — [**phantomrt**](https://pypi.org/project/phantomrt/) —
appuie sur la gâchette.```bash
pip install "spectrida[atlas]"
Il prend une fonction spectrIDA déjà nommée et lui applique une des trois opérations spectrales suivantes :
.nso de Switch ou un .so Android.Ensuite, il inscrit le verdict sur le même nœud Neo4j sous forme de propriétés dyn_*, de sorte que l'agent qui parcourt
le graphe voie le nom et le comportement au même endroit. Six nouveaux outils MCP —
emulate_function, hunt_crashes, live_trace, dynamic_overview, risk_functions,
learn_vm — tous soutenant le même graphe. Le coin de raisonnement est le LLM qui pilote ; phantomrt
veille juste à ce qu'il dispose de faits d'exécution réels pour raisonner, plutôt que de simples intuitions.```
spectrIDA (names it) ─▶ phantomrt (runs it) ─▶ graph (dyn_status / crash / live args) ─▶ the agent reasons
**Et, dans l'esprit de l'histoire d'horreur NSO ci-dessus :** la première vraie chasse aux bugs a honnêtement trouvé
*rien* — et la raison était plus intéressante qu'un crash ne l'aurait été. Pointée vers un
FreeType vraiment vieux, vraiment vulnérable, le fuzzing aveugle n'a rien donné. Le fuzzing guidé par couverture a ensuite
signalé un triomphant **64 000 arêtes** couvertes — ce qui était un mensonge, car le binaire était PIE et
ASLR rerandomisait silencieusement les adresses à chaque exécution, donc la "nouvelle couverture" était surtout le chargeur
qui mélangeait les cartes. Désactivez ASLR, le nombre honnête tombe à *réellement* 727 arêtes, et ça plafonne
là — car chaque graine était une police TrueType, donc le fuzzer était piégé dans un analyseur et
ne pouvait pas muter structurellement pour atteindre le code CFF/Type1/BDF où vivent réellement les bugs. La
solution n'était pas un mutateur plus intelligent, c'étaient de meilleures graines : l'agent a récupéré de vrais échantillons
OpenType/Type1/BDF, la couverture a bondi de 727 → 4 013 avant une seule itération de fuzz, et il a exploré correctement.
Toujours pas de crash dans le budget — ce qui est l'état honnête d'une exécution de 3 minutes sur un cœur par rapport à un
travail qui prend normalement des heures. La mécanique est réelle. Elle a attrapé son *propre* faux nombre au lieu de
le signaler. C'est tout l'intérêt.
**Avertissement honnête sur les fantômes :** phantomrt est `0.1.0`. Alpha. C'est une couche dynamique solide, pas un oracle
magique à bugs — il a trouvé instantanément des bugs plantés dans une cible jouet, et sur des cibles réelles, il vous dit
honnêtement quand il est bloqué (`needs_state`), quand un crash n'est qu'un *candidat* (allez vérifier que le pointeur
est réellement contrôlé par l'entrée), et quand il a juste besoin de plus de temps et de meilleures graines. Les binaires
Switch ne tournent pas en direct — Frida a besoin de quelque chose qu'il peut lancer — donc là, l'émulation est la seule
porte et il dira `needs_state` souvent. C'est honnête, pas cassé.
C'est le lourd supplément intentionnellement (`torch`, `unicorn`, `frida`) — le `pip install spectrida`
de base n'en tire rien. La source vit dans [`phantomrt/`](https://github.com/ggfuchsi-oss/spectrida-reverse_engineering_stack/blob/HEAD/phantomrt/) ; son propre README teinté de fantôme est
[juste là](https://github.com/ggfuchsi-oss/spectrida-reverse_engineering_stack/blob/HEAD/phantomrt/README.md).
*Le fantôme statique nomme vos fonctions. Celui-ci les fait avouer.* 👻
---
## Licence
MIT. Faites-en ce que vous voulez. Si ça marche, cool.
Sinon, blâmez la quantification GGUF.
Construit avec dépit, café et une RTX 4070.
Le modèle a 199 téléchargements sans marketing. Chacun ajoute 0,01 % à la vitesse de développement.
(Ce n'est pas vrai. Mais c'est proche.) 👻
| binaire | fonctions | tâche | temps / résultat |
|---|
| test_small.dll (PE) | 189 | analyse parallèle, 4 workers, CLI | 6,4 s |
| test_small.dll (PE) | 164 | pipeline MCP complet (analyse + démolage + écriture du graphe) | 9,8 s |
| main.nso — Mario Odyssey (NSO), 16 workers | 28 038 fonctions seed | phase de scan parallèle en shards | 54,5 s |
| main.nso — Mario Odyssey (NSO), 16 workers | 74 790 fonctions totales | + phase de fusion/analyse complète | 143,1 s |
| main.nso — Mario Odyssey (NSO), 16 workers | 74 790 fonctions totales | temps mur de bout en bout | 197,6 s |
| main.nso — Mario Odyssey (NSO) | 74 790 | résolu par démolage seul (ABI Itanium, gratuit, pas d'IA) | 67 300 (90,0 %) |
Player$$TakeDamageD bascule le pseudocode Hex-Rays..idc ou fichier de symboles. Le .idc applique tous les noms générés par IA dans n'importe quelle installation IDA en un clic.from spectrida.api import open_i64. Pilotez tout depuis des scripts, notebooks ou Claude Code sans toucher à l'interface TUI.spectrida install mcp le connecte directement à Claude Code et/ou pi, sans édition manuelle de JSON. Claude peut alors rechercher/lire/parcourir un graphe de fonctions basé sur Neo4j (nom, pseudocode, désassemblage, appelants/appelés) et lancer une analyse fraîche sur un nouveau binaire lui-même — analyze_binary exécute tout le pipeline (analyse parallèle → démolage → nommage IA → graphe) à partir d'un seul appel d'outil, en tant que tâche de fond qu'il interroge. Fonctionne sur PE et NSO. Voir Chapitre 2 ci-dessous.spectrida --demo) — essayez le tout avec zéro configuration. Pas d'IDA, pas d'Ollama.