
Suite CLI Rust qui décompresse statiquement, désobfusque et dépaquette le code natif, le bytecode, les scripts, les firmwares et les paquets d'applications à travers plus de 15 écosystèmes via un pipeline automatique unique.
Commencer · Entrées prises en charge · Récupération automatique · Comparaisons d'outils · Preuves · Documentation
Disrobe est une suite en ligne de commande écrite en Rust pour décompiler, désobfusquer et décompresser des logiciels. Utilisez-la pour trier un fichier inconnu, récupérer du code à des fins d'ingénierie inverse, extraire des indicateurs pour une investigation, ou préparer des artefacts pour un désassembleur.
Récupérez du Python à partir de bytecode et d'applications figées, du Java à partir de classfiles et de DEX, du C# à partir de CIL, du JavaScript à partir de bundles, du Lua à partir de machines virtuelles personnalisées, et du C ou du Rust à partir de code natif. Extrayez des fichiers à partir d'installateurs, de firmwares, de paquets mobiles et d'applications Electron, Tauri ou Wails. Conservez le code source récupéré, les symboles, les chaînes, les types et la provenance ensemble pour une analyse ultérieure.
La compilation complète catalogue 170 familles à travers 15 écosystèmes et détecte 103 formats de conteneurs. disrobe auto identifie chaque couche, exécute une passe correspondante, et suit les enfants récupérés dans leurs propres chemins de récupération. Des commandes dédiées exposent des contrôles plus fins, des rapports d'analyse et des backends optionnels. La récupération s'exécute statiquement par défaut ; le code source, la structure, la sortie partielle et les limites de clés manquantes restent distinguables dans le résultat.
Si Disrobe vous est utile, envisagez de mettre une étoile au dépôt.
Regarder la vidéo complète · Lire la transcription
Vingt commandes CLI en 2 minutes 12 secondes : décompresser un exécutable natif, récupérer du Python et du Lua, diviser des modules JavaScript, restaurer des source maps, inspecter du WebAssembly et des ressources Android, extraire des indicateurs, et préserver les rapports et les hachages d'artefacts. Le dernier chapitre montre la configuration du projet, la configuration de l'IDE, les annotations d'analyste et les complétions de shell. La transcription inclut l'inventaire complet des commandes de la compilation enregistrée ; la carte des capacités explique ses limites de prise en charge.
Téléchargez l'archive correspondant à votre plateforme depuis GitHub Releases, vérifiez-la par rapport au fichier SHA256SUMS de la version, et placez disrobe dans votre PATH. Les archives de version incluent des bundles de signature ; le guide de vérification explique comment les inspecter.
| Plateforme | Cibles de version |
|---|---|
| Windows | x86-64, ARM64 |
| macOS | x86-64, ARM64 |
| Linux | x86-64 et ARM64 avec glibc ; x86-64 avec musl |
Vérifiez le binaire que vous avez installé :```sh disrobe --version disrobe --help
Pour compiler la CLI à partir d'un clone, installez la chaîne d'outils Rust du dépôt et les [prérequis de compilation natifs](https://github.com/1-3-7/disrobe/blob/main/docs/src/installation.md), puis exécutez :```sh
cargo build --locked --release -p disrobe-cli --bin disrobe
L'exécutable est target/release/disrobe, ou target/release/disrobe.exe sous Windows. Consultez le guide d'installation pour les feature flags et les builds allégés.
Commencez par une application, une bibliothèque ou un package. Identifiez-le, récupérez ses couches reconnues, puis inspectez le résumé de récupération :```sh disrobe identify path/to/application disrobe auto path/to/application --out recovered/ --capture-stages disrobe context --out recovered/
`identify` rapporte le format et les signaux disponibles. `auto` extrait et récupère les couches reconnues. `context` résume les passes résultantes, la confiance et la provenance. Avec `--capture-stages`, inspectez chaque étape sous `recovered/01-*/`, `recovered/02-*/` et `recovered/final/` ; `chain.json` enregistre la topologie et les hachages, et `recovery.json` enregistre les résultats et les timings.
Utilisez une commande dédiée lorsque vous connaissez la sortie dont vous avez besoin :```sh
disrobe py decompile module.pyc --out python-source/
disrobe js deob bundle.js --full --out readable.js
disrobe native decompile application.exe --out native-source/
disrobe native export packed.exe --format ghidra --out ghidra-input/
disrobe webview desktop.exe --out frontend/
Le décompilateur natif émet du C par défaut sur x86-64 ; --format rust sélectionne Rust. AArch64, ARM32 et MIPS32 émettent du pseudo-C. native export reconstruit les images PE packées prises en charge pour un outil d'analyse externe ; webview écrit l'arborescence des ressources frontend récupérées sans démarrer l'application.
Le dépôt inclut un minuscule module WebAssembly pour le playground du navigateur. À partir d'un clone, avec la CLI complète dans votre PATH :```sh
disrobe wasm decompile playground/public/samples/add.wasm --target json --out add.summary.json
disrobe wasm decompile playground/public/samples/add.wasm --target wat --out add.lifted.wat
disrobe auto playground/public/samples/add.wasm --out recovered/ --capture-stages
La première commande écrit `add.summary.json` ; la seconde écrit du texte WebAssembly dans `add.lifted.wat`. La récupération automatique
sélectionne une chaîne disponible et écrit ses artefacts sous `recovered/` ; `--capture-stages` conserve
les résultats intermédiaires. Ces opérations inspectent le module sans exécuter sa fonction exportée.
Inspectez les fichiers récupérés en parallèle du rapport : l'identification seule n'établit pas la récupération. Les constructions non prises en charge, l'absence de matériel de clé et les chaînes indisponibles apparaissent dans le résultat. Le [guide des résultats](https://github.com/1-3-7/disrobe/blob/main/docs/src/reading-a-result.md) explique les artefacts, les diagnostics, les résultats partiels et la provenance.
[Ouvrir le playground dans le navigateur](https://1-3-7.github.io/disrobe/playground/) · [Suivre le démarrage rapide](https://github.com/1-3-7/disrobe/blob/main/docs/src/quickstart.md)
## Trouver votre entrée
**Récupérer** signifie qu'un chemin accessible émet du code source, des octets ou de la structure. **Partiel** signifie qu'il ne récupère qu'une partie de ces informations. **Détection seule** signifie qu'il identifie la famille sans récupérer son corps protégé. Ces niveaux décrivent des opérations sur des entrées prises en charge ; un nom de famille seul ne garantit pas que chaque version ou configuration soit récupérable. Les listes ci-dessous incluent le catalogue complet des familles et les formats supplémentaires exposés par des commandes et extracteurs dédiés.
| Entrée | Récupération et sortie | Commandes et guide |
|---|---|---|
| Python | Bytecode et marshal CPython 1.0 à 3.15 vers source ; désassemblage PyPy, MicroPython `.mpy` v0 à v6, Jython, IronPython et Brython ; extraction de charges utiles gelées ; noms, signatures et repli structurel Cython `.pyd`/`.so` | `py`, `pyinstaller`, `pyarmor`, `pyfreeze`, `nuitka` · [Python](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/python.md) |
| JavaScript / TypeScript | Désobfuscation de source, inversion de minification, découpage de modules, source maps, inspection des données en cache V8 et des runtimes empaquetés | `js` · [JavaScript](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/javascript.md) |
| WebAssembly | `.wasm` vers WAT, Rust, TypeScript, pseudo-source C ou JSON ; inspection du Component Model et du graphe de types GC ; inversion des obfuscations prises en charge | `wasm` · [WebAssembly](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/wasm.md) |
| JVM / Android | `.class`, JAR, DEX, APK, AAB ; source Java, idiomes Kotlin/Scala, informations de manifest et de signature, rapports de protecteurs et sidecars de mapping | `jvm`, `apk` · [JVM et Android](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/jvm-android.md) |
| .NET | Métadonnées PE/CLR et CIL vers pseudo-source C#, F# ou VB ; inspection ReadyToRun et Native AOT ; extraction de bundle single-file | `dotnet` · [.NET](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/dotnet.md) |
| Natif | Identification ou analyse PE32/PE64, EFI PE, ELF32/ELF64, modules noyau, Mach-O thin/fat, COFF, MZ, NE, LE, LX et code brut ; émission de source sur les chemins spécifiques à l'architecture ci-dessus | `native`, `macho`, `semdiff` · [Natif](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/native.md), [décompilation](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/native-decompile.md) |
| Go | Métadonnées de runtime PE/ELF/Mach-O, noms de fonctions et de types supprimés, fichiers `embed.FS`, rapports garble et littéraux récupérables | `go` · [Go](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/go.md) |
| Swift / Objective-C | Classes, protocoles, champs, sélecteurs, symboles dé-manglés Mach-O ; tranches universelles ; dylibs du cache partagé dyld | `swift`, `macho` · [Swift](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/swift.md) |
| Lua | Bytecode Lua 5.1 à 5.4, LuaJIT 2.0/2.1, Luau, Garry's Mod Lua (GLua) ; rapports de fidélité source et par entrée ; récupération de VM et de chaînes prise en charge | `lua` · [Lua](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/lua.md) |
| PHP | Pelage de chaînes source/eval, boucles de décodage à clé littérale et couches AES, extraction Phar, récupération de `op_array` sérialisé ; les enveloppes d'encodeurs commerciaux restent limitées par la clé | `php` · [PHP](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/php.md) |
| Ruby | Binaires InstructionSequence MRI/YARV 2.6 à 3.4 et bytecode mruby RITE vers Ruby ; classification freezer et AOT | `ruby` · [Ruby](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/ruby.md) |
| Erlang / Elixir | Modules BEAM et archives EZ ; code abstrait survivant ou `Dbgi` vers source, repli Core Erlang, listing d'instructions | `beam` · [BEAM](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/beam.md) |
| ActionScript 3 | Blocs `DoABC` SWF FWS/CWS/ZWS et bytecode ABC brut vers désassemblage et pseudocode AS3 | `as3` · [ActionScript](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/as3.md) |
| Runtimes mobiles | Analyse d'en-tête Hermes v60 à v96, lift pseudo-JavaScript v62/v71/v74/v76/v83/v84/v89/v96 ; corps source du kernel Dart Flutter ; déclarations, chaînes et désassemblage AOT ARM64 | `hermes`, `flutter`, `mobile` · [Mobile](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/mobile.md) |
| Shell / documents | PowerShell, Bash, Batch, VBScript, WSH ; p-code et stomping VBA3/5/6/7 ; source de macros Office, formules XLM BIFF8/BIFF12, scripts/actions intégrés aux PDF | `shell` · [Shell et documents](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/shell.md) |
| Autres artefacts de langages | Op-trees/bytecode Perl, métadonnées R RDS et Rcpp, starkits Tcl, sorties Haxe JS/SWF/HashLink/Neko ; empreintes, symboles et structure partielle Nim, Zig, Crystal et D | `auto`, API de bibliothèque · [Langages de script](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/shell.md), [natif](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/native.md) |
| Python pickle | Désassemblage de protocole, trace symbolique, reconstruction et classification sans appeler les reducers pickle | `pickle` · [Pickle](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/pickle.md) |
| Archives / firmware / frontends | La liste complète des conteneurs ci-dessous ; Electron ASAR, cartes intégrées Tauri v1/v2, arborescences `embed.FS` Wails v2 | `extract`, `webview`, `auto` · [Conteneurs](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/containers.md), [webview](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/webview.md) |
<details>
<summary><strong>Python : chaque freezer, protecteur et obfuscateur de source nommé</strong></summary>
| Famille ou format | Prise en charge et prérequis |
|---|---|
| PyInstaller 2.x à 6.20+ | Récupérer les archives et le bytecode intégrés, y compris les couches AES-CTR/CFB prises en charge |
| Nuitka onefile, standalone, module, wheel | Extraire les charges utiles onefile ; récupérer les symboles et la structure visible depuis Python à partir des formes compilées |
| cx_Freeze, py2exe, shiv, pex, Briefcase | Extraction d'empaqueteur via `pyfreeze` ; la commande reste expérimentale |
| PyOxidizer | Extraction expérimentale, non validée |
| SourceDefender `.pye` | Déchiffrement statique via `py sourcedefender` et `sourcedefender.decrypt` |
| PyArmor v3 (DES hérité), PyArmor v4 (mixte hérité), PyArmor v5 (AES hérité) | Détection seule : frontière de clé encapsulée RSA |
| PyArmor v6, PyArmor v7 | Récupération statique partielle ; le mode super et les clés indisponibles restreignent la sortie |
| PyArmor v8, PyArmor v9 / 9-Pro | Récupération statique du wrapper lorsque le matériel de clé est disponible. Le résultat publié <!-- m:pyarmor_frac -->72 / 72<!-- /m --> compte uniquement le décodage complet du `CodeObject` racine pour les wrappers v8/v9 default-trial nommés ; il n'établit pas l'équivalence de source ni ne couvre le mode licence enregistrée/pro, BCC ou super |
| Kramer / Specter, Berserker, BlankOBF, PlusOBF, Wodx, pyobfuscate.com, pyobfuscate.com (2026 XOR/lambda), PyObfuscator (mauricelambert), Manglify, Oxyry, pyminifier, famille d'obfuscateurs en ligne, Xindex, Patchwork, pyc-zipper | Récupération statique de source/loader via l'évaluateur AST ; les couches individuelles et les résidus sont rapportés |
| Jawbreaker, ObfuXtreme | Récupérer le corps présent dans l'artefact ; les charges utiles récupérées à l'exécution restent absentes |
| python-obfuscator (PyPI), pyobfus, Pypacker | Pelage partiel de wrapper et classification |
PyArmor peut nécessiter le fichier de runtime correspondant à côté du wrapper. Son chemin BCC dédié requiert `--allow-bcc` et émet des lifts natifs statiques ainsi que des squelettes Python pour les corps modélisés ; la récupération automatique sensible au chemin peut publier les mêmes artefacts BCC. Seul le hook dynamique PyArmor v6/v7 exécute du code d'exemple, derrière `--allow-dynamic` avec un watchdog. `--allow-bcc` n'autorise que l'analyse statique dans l'arborescence et n'exécute pas l'échantillon ni n'invoque d'outils externes. [Détails des versions et modes](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/python.md#pyarmor).
</details>
<details>
<summary><strong>JavaScript, WebAssembly et applications web empaquetées</strong></summary>
| Famille ou format | Prise en charge et route |
|---|---|
| obfuscator.io / javascript-obfuscator, JS-Confuser | Récupérer les tableaux de chaînes pris en charge, les transformations dispatcher/control-flow, les prédicats opaques et les couches de loader ; commandes directes et `js.deob` |
| Jscrambler, js-obfuscator (jsobfu) | Récupération partielle de templates et de transformations statiques |
| JSFuck, aaencode, jjencode, JSFiretruck, Dean Edwards Packer | Décodage statique via des opérations dédiées et des routes de chaîne reconnues |
| JSDefender, Arxan / Digital.ai | Détection et pelage partiel de transformations statiques ; les opérations JS commerciales protégées nécessitent l'option d'autorisation de la commande |
| PACE | Détection seule |
| webpack 4, webpack 5, Vite, Rollup, Rolldown, esbuild, Turbopack, Bun, Parcel, Browserify, SystemJS ; modules AMD | Débundling/récupération de modules directe. La chaîne dispatche webpack et Vite ; les marqueurs de catalogue pour les autres bundlers ne rendent pas à eux seuls ces routes automatiques |
| bytenode `.jsc`, Node SEA, nexe, nw.js | Inspection/carving des données V8 empaquetées ; Node SEA et bytenode ont des branches de chaîne explicites |
| Electron ASAR, Tauri v1/v2, Wails v2 | Récupérer les arborescences frontend intégrées ; Electron/Tauri utilisent `webview.carve`, Wails utilise `go.classify` ; `webview` direct gère les trois |
| Bun standalone, Deno eszip v2 à v2.3 / `deno compile` | Récupérer les graphes de modules intégrés via les lecteurs de conteneurs respectifs ; eszip expose aussi un lecteur Rust direct |
| Wobfuscator, Jscrambler WASM, wasm-mixer / Wasmixer | Inversion partielle des transformations prises en charge via `wasm.deob` ; des fixtures en forme d'outil évaluent les transformations, sans sortie commitée provenant de ces obfuscateurs eux-mêmes |
| Tigress → Emscripten, wasm-name-obfuscator | Détecter et classifier ; l'helper Tigress est hors du chemin d'exécution `wasm deob`, et les noms originaux détruits restent indisponibles |
[Routes JavaScript](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/javascript.md) · [Limites Wasm](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/wasm.md) · [Dispositions frontend intégrées](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/webview.md).
</details>
<details>
<summary><strong>Packers, protecteurs et familles d'obfuscation natifs</strong></summary>
| Famille | Prise en charge et route |
|---|---|
| Donut, sRDI | Récupérer le module intégré à partir des dispositions de shellcode-loader prises en charge |
| UPX, ASPack, Petite, MPRESS, FSG, PECompact, Yoda's Crypter, NSPack, MEW, kkrunchy | Routines de dépaquetage implémentées, accessibles via `native unpack` et la chaîne de packers ; la fidélité varie selon la famille et le spécimen |
| ASProtect, Morphine, nPack, NeoLite, PolyCryptor, Warzone Crypter | `StubEvalPending` : le comportement de l'émulateur dispose de preuves de stub construites sur spécification ; la récupération réelle de packers commerciaux n'est pas validée et aucun dispatch de dépaquetage n'est annoncé |
| Yoda's Protector, VMProtect, Themida / WinLicense | CLI et auto en détection seule. Des helpers Rust séparés exposent le carving assisté par l'original ou la récupération de sections protégées ; ils n'établissent pas une dévirtualisation complète du programme |
| PE-Protector, PELock, Enigma Protector, Armadillo, Obsidium, WinLicense | Détection seule |
| DotNetPatcher, NetCryptor | Déléguer la couche managée à la passe .NET |
| Aplatissement OLLVM, flux de contrôle factice, substitution d'instructions ; Tigress CFF | Transformations de désobfuscation statique et rapports pris en charge via les API Rust natives ; l'analyse applicable apparaît dans les rapports de récupération native |
| Alcatraz, Emotet CFF, Mirai, Dridex, Trickbot, obfus.h, Cryptify (rust-obfuscator), guardian-rs, obfusheader.h, obfuscxx, Amice | Signatures d'obfuscation native nommées ; les helpers individuels de chaînes/control-flow ont une récupération plus étroite que la famille complète détectée |
L'analyse native récupère aussi les symboles Rust/C++, les RTTI et vtables C++, les modèles d'objets Delphi/C++Builder et les ressources DFM, les informations DWARF/PDB/STABS, les imports, les graphes d'appels, les signatures cryptographiques et les correspondances FLIRT. L'analyse d'instructions couvre x86, ARM, RISC-V, MIPS, PowerPC, SPARC, eBPF et AVR ; l'émission de source concerne l'ensemble d'architectures plus restreint listé ci-dessus. [Analyse native](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/native.md) · [Preuves de dépaquetage et de récupération d'octets](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/native-unpack.md) · [Désobfuscation](https://github.com/1-3-7/disrobe/blob/main/docs/src/anti-analysis.md).
</details>
<details>
<summary><strong>Familles de packages JVM, Android, .NET et mobiles</strong></summary>
| Famille | Prise en charge et prérequis |
|---|---|
| Zelix KlassMaster, Allatori, Stringer, DashO | Récupération de chaînes pour les motifs pris en charge, suivie de la décompilation des classfiles |
| DexGuard | Détection, pelage structurel et émulation de déchiffrement de chaînes dans la classe pour les constantes à clé prises en charge |
| BlackObfuscator | Reconnaissance du dispatcher DEX et annotation de l'ordre des blocs |
| ProGuard / R8 | Rejeu de mapping vers un sidecar de restauration de noms ; les noms originaux nécessitent `mapping.txt` |
| yGuard, SkidSuite2, JBCO | Détection seule |
| Promon SHIELD, Guardsquare DexGuard RASP, Guardsquare ThreatCast, Appdome, OneSpan, Arxan / Digital.ai, Zimperium zShield, Licel DexProtector | Identification RASP Android et rapports structurels |
| ConfuserEx2 | Récupération de constantes sur échantillons réels et déflatage du flux de contrôle ; les ressources chiffrées peuvent conserver une frontière de clé à l'exécution |
| Eazfuscator.NET | Déchiffrement de chaînes et lift de VM évalués sur modèles ; la fixture de VM provient d'un virtualiseur interne au dépôt, pas du produit commercial |
| KoiVM (ConfuserEx VM) | Corps virtualisés liftés vers CIL sur des sorties commitées d'outils réels |
| ConfuserEx, Dotfuscator, Dotfuscator CE, SmartAssembly, Babel, DeepSea, Spices.Net, Goliath, Skater, .NET Reactor, CryptoObfuscator, ArmDot, Agile.NET, Obfuscar, DotNetPatcher, NetCryptor, BitMono | Détection et récupération partielle spécifique à la famille : noms, chaînes, ressources ou structures de méthodes. BitMono figure dans le détecteur de protecteurs au-delà du catalogue de chaînes .NET à 22 entrées |
| Themida (wrapper .NET), ILProtector, MaxToCode | Détection seule pour les corps à clé de loader natif |
| React Native APK, React Native IPA ; bytecode React Native Hermes | Extraire les charges utiles JS/Hermes et router le bytecode pris en charge vers le lift Hermes |
| Kernel Dart Flutter ; snapshot AOT Flutter (`libapp.so`) | Récupération de la table source du kernel ; déclarations AOT, métadonnées et désassemblage ARM64. La version du snapshot et les noms disponibles contraignent la récupération |
| Xamarin / .NET MAUI APK, Apache Cordova APK, Capacitor APK, NativeScript APK | Identification du runtime et extraction prise en charge des packages/membres |
| Android APK (`classes.dex`), Android app bundle (AAB / APKM / XAPK), IPA | Inspection de package et extraction des enfants ; la récupération en aval dépend du runtime intégré |
Les déchiffreurs de chaînes .NET pour SmartAssembly, Spices.Net, Skater, .NET Reactor, Eazfuscator.NET et CryptoObfuscator sont évalués sur des algorithmes modélisés, pas sur des assemblys produits par les éditeurs et commités. ConfuserEx2, Obfuscar et BitMono disposent de preuves sur des assemblys protégés réels. [JVM/Android](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/jvm-android.md) · [.NET](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/dotnet.md) · [Mobile](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/mobile.md).
</details>
<details>
<summary><strong>Familles Lua, PHP, shell, Ruby, BEAM, Swift, Go et ActionScript</strong></summary>
| Famille | Prise en charge et prérequis |
|---|---|
| IronBrew2 | Récupération de VM, vérifiée par différentiel d'exécution sur des sorties réelles 2.7.0 standard et MAX |
| Prometheus | Récupération partielle, y compris les arbres de dispatch `Vmify` empilés pris en charge |
| MoonSec V1, MoonSec V2, MoonSec V3, AztupBrew, DarkSec, Boronide, PSU, WeAreDevs LuaU, luaobfuscator.com, SLua (Unity Lua 5.3), Hercules | Récupération Lua partielle ; les preuves de VM de forme MoonSec utilisent un bootstrap synthétique |
| Luraph | Détection seule |
| Bytecode Luau, Garry's Mod Lua (GLua) | Reconnaissance de dialecte ; lift Luau et récupération GLua partielle |
| ionCube, SourceGuardian, Zend Guard | Détection d'enveloppes PHP commerciales ; les clés résidant dans le loader restent une frontière. Les cas hérités à clé statique peuvent produire une structure `op_array` partielle |
| FOPO, Better PHP Obfuscator | Pelage statique de chaînes eval PHP, avec exigences de clé littérale pour les couches chiffrées |
| Invoke-Obfuscation (token), Invoke-Obfuscation (AST), Invoke-Obfuscation (string), Invoke-Obfuscation (encoding), Invoke-Obfuscation (compress) ; Invoke-Stealth, PowerHell, Chameleon, psobf | Récupération PowerShell statique |
| Invoke-Obfuscation (launcher), ISESteroids | Récupération PowerShell partielle |
| Bashfuscator (token), Bashfuscator (string), Bashfuscator (obfuscate), Bashfuscator (compress) ; indirection Bash (IFS/eval) ; node-bash-obfuscate (eval par table de chunks) | Récupération Bash statique |
| Obfuscation Batch (`%random%`), obfuscation Batch (indirection set) ; macro VBA (décompilation p-code + stomping) | Pelage Batch et récupération source/p-code VBA |
| YARV InstructionSequence (`.rb` compilé), bytecode mruby RITE | Récupération de source Ruby |
| Exécutable auto-extractible OCRA, package RubyScript2Exe | Classification/récupération partielle de freezer |
| Classe compilée JRuby, image native TruffleRuby | Détection seule via le catalogue Ruby |
| Fichier BEAM (module compilé Erlang / Elixir), archive EZ (modules `.beam` encapsulés en ZIP) | Extraction de module, récupération de source/chunk de débogage ou repli Core Erlang |
| garble | Métadonnées Go et littéraux pris en charge ; le hachage des noms originaux ne peut être inversé sans la graine manquante |
| Métadonnées Mach-O Swift / Objective-C, binaire Mach-O fat (universel), cache partagé dyld | Métadonnées de runtime, récupération de tranches et de dylibs |
| SwiftShield | Analyseur de mapping ; le mapping doit être fourni pour récupérer les noms originaux |
| SWF (Flash, FWS/CWS/ZWS) DoABC, bytecode ABC brut | Désassemblage et pseudocode de corps de méthode |
| secureSWF, DoSWF, Kindi, Irrfuscator, swfLock | Détection seule |
[Catalogue des familles](https://github.com/1-3-7/disrobe/blob/main/docs/src/catalog.md) · [Lua](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/lua.md) · [PHP](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/php.md) · [Shell](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/shell.md) · [Ruby](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/ruby.md) · [BEAM](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/beam.md) · [Go](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/go.md) · [Swift](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/swift.md) · [AS3](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/as3.md).
</details>
<details>
<summary><strong>Les 103 formats de conteneurs enregistrés</strong></summary>
| Catégorie | Formats |
|---|---|
| Archives générales | ZIP, TAR, tar.gz, tar.bz2, tar.xz, tar.zst, 7z, RAR, CAB, CPIO, ar, ARJ, ARC, LZH, LZO/lzop, uzip, Xamarin xalz, PAR2, StuffIt |
| Archives applicatives et de langages | JAR, WAR, APK, XPI, WHL, EGG, CRX, NUPKG, VSIX, PYZ, Electron ASAR |
| Installateurs et images applicatives | PKG, DMG, DEB, RPM, AppImage, Snap, Flatpak, MSIX/APPX, MSI, NSIS, Squirrel, Inno Setup, InstallShield, Enigma Virtual Box |
| Systèmes de fichiers et flux de systèmes de fichiers | SquashFS, cramfs, ext4, romfs, MinixFS, Android sparse, btrfs-send, EROFS, JFFS2, NTFS, UBI/UBIFS, YAFFS2, QNX, partclone |
| Images disque et de déploiement | ISO, OCI, image Docker, VHD, VHDX, WIM, GPT, MBR, FAT12/16/32 |
| Flux de compression | XZ, gzip, bzip2, zstd, LZMA, lzip, LZ4, zlib, Unix compress (`.Z`) |
| Données applicatives intégrées | Bun standalone, UnityFS, bundle single-file .NET |
| Firmware | D-Link SHRS, ENCRPTED_IMG, alpha v1, alpha v2, DEAFBEAD, FPKG ; EnGenius ; Autel ECC ; QNAP ; Netgear CHK, TRX v1, TRX v2 ; Xiaomi HDR1, HDR2 ; Tesla SBFH ; HP BDL, IPKG ; Moxa FRM ; INSTAR BNEG, HD ; Airoha ; volume de firmware UEFI |
| Mémoire et volumes chiffrés | Windows minidump, LUKS1 |
Le registre déclare la détection pour chaque entrée. Parmi ces routes, 102 utilisent l'extracteur générique ; <!-- roster-breadth:containers-exercised -->42<!-- /roster-breadth --> disposent d'entrées commitées qui atteignent les octets des membres, DMG dispose de preuves commitées en détection seule, et 59 n'ont aucune entrée commitée. LUKS1 est évalué séparément par rapport au texte en clair et nécessite une clé de volume brute `aes-cbc-plain` pour le déchiffrement ; sans elle, il rapporte la frontière de clé. Les méthodes de compression individuelles, les membres chiffrés, les volumes fractionnés et les fonctionnalités de systèmes de fichiers ont des limites plus étroites. StuffIt 5 renvoie actuellement le blob d'archive via l'extraction, même si ses décodeurs de forks existent. Le contenu Airoha OTP-AES est extrait verbatim.
Des lecteurs Rust supplémentaires exposent les structures Deno eszip, Apple APFS/HFS+, les overlays ajoutés aux ELF et Blazor WebCIL ; ils ne constituent pas des entrées supplémentaires dans le décompte des 103 formats. [Routes d'extraction, versions de méthodes et limites](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/containers.md) · [Registre des conteneurs](https://github.com/1-3-7/disrobe/blob/main/crates/disrobe-binfmt/src/container.rs).
</details>
## Récupération automatique`auto` choisit une passe dans le registre compilé, l'exécute, puis ré-identifie sa sortie et les enfants extraits. Il s'arrête au seuil de confiance, à un hachage de contenu répété ou à la limite de profondeur (huit par défaut). Les rapports et les fichiers sources marqués comme terminaux restent des sorties plutôt que d'être réinjectés dans la détection. Le tableau suivant rend compte de chaque passe enregistrée par une compilation complète ; une compilation allégée peut omettre les lignes conditionnées par des fonctionnalités.
| Couche d'entrée | ID de passe enregistrés | Sortie automatique | Contrôles dédiés ou prérequis |
|---|---|---|---|
| Archives, installateurs, firmware, volumes | `binfmt.container` | Enfants extraits, suivis récursivement dans les passes de langage/natif | `extract` pour les rapports de membres et l'option explicite de clé brute LUKS1 |
| PyInstaller | `pyinstaller.extract` | Membres intégrés et enfants `.pyc` | `pyinstaller extract` pour les options spécifiques aux archives |
| Congélateurs Python | `pyfreeze.extract`, `nuitka.extract` | Charges utiles extraites ou structure de paquet compilé prise en charge | `pyfreeze` expérimental ; la variante Nuitka détermine ce qui survit |
| Python protégé | `pyarmor.unpack`, `sourcedefender.decrypt` | Texte en clair/bytecode disponible, métadonnées ou rapports de frontière de clé | Matériel d'exécution/clé correspondant ; mode PyArmor dédié et options de rigueur |
| Source et bytecode Python | `py.deob`, `py.decompile`, `py.disasm` | Source pelée, source décompilée ou trace d'instructions | `py decompile --emit source,disasm,ast` ; un interpréteur correspondant est nécessaire pour les vérifications de recompilation |
| Pickle | `pickle.classify` | Analyse symbolique et classification | `pickle` pour les opérations individuelles d'inspection/reconstruction |
| JavaScript | `js.deob` | Désobfuscation prise en charge, récupération de modules webpack/Vite, gestion Node SEA/bytenode | `js unbundle` expose l'ensemble plus large de bundlers ; les source maps et les options de renommage sont des contrôles directs |
| WebAssembly | `wasm.deob` | WAT récupéré ou relevé plus sidecars de détection, résumé et récupération | `wasm decompile --target` choisit Rust, TypeScript, C, WAT ou JSON |
| Electron / Tauri | `webview.carve` | Membres frontend intégrés | `webview` prend également en charge Wails ; la récupération automatique Wails utilise `go.classify` |
| PHP / Phar | `php.peel` | Source pelée, sortie `op_array`, enfants d'archive, rapports résiduels/clés | Les clés et IV doivent être disponibles statiquement pour les couches chiffrées |
| JVM / DEX | `jvm.classify` | Source Java, manifestes de protection et de récupération, enfants de classes/archives | `jvm`/`apk` pour le mapping, les signatures et les backends externes optionnels |
| .NET | `dotnet.classify` | C# et analyse, constantes/ressources/CIL récupérés, ou métadonnées Native AOT | `dotnet` pour d'autres formats de source et backends de rendu installés |
| Paquets mobiles / bytecode | `mobile.classify` | Extraction d'exécution/membres, lift Hermes, source Dart kernel ou rapports AOT | `hermes`, `flutter`, `mobile` pour les contrôles spécifiques au format |
| Lua | `lua.deob` | Lua récupéré et sidecars de dialecte/fidélité | `lua` pour les contrôles explicites de famille et de sortie |
| Shell / Office / PDF | `shell.deob` | Scripts pelés, source de macro/p-code, XLM et rapports de documents | `shell` pour les opérations spécifiques aux documents |
| Ruby | `ruby.classify` | Analyse plus source YARV/mruby récupérée lorsque disponible | `ruby` pour les rapports spécifiques à la variante ; la classification JRuby/TruffleRuby n'est pas une récupération de source Ruby |
| BEAM / EZ | `beam.classify` | Erlang/Elixir/Core Erlang, désassemblage, enfants d'archive | Les chunks de débogage survivants déterminent la fidélité de la source |
| SWF / ABC | `as3.classify` | Structure ABC, listings d'instructions, pseudocode AS3 | Les obfuscateurs commerciaux nommés restent en détection seule |
| Go | `go.classify` | Symboles, types, analyse garble et membres de système de fichiers intégrés | `go` pour DWARF, BuildInfo et autres rapports dédiés |
| Swift / Objective-C | `swift-objc.classify` | Métadonnées, tranches universelles et dylibs de cache partagé | Des fichiers de sous-cache/symboles frères peuvent être nécessaires ; contrôles directs `swift`/`macho` |
| Packers natifs | `native.packer-unpack` | Image décompressée ou module intégré disponible, symboles, signatures, rapports de récupération | Seuls les dispatches de packers implémentés décompressent ; les niveaux VM commerciaux peuvent s'arrêter à la détection |
| Images natives | `native.image-classify` | Identité, symboles, signatures, constats et un rapport de pseudo-source x86-64/AArch64 borné | `native decompile` sélectionne une commande complète de sortie de source ; les chemins de source ARM32/MIPS32 sont directs |
| Windows / OS/2 NE | `native.ne-structure` | Segments, entrées, imports et ressources | Récupération structurelle plutôt que décompilation de source |
| Perl / R / Tcl / Haxe / WSH | `scriptlang.classify` | Rapports de langage, structures récupérées et artefacts enfants pris en charge | Les API de bibliothèque par format exposent des opérations plus fines |
| Nim / Zig / Crystal / D | `nativelang.classify` | Empreintes de langage, symboles et structure native partielle | La classification nécessite suffisamment de marqueurs de langage survivants |
Par exemple, une application PyInstaller reconnue peut progresser via `pyinstaller.extract` → `pyarmor.unpack` → `py.decompile` ; un APK via l'extraction de membres → DEX → Java ; et une image native packée via la décompression → l'analyse de langage ou d'image. Chaque flèche dépend de ce que cette couche particulière produit réellement.```sh
disrobe passes
disrobe catalog python --json
disrobe auto input-directory/ --out recovered/ --batch-max-depth 6 --capture-stages
disrobe chain module.pyc --chain py.decompile --out python-source/
scan, frisk, taint, vulnmatch, la sélection explicite source-cible, le rejeu de mapping et l'invocation optionnelle d'un backend externe restent des opérations dédiées. Registre des passes · Sélection de chaîne et disposition de sortie.
La carte des capacités couvre les groupes de commandes et les intégrations. Son
inventaire lisible par machine relie le code source, les tests, la documentation, le statut de
support et les démos. La référence CLI couvre les commandes imbriquées ;
les drapeaux globaux couvrent les options partagées. Utilisez disrobe <command> --help
pour l'interface de votre build installé.
Les commandes de projet et de service y sont également indexées : serve, plugin, init, config, catalog, passes, doctor, install, install-deps, self-update, completions, man, explain et bug-report. Utilisez doctor pour sonder 46 à 51 outils externes selon la plateforme et identifier les backends optionnels manquants.
Le tableau associe chaque tâche de récupération aux commandes de Disrobe et aux outils apparentés. Les décompilateurs installés et les artefacts exportés fournissent les points d'intégration présentés ci-dessous.
L'inventaire comparatif nomme les comparaisons à entrée partagée en suspens. Les options de backend sont documentées dans installation et les guides de langage liés ci-dessus.
Les mesures utilisent les entrées épinglées, les versions d'outils et les règles de notation liées ci-dessous. Les comptes DEX et JAR mesurent la compilation des régions émises par chaque outil. Ces populations diffèrent, donc leurs comptes ne classent pas la qualité de récupération. Le rappel des secrets APK utilise la même vérité terrain de huit tokens.
Entrées, résultats bruts des outils et commandes de reproduction.
La même analyse Ghidra 12.1.2 voit un code différent après que Disrobe a exporté un exécutable packé en PE reconstruit. Ces instantanés locaux utilisent de vraies fixtures packées bénignes et enregistrent à la fois des augmentations et des diminutions. Les colonnes fonctions/instructions/chaînes proviennent de l'instantané d'analyse à neuf entrées ; les rendus C complétés proviennent de l'instantané de décompilateur séparé à six entrées. Un rendu complété est une sortie non vide, pas une note de justesse de la source.
Les comptes kkrunchy diminuent. Plus de fonctions découvertes ne signifie pas nécessairement plus de fonctions correctes, et ces comptes d'analyse ne remplacent pas une comparaison d'octets. Lisez l'instantané d'analyse, l'instantané de décompilateur et les mesures séparées de récupération d'octets natifs.
L'index des preuves relie les mesures de récupération à leurs fixtures, méthodes de comparaison, commandes et résultats.
Les résultats distinguent la récupération d'octets, l'acceptation par le compilateur et les vérifications comportementales. L'acceptation par le compilateur et les comptes de couverture ne sont pas des scores d'équivalence.
Ces vérifications mesurent Disrobe par rapport à un artefact original, un compilateur, un interpréteur ou un corpus étiqueté. Elles sont distinctes de la comparaison de deux décompilateurs. Chaque résultat lié enregistre la population d'entrée, les prérequis et la commande de reproduction.
Complete evidence records describe each population and grading rule.
Chart labels use strong for an independent correctness reference, recompile-only for compiler acceptance, and coverage-self-reported for Disrobe's own coverage counters. The comparison method and population define each result's scope.
Browse the results, tool comparisons, and reproduction prerequisites for individual measurements.
--backend auto. Check the command's help and installation guide before choosing a backend.
The chain runner connects single-purpose passes through shared artifacts and intermediate representations. A pass contributes the output it can justify; downstream consumers retain provenance and report unsupported boundaries. Explore the architecture, pass model, IR ladder, and chain runner.
Start with the documentation, quickstart, and result guide. Use disrobe explain <code> to look up a diagnostic. For changes to the project, read the contributing guide and the relevant feature's tests and evidence.
The threat model describes trust boundaries and input handling. Report security concerns through SECURITY.md. LEGAL.md describes the project's legal considerations; permission to analyze an artifact depends on your circumstances.
Every version of Disrobe is proprietary and source-available under the Disrobe Source-Available License, Version 1.1, which supersedes the Elastic License 2.0 and Version 1.0 for all versions and revokes all earlier grants as stated in the relicensing notice.
Personal hobby projects, personal learning, and unpaid independent security research by individuals, nonprofit education and research, and bona fide journalism are free, as defined in the license.
Any use by or for a company requires a paid license. See commercial licensing.
Required credit: This work used Disrobe, created by 1-3-7: https://github.com/1-3-7/disrobe
Forks other than contribution forks, reposting, rebranding, resale, hosting, and competing development are prohibited. The software is provided as is, at the user's own risk.
See attribution, contributor terms, summary, and third-party notices.
Copyright (c) 2025-2026 1-3-7. All rights reserved.
Earlier development commits were consolidated into a single baseline as part of the documentation and visual refresh.
| Tâche | Commandes | Sortie ou étape suivante |
|---|
| Trouver des indicateurs, des secrets et des constats statiques | scan, frisk, strings, ioc, indicators, behavior | Constats et offsets |
| Inspecter les fonctions, les flux et le comportement | query, capabilities, taint, vulnmatch | IR interrogeable, mappings ATT&CK/MBC et rapports source-to-sink |
| Conserver les annotations et les artefacts structurés | annot, rename, envelope, verify, yara | Enveloppes d'artefacts et état de l'analyste |
| Suivre la provenance et comparer les exécutions | chain, context, status, report, diff, guard, semdiff | Rapports, hachages et différences de récupération |
| Collecter des données réseau publiques | prowl | Collecte réseau explicite, distincte de la récupération hors ligne |
| Surface | Point d'entrée | Guide |
|---|
| Rust | Types de cœur partagés et crates de passes individuelles | API de bibliothèque |
| Python | Bindings typés via import disrobe | Bindings Python |
| HTTP, gRPC et LSP | disrobe serve | Service |
| Model Context Protocol | disrobe-mcp ou disrobe serve --mcp | Intégration MCP |
| Éditeurs et outils d'analyse | VS Code, IDA Pro, Ghidra, Binary Ninja | Intégrations d'éditeurs |
| GitHub Actions | Action de dépôt et sortie SARIF | GitHub Action |
| Vérifications de commit locales | ID de hook disrobe | pre-commit |
| Navigateur | Worker Wasm côté client | Playground |
| Contexte de projet pour les outils de codage | disrobe init --ide | Sidecar de métadonnées |
| Tâche de récupération | Outils nommés | Voie de Disrobe | Comment les choisir ou les combiner |
|---|
| Bytecode Python vers source | pycdc, PyLingual, uncompyle6, decompyle3 | Décompilateur CPython 1.0 à 3.15 en processus, récupération d'objets de code imbriqués, sortie source/désassemblage/AST | Inspectez la source, le désassemblage et l'AST récupérés par le décompilateur Python intégré |
| Extraction de Python figé | pyinstxtractor-ng, pydecipher | Extraction PyInstaller, Nuitka et freezer suivie de la récupération du bytecode | auto peut poursuivre depuis le membre extrait à travers un protecteur jusqu'au décompilateur Python |
| PyArmor | Pyarmor-Static-Unpack-1shot | Récupération statique du wrapper/runtime, rapports de mode, lifting BCC statique optionnel | Fournissez le runtime correspondant pour récupérer les données du wrapper et inspecter les résultats propres au mode |
| Inspection de Pickle | fickling, pickletools de Python | Trace d'instructions, réducteurs symboliques, classification et reconstruction de valeurs | Inspectez sans exécuter les réducteurs ; pickletools note l'inspection, et CPython vérifie la reconstruction sur 470 fixtures générées |
| Désobfuscation JavaScript | webcrack, synchrony, REstringer | obfuscator.io, JS-Confuser, motifs Jscrambler pris en charge, décodeurs ésotériques, récupération de constantes/flux de contrôle | Utilisez js deob pour des options explicites ou auto lorsque le JS est dans un paquet |
| Débundling JS et source maps | wakaru, webcrack, sourcemapper | Extraction de modules, gestion des source maps, renommage sensible à la portée, inspection V8 empaquetée | js unbundle expose plus de routes de bundlers que la répartition automatique de chaîne |
| WebAssembly | WABT wasm-decompile, Binaryen | Pseudo-source WAT et C/Rust/TypeScript, résumés JSON, inversion d'obfuscation prise en charge | Inspectez une cible source sélectionnée ; l'exécution wasmtime vérifie indépendamment le comportement récupéré ci-dessous |
| Source JVM | CFR, Vineflower, Procyon, Fernflower | Récupération native de classfiles plus gestion des protecteurs/chaînes | jvm decompile écrit les artefacts Disrobe aux côtés de la sortie d'un backend installé ; CFR a un résultat de rendement de compilation mesuré ci-dessous |
| Paquets Android et DEX | JADX, apktool, androguard, dex2jar | Récupération Dalvik en processus, métadonnées/signatures APK, extraction runtime, sortie Java | La décompilation DEX/APK utilise par défaut la voie native ; un backend Android est sélectionné explicitement. JADX a une étape mesurée ci-dessous |
| Assemblys .NET | ILSpy, dnSpy, dnSpyEx, de4dot | Récupération CIL plus constantes propres au protecteur, ressources, corps de VM et métadonnées Native AOT | dotnet decompile écrit la sortie CIL de Disrobe aux côtés d'un moteur de rendu installé ; --backend auto sélectionne ILSpy, dnSpyEx, dnSpy ou de4dot |
| Décompilation native | Ghidra, IDA, Binary Ninja | Pseudo-C x86-64 C/Rust et AArch64/ARM32/MIPS32 en processus ; rapports de symboles/types récupérés | Sélectionnez Ghidra en mode headless avec --backend ghidra, ou utilisez les intégrations d'éditeurs et les symboles exportés dans une session d'analyse interactive |
| Exécutables natifs packés | upx -d, unipacker, Detect It Easy | Déballeurs implémentés et émulation de stub bornée, images PE reconstruites, modules de chargement embarqués | Exportez les images PE récupérées vers Ghidra/IDA. Les mesures Ghidra ci-dessous comparent les entrées packées et reconstruites |
| Obfuscation native | Ghidra, IDA, Binary Ninja et scripts de désobfuscation | Transformations OLLVM/Tigress, simplification MBA, chaînes de pile, métadonnées natives et rapports de récupération | Sélectionnez l'opération/API native pertinente ; une empreinte de protecteur VM seule n'implique pas la récupération du corps |
| Métadonnées Go et garble | GoReSym, redress, gore | pclntab, métadonnées de modules/types, fichiers embarqués et littéraux garble récupérables | go rapporte les noms/types ; native decompile traite séparément la voie source du code machine |
| Swift / Objective-C | swift-demangle, class-dump, jtool2 | Données de classes/protocoles/sélecteurs runtime, rendu de symboles, tranches fat, dylibs de cache partagé | Fournissez les mappings survivants et les fichiers de sous-cache ; les noms originaux effacés par renommage nécessitent une carte externe |
| Bytecode et VM Lua | unluac, luadec, LuaDec51 | Source Lua/LuaJIT/Luau plus récupération d'obfuscateurs pris en charge et de VM personnalisées | IronBrew2 dispose de preuves différentielles d'exécution avec l'outil réel ; la récupération ordinaire de .luac et la récupération de VM sont des opérations différentes |
| Bytecode Ruby | Désassemblage MRI | Source YARV et mruby, listings d'opcodes, classification freezer/AOT | La recompilation MRI note le rappel des noms d'opcodes ; cette mesure n'établit pas l'équivalence d'exécution |
| Couches PHP | php-malware-finder | Pelage de chaînes eval et de boucles/chiffrements à clé littérale, extraction Phar, rapports d'enveloppes d'encodeurs | Utilisez les couches statiques et le matériel de clé disponible ; les charges commerciales à clé de chargeur natif restent scellées |
| PowerShell, Bash, VBA | PowerDecode, outils FLARE, olevba | Désobfuscation de shell, source/p-code VBA et stomping, formules XLM, actions PDF | shell place la récupération de scripts et les constats de documents aux côtés du reste de l'analyse d'artefacts |
| BEAM / ActionScript | beam_disasm d'Erlang, RABCDAsm | Récupération de source de débogage/Core Erlang BEAM et pseudocode de corps de méthode ABC | Préservez les chunks de débogage lorsqu'ils sont disponibles ; le BEAM strippé a une vérification d'exécution Erlang réel distincte |
| Hermes / React Native | hermes-dec, hbctool, DroidSaw | Extraction runtime, structure HBC, lifting pseudo-JavaScript pris en charge | L'analyse HBC couvre v60 à v96 ; le lifting de source a une frontière mesurée plus étroite. La taint du pont Hermes-vers-DEX n'est pas implémentée |
| Flutter / Dart AOT | reFlutter, Darter, blutter | Tables de source Kernel, graphe de déclarations AOT, corps ARM64, chaînes, analyse de rename-map | La source Kernel et les métadonnées AOT sont des niveaux de récupération différents ; les versions de snapshot contraignent l'analyse AOT |
| Conteneurs et firmware | binwalk, unblob, 7-Zip | Extraction de formats enregistrés, routage récursif des enfants, décodage/carving de firmware, rapports de refus par membre | Injectez directement les membres extraits dans les passes de langage ; comparez les octets des membres plutôt que de traiter une magie reconnue comme une extraction réussie |
| Secrets et indicateurs | APKLeaks, TruffleHog, Gitleaks, LinkFinder | Constats sur l'arbre récupéré/APK, offsets de tokens, chaînes statiques, rapports de secrets et IOC | Scannez l'APK ou l'arbre récupéré ; comparez APKLeaks aux mêmes secrets plantés ci-dessous |
| Identification de format, packer, compilateur | Detect It Easy, TrID, PEiD, binwalk | Identification multi-signaux, symboles, signatures et indices de routage | Utilisez identify/detect pour sélectionner une voie de récupération, puis inspectez sa sortie réelle |
| Capacités et taint | capa, scripts Ghidra, Joern | Constats ATT&CK/MBC avec offsets, requêtes IR normalisées, rapports de flux source-to-sink | Exécutez la correspondance de capacités et l'analyse source-to-sink sur les artefacts récupérés ; le rapport de taint inclut sa population de tests Juliet |
| Outil et entrée | Résultat Disrobe | Résultat de l'outil nommé | Ce que la mesure vérifie |
|---|
| JADX 1.5.5 · Android DEX | 157 / 228 régions émises compilent proprement | 281 / 303 régions émises compilent proprement | DEX EdgeCases commité ; javac réel, compilation de source complète puis isolation bornée des régions bloquant l'attribution ; populations émises différentes |
| CFR 0.152 · Classfile JVM | 181 / 181 régions émises compilent proprement | 152 / 166 régions émises compilent proprement | JAR EdgeCases commité ; la même procédure de compilateur/notation ; populations émises différentes |
| APKLeaks 2.6.3 · APK à secrets plantés | 8 / 8 secrets plantés | 5 / 8 secrets plantés | Rappel exact de tokens sur le même APK ; Disrobe trouve aussi la clé d'accès AWS plantée, l'identifiant Basic et le JWT |
| Entrée packée | Fonctions Ghidra, packé → reconstruit | Instructions, packé → reconstruit | Chaînes, packé → reconstruit | Rendus C complétés, packé → reconstruit |
|---|
| UPX · Rust hello | 4 → 287 | 225 → 19 060 | 23 → 179 | 4 → 287 |
| ASPack · Clockres | 5 → 243 | 58 → 10 544 | 48 → 116 | 5 → 210 |
| ASPack · AccessEnum | 5 → 101 | 73 → 5 781 | 62 → 195 | 5 → 101 |
| PECompact · Clockres | 2 → 306 | 148 → 14 603 | 27 → 27 | 1 → 267 |
| PECompact · AccessEnum | 2 → 186 | 155 → 9 278 | 52 → 53 | 2 → 186 |
| MEW · Clockres | 4 → 333 | 125 → 20 990 | 3 → 358 | Non mesuré |
| MEW · AccessEnum | 4 → 152 | 125 → 9 592 | 3 → 802 | Non mesuré |
| MEW · Autologon | 4 → 295 | 125 → 19 595 | 3 → 406 | Non mesuré |
| kkrunchy classic · NASM hello | 4 → 1 | 149 → 10 | 3 → 4 | 4 → 1 |
| Entrée | Régions émises par Disrobe | Régions émises par l'outil nommé | Frontière de population | Reproduire |
|---|
| Android DEX | 157 / 228 régions émises compilent proprement | JADX 1.5.5 : 281 / 303 régions émises compilent proprement | pas de classement inter-outils : chaque outil a sa propre population de régions émises | cargo run --locked -p disrobe-bench-head-to-head -- --check --only apk-jadx-cfr |
| Classfile JVM | 181 / 181 régions émises compilent proprement | CFR 0.152 : 152 / 166 régions émises compilent proprement | pas de classement inter-outils : chaque outil a sa propre population de régions émises | cargo run --locked -p disrobe-bench-head-to-head -- --check --only apk-jadx-cfr |
| Récupération | Résultat enregistré | Référence et limite |
|---|
| Python 3.14.5, modules épinglés | 6077 sur 6286 objets de code | Recompilation CPython avec comparaison normalisée de la structure des opcodes ; les cibles de saut, la plupart des opérandes et les objets récupérés supplémentaires ne sont pas notés. Résultat |
| Python 3.14.5, population de cœur fixe | 17396 sur 18276 objets de code, mesure locale | La même comparaison normalisée sur 574 modules ; ce n'est pas un résultat d'équivalence sémantique. Résultat |
| Python hérité 1.0 à 3.7 | au moins 150 sur 191 fixtures (plancher de régression) | Recompilation par interpréteur d'époque ou tokens structurels par rapport à la source originale. Résultat |
| Classification Pickle | 102 / 102 fixtures de classification | Sémantique de pickletools. Résultat |
| Reconstruction Pickle | 470 / 470 fixtures reconstruites passent les vérifications d'égalité de ré-exécution | Ré-exécution CPython. Résultat |
| Compilation de source JVM | 131 sur 131 méthodes compilent | javac réel. Résultat |
| Comportement JVM | 117 / 131 méthodes correspondent à l'exécution observée | JVM réelle ; huit méthodes divergent et six ne sont pas pilotées isolément. Résultat |
| Android DEX | 118 / 118 classes présentées au vérificateur | JVM -Xverify:all ; 37 sur 155 classes sont ignorées à l'édition de liens et non notées. Résultat |
| .NET C# | 18 / 35 types EdgeCases complets se recompilent seuls | Roslyn csc réel ; une source légale n'établit pas un comportement équivalent. Résultat |
| Corps de VM .NET | Modèle Eazfuscator : 67 / 67 instructions ; KoiVM réel : 6 / 6 corps liftés | Références originales/build propre séparées ; EazVM utilise un virtualiseur dans le dépôt, KoiVM utilise la sortie d'un outil réel. Preuves |
| WebAssembly | 57 / 57 fonctions éligibles | wasmtime compare les retours, les traps et les 4 096 premiers octets de mémoire linéaire sur les entrées de test. Résultat |
| BEAM sans chunks de débogage | 19 / 19 modules | Recompilation Erlang/OTP 27.3.4, comparaison des exports et sortie/statut de sortie de test/0. Résultat |
| Lua IronBrew2 | La sortie réelle 2.7.0 standard et MAX se récupère en une exécution correspondante | Interpréteur Lua réel par rapport aux programmes originaux ; une famille de VM. Résultat |
| Ruby YARV | Greeter 100% ; megafile 98.67% de rappel des noms d'opcodes | Recompilation MRI ; le rappel en multiensemble ignore l'ordre, les opérandes, les cibles de branchement et les instructions supplémentaires. Résultat |
| Noms de types Go strippés | 838 sur 838 noms | Métadonnées réelles go1.26.3 du build de comparaison. Résultat |
| Hermes HBC v96 | 8 sur 8 fonctions, zéro opération de repli | Échantillon hermesc réel avec source originale et noms de fonctions. Résultat |
| Octets natifs packés | UPX, FSG, NSPack, Petite, MPRESS .text identiques octet par octet sur des paires commitées nommées ; ressources de Yoda's Crypter identiques octet par octet | Octets originaux alignés sur les RVA ; les résidus d'image entière et de ressources restent rapportés séparément. Tableau par entrée |
| Indicateurs plantés | 6 / 6 catégories IOC représentées | Vérité terrain commitée : endpoints, constats de manifeste, URLs, IPv4, email et .onion. Résultat |
| Graphe d'appels MCP | 5 / 5 arêtes directes, toutes correctement identifiées | ELF strippé comparé à son jumeau de chaîne d'outils non strippé distinct. Précision, rappel |
| Taint natif | 93 / 190 flux étiquetés rappelés ; zéro faux positif, mesure locale | Tranche NIST Juliet CWE-78 char/system, gcc 16.2.0 -O2 ; sept catégories de flux déclarées n'ont pas de cas dans cette tranche. Résultat |