
Suite CLI in Rust che decompila staticamente, deoffusca e decomprime codice nativo, bytecode, script, firmware e pacchetti di app attraverso oltre 15 ecosistemi tramite un'unica pipeline automatica.
Per iniziare · Input supportati · Recupero automatico · Confronto tra strumenti · Evidenze · Documentazione
Disrobe è una suite da riga di comando in Rust per decompilare, deoffuscare e spacchettare software. Usala per fare triage di un file sconosciuto, recuperare codice per il reverse engineering, estrarre indicatori per un'indagine o preparare artefatti per un disassembler.
Recupera Python da bytecode e applicazioni congelate, Java da classfile e DEX, C# da CIL, JavaScript da bundle, Lua da macchine virtuali personalizzate e C o Rust da codice nativo. Estrai file da installer, firmware, pacchetti mobili e applicazioni Electron, Tauri o Wails. Mantieni insieme sorgente, simboli, stringhe, tipi e provenienza recuperati per ulteriori analisi.
La build completa cataloga 170 famiglie in 15 ecosistemi e rileva 103 formati di container. disrobe auto identifica ogni livello, esegue un passaggio corrispondente e segue i figli recuperati nei loro percorsi di recupero. Comandi dedicati espongono controlli più fini, report di analisi e backend opzionali. Il recupero viene eseguito staticamente per impostazione predefinita; sorgente, struttura, output parziale e confini delle chiavi mancanti rimangono distinguibili nel risultato.
Se Disrobe ti è utile, considera di mettere una stella al repository.
Guarda il video completo · Leggi la trascrizione
Venti comandi CLI in 2 minuti e 12 secondi: spacchetta un eseguibile nativo, recupera Python e Lua, dividi moduli JavaScript, ripristina source map, ispeziona WebAssembly e risorse Android, estrai indicatori e conserva report e hash degli artefatti. Il capitolo finale mostra la configurazione del progetto, la configurazione dell'IDE, le annotazioni dell'analista e i completamenti della shell. La trascrizione include l'inventario completo dei comandi della build registrata; la mappa delle capacità spiega i suoi limiti di supporto.
Scarica l'archivio per la tua piattaforma da GitHub Releases, verificalo rispetto al file SHA256SUMS della release e metti disrobe nel tuo PATH. Gli archivi delle release includono bundle di firme; la guida alla verifica spiega come ispezionarli.
| Piattaforma | Target di release |
|---|---|
| Windows | x86-64, ARM64 |
| macOS | x86-64, ARM64 |
| Linux | x86-64 e ARM64 con glibc; x86-64 con musl |
Verifica il binario che hai installato:```sh disrobe --version disrobe --help
Per compilare la CLI da un clone, installa la toolchain Rust del repository e i [prerequisiti di build nativi](https://github.com/1-3-7/disrobe/blob/main/docs/src/installation.md), quindi esegui:```sh
cargo build --locked --release -p disrobe-cli --bin disrobe
L'eseguibile è target/release/disrobe, oppure target/release/disrobe.exe su Windows. Consulta la guida all'installazione per i feature flag e le build slim.
Inizia con un'applicazione, una libreria o un pacchetto. Identificalo, recupera i suoi layer riconosciuti, poi ispeziona il riepilogo del recupero:```sh disrobe identify path/to/application disrobe auto path/to/application --out recovered/ --capture-stages disrobe context --out recovered/
`identify` riporta il formato e i segnali disponibili. `auto` estrae e recupera i livelli riconosciuti. `context` riassume i passaggi risultanti, la confidenza e la provenienza. Con `--capture-stages`, ispeziona ogni fase sotto `recovered/01-*/`, `recovered/02-*/` e `recovered/final/`; `chain.json` registra la topologia e gli hash, e `recovery.json` registra gli esiti e i tempi.
Usa un comando dedicato quando conosci l'output di cui hai bisogno:```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/
Il decompilatore nativo emette C per impostazione predefinita su x86-64; --format rust seleziona Rust. AArch64, ARM32 e MIPS32 emettono pseudo-C. native export ricostruisce le immagini PE impacchettate supportate per uno strumento di analisi esterno; webview scrive l'albero delle risorse frontend recuperate senza avviare l'applicazione.
Il repository include un piccolo modulo WebAssembly per il playground del browser. Da un clone, con la CLI completa nel tuo 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
Il primo comando scrive `add.summary.json`; il secondo scrive testo WebAssembly in `add.lifted.wat`. Il recupero automatico
seleziona una catena disponibile e scrive i suoi artefatti sotto `recovered/`; `--capture-stages` conserva
i risultati intermedi. Queste operazioni ispezionano il modulo senza eseguire la sua funzione esportata.
Ispeziona i file recuperati insieme al report: l'identificazione da sola non stabilisce il recupero. Costrutti non supportati, materiale chiave assente e catene non disponibili compaiono nel risultato. La [guida ai risultati](https://github.com/1-3-7/disrobe/blob/main/docs/src/reading-a-result.md) spiega artefatti, diagnostica, esiti parziali e provenienza.
[Apri il playground del browser](https://1-3-7.github.io/disrobe/playground/) · [Segui la guida rapida](https://github.com/1-3-7/disrobe/blob/main/docs/src/quickstart.md)
## Trova il tuo input
**Recover** significa che un percorso raggiungibile emette sorgente, byte o struttura. **Partial** significa che recupera solo una parte di tali informazioni. **Detect-only** significa che identifica la famiglia senza recuperarne il corpo protetto. Questi livelli descrivono operazioni su input supportati; un nome di famiglia da solo non è una garanzia che ogni versione o configurazione venga recuperata. Gli elenchi seguenti includono il catalogo completo delle famiglie e formati aggiuntivi esposti da comandi e estrattori dedicati.
| Input | Recupero e output | Comandi e guida |
|---|---|---|
| Python | Bytecode e marshal CPython 1.0 a 3.15 verso sorgente; disassemblaggio PyPy, MicroPython `.mpy` v0 a v6, Jython, IronPython e Brython; estrazione di payload congelati; nomi, firme e fallback strutturale di 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 | Deoffuscamento del sorgente, inversione della minificazione, suddivisione dei moduli, source map, ispezione dei dati in cache V8 e dei runtime impacchettati | `js` · [JavaScript](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/javascript.md) |
| WebAssembly | Da `.wasm` a WAT, Rust, TypeScript, pseudo-sorgente C o JSON; ispezione del Component Model e del type-graph GC; inversione dell'offuscamento supportato | `wasm` · [WebAssembly](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/wasm.md) |
| JVM / Android | `.class`, JAR, DEX, APK, AAB; sorgente Java, idiomi Kotlin/Scala, informazioni su manifest e firma, report dei protettori e sidecar di mapping | `jvm`, `apk` · [JVM e Android](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/jvm-android.md) |
| .NET | Metadati PE/CLR e CIL verso pseudo-sorgente C#, F# o VB; ispezione ReadyToRun e Native AOT; estrazione di bundle single-file | `dotnet` · [.NET](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/dotnet.md) |
| Native | Identificazione o analisi di PE32/PE64, EFI PE, ELF32/ELF64, moduli kernel, Mach-O thin/fat, COFF, MZ, NE, LE, LX e codice grezzo; emissione di sorgente sui percorsi specifici per architettura sopra indicati | `native`, `macho`, `semdiff` · [Native](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/native.md), [decompile](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/native-decompile.md) |
| Go | Metadati runtime PE/ELF/Mach-O, nomi di funzioni e tipi rimossi, file `embed.FS`, report di garble e letterali recuperabili | `go` · [Go](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/go.md) |
| Swift / Objective-C | Classi, protocolli, campi, selettori, simboli demangled di Mach-O; slice universali; dylib della shared-cache dyld | `swift`, `macho` · [Swift](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/swift.md) |
| Lua | Bytecode Lua 5.1 a 5.4, LuaJIT 2.0/2.1, Luau, Garry's Mod Lua (GLua); report di fedeltà per sorgente e per input; recupero supportato di VM e stringhe | `lua` · [Lua](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/lua.md) |
| PHP | Peeling di catene sorgente/eval, cicli di decodifica a chiave letterale e livelli AES, estrazione Phar, recupero di `op_array` serializzati; gli envelope dei encoder commerciali rimangono limitati dalla chiave | `php` · [PHP](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/php.md) |
| Ruby | Binari InstructionSequence MRI/YARV 2.6 a 3.4 e bytecode mruby RITE verso Ruby; classificazione freezer e AOT | `ruby` · [Ruby](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/ruby.md) |
| Erlang / Elixir | Moduli BEAM e archivi EZ; codice astratto sopravvissuto o `Dbgi` verso sorgente, fallback Core Erlang, elenco delle istruzioni | `beam` · [BEAM](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/beam.md) |
| ActionScript 3 | Blocchi `DoABC` SWF FWS/CWS/ZWS e bytecode ABC grezzo verso disassemblaggio e pseudocodice AS3 | `as3` · [ActionScript](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/as3.md) |
| Runtime mobile | Parsing dell'header Hermes v60 a v96, lift pseudo-JavaScript v62/v71/v74/v76/v83/v84/v89/v96; corpi sorgente del kernel Flutter Dart; dichiarazioni, stringhe e disassemblaggio AOT ARM64 | `hermes`, `flutter`, `mobile` · [Mobile](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/mobile.md) |
| Shell / documenti | PowerShell, Bash, Batch, VBScript, WSH; p-code e stomping VBA3/5/6/7; sorgente di macro Office, formule XLM BIFF8/BIFF12, script/azioni incorporati nei PDF | `shell` · [Shell e documenti](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/shell.md) |
| Altri artefatti linguistici | Op-tree/bytecode Perl, metadati R RDS e Rcpp, starkit Tcl, output Haxe JS/SWF/HashLink/Neko; impronte, simboli e struttura parziale di Nim, Zig, Crystal e D | `auto`, API di libreria · [Linguaggi di scripting](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/shell.md), [native](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/native.md) |
| Python pickle | Disassemblaggio del protocollo, traccia simbolica, ricostruzione e classificazione senza chiamare i reducer di pickle | `pickle` · [Pickle](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/pickle.md) |
| Archivi / firmware / frontend | L'elenco completo dei container di seguito; Electron ASAR, mappe incorporate Tauri v1/v2, alberi `embed.FS` di Wails v2 | `extract`, `webview`, `auto` · [Container](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: ogni freezer, protettore e offuscatore di sorgente con nome</strong></summary>
| Famiglia o formato | Supporto e prerequisito |
|---|---|
| PyInstaller 2.x a 6.20+ | Recupera archivi e bytecode incorporati, inclusi i livelli AES-CTR/CFB supportati |
| Nuitka onefile, standalone, module, wheel | Estrae payload onefile; recupera simboli e struttura visibile a Python dalle forme compilate |
| cx_Freeze, py2exe, shiv, pex, Briefcase | Estrazione del packager tramite `pyfreeze`; il comando rimane sperimentale |
| PyOxidizer | Estrazione sperimentale, non validata |
| SourceDefender `.pye` | Decifratura statica tramite `py sourcedefender` e `sourcedefender.decrypt` |
| PyArmor v3 (DES legacy), PyArmor v4 (misto legacy), PyArmor v5 (AES legacy) | Detect-only: confine della chiave avvolta in RSA |
| PyArmor v6, PyArmor v7 | Recupero statico parziale; la modalità super e le chiavi non disponibili limitano l'output |
| PyArmor v8, PyArmor v9 / 9-Pro | Recupero statico del wrapper dove il materiale chiave è disponibile. Il risultato pubblicato <!-- m:pyarmor_frac -->72 / 72<!-- /m --> conta la decodifica completa del `CodeObject` radice solo per i wrapper v8/v9 default-trial con nome; non stabilisce l'equivalenza del sorgente né copre licenza registrata/pro, BCC o modalità super |
| Kramer / Specter, Berserker, BlankOBF, PlusOBF, Wodx, pyobfuscate.com, pyobfuscate.com (2026 XOR/lambda), PyObfuscator (mauricelambert), Manglify, Oxyry, pyminifier, famiglia di offuscatori online, Xindex, Patchwork, pyc-zipper | Recupero statico di sorgente/loader tramite il valutatore AST; i singoli livelli e residui vengono riportati |
| Jawbreaker, ObfuXtreme | Recupera il corpo presente nell'artefatto; i payload recuperati a runtime rimangono assenti |
| python-obfuscator (PyPI), pyobfus, Pypacker | Peeling parziale del wrapper e classificazione |
PyArmor può richiedere il file runtime corrispondente accanto al wrapper. Il suo percorso BCC dedicato richiede `--allow-bcc` ed emette lift nativi statici più scheletri Python per i corpi modellati; il recupero automatico consapevole del percorso può pubblicare gli stessi artefatti BCC. Solo l'hook dinamico di PyArmor v6/v7 esegue codice campione, dietro `--allow-dynamic` con un watchdog. `--allow-bcc` consente solo analisi statica in-tree e non esegue il campione né invoca strumenti esterni. [Dettagli su versione e modalità](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/python.md#pyarmor).
</details>
<details>
<summary><strong>JavaScript, WebAssembly e applicazioni web impacchettate</strong></summary>
| Famiglia o formato | Supporto e percorso |
|---|---|
| obfuscator.io / javascript-obfuscator, JS-Confuser | Recupera array di stringhe supportati, trasformazioni dispatcher/control-flow, predicati opachi e livelli loader; comandi diretti e `js.deob` |
| Jscrambler, js-obfuscator (jsobfu) | Recupero parziale di template e trasformazioni statiche |
| JSFuck, aaencode, jjencode, JSFiretruck, Dean Edwards Packer | Decodifica statica tramite operazioni dedicate e percorsi di catena riconosciuti |
| JSDefender, Arxan / Digital.ai | Rilevamento e peeling parziale di trasformazioni statiche; le operazioni JS commerciali protette richiedono l'opzione di autorizzazione del comando |
| PACE | Detect-only |
| webpack 4, webpack 5, Vite, Rollup, Rolldown, esbuild, Turbopack, Bun, Parcel, Browserify, SystemJS; moduli AMD | Unbundling/recupero moduli diretto. La catena dispaccia webpack e Vite; i marcatori di catalogo per gli altri bundler non rendono di per sé automatici quei percorsi |
| bytenode `.jsc`, Node SEA, nexe, nw.js | Ispezione/carving dei dati V8 impacchettati; Node SEA e bytenode hanno rami di catena espliciti |
| Electron ASAR, Tauri v1/v2, Wails v2 | Recupera alberi frontend incorporati; Electron/Tauri usano `webview.carve`, Wails usa `go.classify`; `webview` diretto gestisce tutti e tre |
| Bun standalone, Deno eszip v2 a v2.3 / `deno compile` | Recupera grafi di moduli incorporati tramite i rispettivi lettori di container; eszip espone anche un lettore Rust diretto |
| Wobfuscator, Jscrambler WASM, wasm-mixer / Wasmixer | Inversione parziale delle trasformazioni supportate tramite `wasm.deob`; fixture a forma di strumento valutano le trasformazioni, senza output committato dagli offuscatori stessi |
| Tigress → Emscripten, wasm-name-obfuscator | Rileva e classifica; l'helper Tigress è fuori dal percorso di esecuzione `wasm deob`, e i nomi originali distrutti rimangono non disponibili |
[Percorsi JavaScript](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/javascript.md) · [Limiti Wasm](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/wasm.md) · [Layout frontend incorporati](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/webview.md).
</details>
<details>
<summary><strong>Packer, protettori e famiglie di offuscamento nativi</strong></summary>
| Famiglia | Supporto e percorso |
|---|---|
| Donut, sRDI | Recupera il modulo incorporato da layout di shellcode-loader supportati |
| UPX, ASPack, Petite, MPRESS, FSG, PECompact, Yoda's Crypter, NSPack, MEW, kkrunchy | Routine di unpack implementate, raggiungibili tramite `native unpack` e la catena dei packer; la fedeltà varia per famiglia e campione |
| ASProtect, Morphine, nPack, NeoLite, PolyCryptor, Warzone Crypter | `StubEvalPending`: il comportamento dell'emulatore ha evidenza di stub costruita da specifiche; il recupero reale di packer commerciali non è validato e non viene pubblicizzato alcun dispatch di unpack |
| Yoda's Protector, VMProtect, Themida / WinLicense | CLI e auto detect-only. Helper Rust separati espongono carving assistito dall'originale o recupero di sezioni protette; non stabiliscono la devirtualizzazione dell'intero programma |
| PE-Protector, PELock, Enigma Protector, Armadillo, Obsidium, WinLicense | Detect-only |
| DotNetPatcher, NetCryptor | Delegano il livello managed al passaggio .NET |
| OLLVM flattening, bogus control flow, instruction substitution; Tigress CFF | Trasformazioni di deoffuscamento statico supportate e report tramite le API Rust native; l'analisi applicabile compare nei report di recupero nativo |
| Alcatraz, Emotet CFF, Mirai, Dridex, Trickbot, obfus.h, Cryptify (rust-obfuscator), guardian-rs, obfusheader.h, obfuscxx, Amice | Firme di offuscamento nativo con nome; i singoli helper di stringhe/control-flow hanno un recupero più limitato rispetto alla famiglia completa rilevata |
L'analisi nativa recupera anche simboli Rust/C++, RTTI e vtable C++, modelli a oggetti Delphi/C++Builder e risorse DFM, informazioni DWARF/PDB/STABS, import, call graph, firme crypto e corrispondenze FLIRT. L'analisi delle istruzioni copre x86, ARM, RISC-V, MIPS, PowerPC, SPARC, eBPF e AVR; l'emissione di sorgente è il set di architetture più ristretto elencato sopra. [Analisi nativa](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/native.md) · [Evidenza di unpacking e recupero byte](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/native-unpack.md) · [Deoffuscamento](https://github.com/1-3-7/disrobe/blob/main/docs/src/anti-analysis.md).
</details>
<details>
<summary><strong>Famiglie di pacchetti JVM, Android, .NET e mobile</strong></summary>
| Famiglia | Supporto e prerequisito |
|---|---|
| Zelix KlassMaster, Allatori, Stringer, DashO | Recupero di stringhe per pattern supportati, seguito da decompilazione del classfile |
| DexGuard | Rilevamento, peeling strutturale ed emulazione della decifratura di stringhe in-classe per costanti con chiave supportate |
| BlackObfuscator | Riconoscimento del dispatcher DEX e annotazione dell'ordine dei blocchi |
| ProGuard / R8 | Replay del mapping su un sidecar di ripristino dei nomi; i nomi originali richiedono `mapping.txt` |
| yGuard, SkidSuite2, JBCO | Detect-only |
| Promon SHIELD, Guardsquare DexGuard RASP, Guardsquare ThreatCast, Appdome, OneSpan, Arxan / Digital.ai, Zimperium zShield, Licel DexProtector | Identificazione RASP Android e report strutturali |
| ConfuserEx2 | Recupero di costanti su campioni reali e deflattening del control-flow; le risorse cifrate possono mantenere un confine di chiave a runtime |
| Eazfuscator.NET | Decifratura di stringhe e lifting di VM valutati su modello; la fixture della VM proviene da un virtualizzatore in-repository, non dal prodotto distribuito |
| KoiVM (ConfuserEx VM) | Corpi virtualizzati liftati a CIL su output committato di strumenti reali |
| ConfuserEx, Dotfuscator, Dotfuscator CE, SmartAssembly, Babel, DeepSea, Spices.Net, Goliath, Skater, .NET Reactor, CryptoObfuscator, ArmDot, Agile.NET, Obfuscar, DotNetPatcher, NetCryptor, BitMono | Rilevamento e recupero parziale specifico per famiglia: nomi, stringhe, risorse o strutture dei metodi. BitMono è nel rilevatore di protettori oltre il catalogo della catena .NET a 22 voci |
| Themida (wrapper .NET), ILProtector, MaxToCode | Detect-only per corpi con chiave nel loader nativo |
| React Native APK, React Native IPA; bytecode React Native Hermes | Estrae payload JS/Hermes e instrada il bytecode supportato nel lift Hermes |
| Kernel Flutter Dart; snapshot AOT Flutter (`libapp.so`) | Recupero della tabella sorgente del kernel; dichiarazioni AOT, metadati e disassemblaggio ARM64. La versione dello snapshot e i nomi disponibili limitano il recupero |
| Xamarin / .NET MAUI APK, Apache Cordova APK, Capacitor APK, NativeScript APK | Identificazione del runtime ed estrazione supportata di pacchetti/membri |
| Android APK (`classes.dex`), Android app bundle (AAB / APKM / XAPK), IPA | Ispezione del pacchetto ed estrazione dei figli; il recupero a valle dipende dal runtime incorporato |
I decodificatori di stringhe .NET per SmartAssembly, Spices.Net, Skater, .NET Reactor, Eazfuscator.NET e CryptoObfuscator sono valutati su algoritmi modellati, non su assembly prodotti dai vendor e committati. ConfuserEx2, Obfuscar e BitMono hanno evidenza reale di assembly protetti. [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>Famiglie Lua, PHP, shell, Ruby, BEAM, Swift, Go e ActionScript</strong></summary>
| Famiglia | Supporto e prerequisito |
|---|---|
| IronBrew2 | Recupero VM, verificato differenzialmente in esecuzione su output reale 2.7.0 standard e MAX |
| Prometheus | Recupero parziale, incluse le strutture di dispatch `Vmify` impilate supportate |
| MoonSec V1, MoonSec V2, MoonSec V3, AztupBrew, DarkSec, Boronide, PSU, WeAreDevs LuaU, luaobfuscator.com, SLua (Unity Lua 5.3), Hercules | Recupero parziale Lua; l'evidenza di VM a forma MoonSec usa un bootstrap sintetico |
| Luraph | Detect-only |
| Bytecode Luau, Garry's Mod Lua (GLua) | Riconoscimento del dialetto; lifting Luau e recupero parziale GLua |
| ionCube, SourceGuardian, Zend Guard | Rilevamento di envelope PHP commerciali; le chiavi residenti nel loader rimangono un confine. I casi legacy con chiave statica possono produrre struttura `op_array` parziale |
| FOPO, Better PHP Obfuscator | Peeling statico di catene eval PHP, con requisiti di chiave letterale per i livelli cifrati |
| Invoke-Obfuscation (token), Invoke-Obfuscation (AST), Invoke-Obfuscation (string), Invoke-Obfuscation (encoding), Invoke-Obfuscation (compress); Invoke-Stealth, PowerHell, Chameleon, psobf | Recupero statico PowerShell |
| Invoke-Obfuscation (launcher), ISESteroids | Recupero parziale PowerShell |
| Bashfuscator (token), Bashfuscator (string), Bashfuscator (obfuscate), Bashfuscator (compress); Bash indirection (IFS/eval); node-bash-obfuscate (chunk-table eval) | Recupero statico Bash |
| Offuscamento Batch (`%random%`), offuscamento Batch (set indirection); macro VBA (decompilazione p-code + stomping) | Peeling Batch e recupero sorgente/p-code VBA |
| YARV InstructionSequence (`.rb` compilato), bytecode mruby RITE | Recupero sorgente Ruby |
| Eseguibile autoestraente OCRA, pacchetto RubyScript2Exe | Classificazione/recupero parziale del freezer |
| Classe compilata JRuby, native image TruffleRuby | Detect-only tramite il catalogo Ruby |
| File BEAM (modulo compilato Erlang / Elixir), archivio EZ (moduli `.beam` avvolti in ZIP) | Estrazione del modulo, recupero sorgente/debug-chunk o fallback Core Erlang |
| garble | Metadati Go e letterali supportati; l'hashing dei nomi originali non può essere invertito senza il seed mancante |
| Metadati Mach-O Swift / Objective-C, binario Mach-O fat (universal), shared cache dyld | Metadati runtime, recupero di slice e dylib |
| SwiftShield | Parser di mapping; il mapping deve essere fornito per recuperare i nomi originali |
| SWF (Flash, FWS/CWS/ZWS) DoABC, bytecode ABC grezzo | Disassemblaggio e pseudocodice del corpo dei metodi |
| secureSWF, DoSWF, Kindi, Irrfuscator, swfLock | Detect-only |
[Catalogo delle famiglie](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>Tutti i 103 formati di container registrati</strong></summary>
| Categoria | Formati |
|---|---|
| Archivi generici | 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 |
| Archivi di applicazioni e linguaggi | JAR, WAR, APK, XPI, WHL, EGG, CRX, NUPKG, VSIX, PYZ, Electron ASAR |
| Installer e immagini applicative | PKG, DMG, DEB, RPM, AppImage, Snap, Flatpak, MSIX/APPX, MSI, NSIS, Squirrel, Inno Setup, InstallShield, Enigma Virtual Box |
| Filesystem e stream di filesystem | SquashFS, cramfs, ext4, romfs, MinixFS, Android sparse, btrfs-send, EROFS, JFFS2, NTFS, UBI/UBIFS, YAFFS2, QNX, partclone |
| Immagini disco e di deployment | ISO, OCI, immagine Docker, VHD, VHDX, WIM, GPT, MBR, FAT12/16/32 |
| Stream di compressione | XZ, gzip, bzip2, zstd, LZMA, lzip, LZ4, zlib, Unix compress (`.Z`) |
| Dati applicativi incorporati | 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 firmware UEFI |
| Memoria e volumi cifrati | Windows minidump, LUKS1 |
Il roster dichiara il rilevamento per ogni voce. Di quei percorsi, 102 usano l'estrattore generico; <!-- roster-breadth:containers-exercised -->42<!-- /roster-breadth --> hanno input committati che raggiungono i byte dei membri, DMG ha evidenza committata di solo rilevamento, e 59 non hanno input committato. LUKS1 è valutato separatamente rispetto al plaintext e richiede una chiave di volume grezza `aes-cbc-plain` per la decifratura; senza di essa riporta il confine della chiave. I singoli metodi di compressione, i membri cifrati, i volumi splittati e le funzionalità dei filesystem hanno limiti più ristretti. StuffIt 5 attualmente restituisce il blob dell'archivio tramite estrazione anche se i suoi decoder di fork esistono. Il contenuto Airoha OTP-AES viene estratto verbatim.
Lettori Rust aggiuntivi espongono Deno eszip, Apple APFS/HFS+, overlay aggiunti a ELF e strutture Blazor WebCIL; non sono voci extra nel conteggio dei 103 formati. [Percorsi di estrazione, versioni dei metodi e limiti](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/containers.md) · [Registro dei container](https://github.com/1-3-7/disrobe/blob/main/crates/disrobe-binfmt/src/container.rs).
</details>
## Recupero automatico`auto` sceglie un pass dal registro compilato, lo esegue, quindi re-identifica il suo output e i figli estratti. Si ferma alla soglia di confidenza, a un hash di contenuto ripetuto o al limite di profondità (otto per impostazione predefinita). I report e i file sorgente contrassegnati come terminali rimangono output anziché essere reimmessi nel rilevamento. La tabella seguente rende conto di ogni pass registrato da una build completa; una build slim può omettere le righe soggette a feature gate.
| Livello di input | ID dei pass registrati | Output automatico | Controlli dedicati o prerequisito |
|---|---|---|---|
| Archivi, installer, firmware, volumi | `binfmt.container` | Figli estratti, seguiti ricorsivamente nei pass linguistici/nativi | `extract` per i report dei membri e l'opzione esplicita raw-key LUKS1 |
| PyInstaller | `pyinstaller.extract` | Membri incorporati e figli `.pyc` | `pyinstaller extract` per opzioni specifiche dell'archivio |
| Python freezers | `pyfreeze.extract`, `nuitka.extract` | Payload estratti o struttura di pacchetto compilato supportata | `pyfreeze` sperimentale; la variante Nuitka determina ciò che sopravvive |
| Python protetto | `pyarmor.unpack`, `sourcedefender.decrypt` | Testo in chiaro/bytecode disponibile, metadati o report sui confini delle chiavi | Materiale runtime/chiave corrispondente; modalità PyArmor dedicata e opzioni di strictness |
| Sorgente e bytecode Python | `py.deob`, `py.decompile`, `py.disasm` | Sorgente decodificato, sorgente decompilato o traccia di istruzioni | `py decompile --emit source,disasm,ast`; è necessario un interprete corrispondente per i controlli di ricompilazione |
| Pickle | `pickle.classify` | Analisi simbolica e classificazione | `pickle` per le singole operazioni di ispezione/ricostruzione |
| JavaScript | `js.deob` | Deobfuscation supportata, recupero moduli webpack/Vite, gestione Node SEA/bytenode | `js unbundle` espone il set più ampio di bundler; source map e opzioni di rinomina sono controlli diretti |
| WebAssembly | `wasm.deob` | WAT recuperato o sollevato più sidecar di rilevamento, riepilogo e recupero | `wasm decompile --target` sceglie Rust, TypeScript, C, WAT o JSON |
| Electron / Tauri | `webview.carve` | Membri frontend incorporati | `webview` supporta anche Wails; il recupero automatico Wails usa `go.classify` |
| PHP / Phar | `php.peel` | Sorgente decodificato, output `op_array`, figli dell'archivio, report su residui/chiavi | Chiavi e IV devono essere staticamente disponibili per i livelli cifrati |
| JVM / DEX | `jvm.classify` | Sorgente Java, manifest di protector e recupero, figli class/archive | `jvm`/`apk` per mapping, firme e backend esterni opzionali |
| .NET | `dotnet.classify` | C# e analisi, costanti/risorse/CIL recuperati o metadati Native AOT | `dotnet` per altri formati sorgente e backend di rendering installati |
| Pacchetti mobile / bytecode | `mobile.classify` | Estrazione runtime/membri, lift Hermes, sorgente Dart kernel o report AOT | `hermes`, `flutter`, `mobile` per controlli specifici del formato |
| Lua | `lua.deob` | Lua recuperato e sidecar di dialetto/fedeltà | `lua` per controlli espliciti su famiglia e output |
| Shell / Office / PDF | `shell.deob` | Script decodificati, sorgente macro/p-code, XLM e report sui documenti | `shell` per operazioni specifiche dei documenti |
| Ruby | `ruby.classify` | Analisi più sorgente YARV/mruby recuperato ove disponibile | `ruby` per report specifici della variante; la classificazione JRuby/TruffleRuby non è recupero del sorgente Ruby |
| BEAM / EZ | `beam.classify` | Erlang/Elixir/Core Erlang, disassembly, figli dell'archivio | I chunk di debug sopravvissuti determinano la fedeltà del sorgente |
| SWF / ABC | `as3.classify` | Struttura ABC, elenchi di istruzioni, pseudocodice AS3 | Gli obfuscator commerciali denominati rimangono solo rilevabili |
| Go | `go.classify` | Simboli, tipi, analisi garble e membri del filesystem incorporato | `go` per DWARF, BuildInfo e altri report dedicati |
| Swift / Objective-C | `swift-objc.classify` | Metadati, slice universali e dylib della shared cache | Potrebbero essere necessari file sub-cache/simboli affiancati; controlli diretti `swift`/`macho` |
| Packer nativi | `native.packer-unpack` | Immagine decompattata o modulo incorporato disponibile, simboli, firme, report di recupero | Solo i dispatch dei packer implementati eseguono l'unpack; i tier VM commerciali possono fermarsi al rilevamento |
| Immagini native | `native.image-classify` | Identità, simboli, firme, riscontri e un report pseudo-sorgente x86-64/AArch64 limitato | `native decompile` seleziona un comando completo di output del sorgente; i percorsi sorgente ARM32/MIPS32 sono diretti |
| Windows / OS/2 NE | `native.ne-structure` | Segmenti, entry, import e risorse | Recupero strutturale anziché decompilazione del sorgente |
| Perl / R / Tcl / Haxe / WSH | `scriptlang.classify` | Report linguistici, strutture recuperate e artefatti figli supportati | Le API delle librerie per formato espongono operazioni più fini |
| Nim / Zig / Crystal / D | `nativelang.classify` | Impronte linguistiche, simboli e struttura nativa parziale | La classificazione richiede marcatori linguistici sopravvissuti sufficienti |
Ad esempio, un'applicazione PyInstaller riconosciuta può progredire attraverso `pyinstaller.extract` → `pyarmor.unpack` → `py.decompile`; un APK attraverso l'estrazione dei membri → DEX → Java; e un'immagine nativa impacchettata attraverso l'unpacking → analisi linguistica o dell'immagine. Ogni freccia dipende da ciò che quel particolare livello produce effettivamente.```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 selezione esplicita source-target, il replay della mappatura e l'invocazione opzionale di backend esterni restano operazioni dedicate. Registro dei pass · Selezione della catena e layout dell'output.
La mappa delle capacità copre gruppi di comandi e integrazioni. Il suo
inventario leggibile dalla macchina collega sorgente, test, documentazione, stato
di supporto e demo. Il riferimento CLI copre i comandi annidati;
i flag globali coprono le opzioni condivise. Usa disrobe <command> --help
per l'interfaccia della tua build installata.
Anche i comandi di progetto e servizio sono indicizzati lì: serve, plugin, init, config, catalog, passes, doctor, install, install-deps, self-update, completions, man, explain e bug-report. Usa doctor per sondare da 46 a 51 strumenti esterni a seconda della piattaforma e identificare i backend opzionali mancanti.
La tabella mappa ogni attività di ripristino ai comandi di Disrobe e agli strumenti correlati. I decompilatori installati e gli artefatti esportati forniscono i punti di integrazione mostrati di seguito.
L'inventario dei confronti elenca i confronti a input condiviso ancora in sospeso. Le opzioni dei backend sono documentate in installazione e nelle guide dei linguaggi collegate sopra.
Le misurazioni usano gli input fissati, le versioni degli strumenti e le regole di scoring collegate di seguito. I conteggi DEX e JAR misurano la compilazione delle regioni emesse da ciascuno strumento. Quelle popolazioni differiscono, quindi i loro conteggi non classificano la qualità del ripristino. Il recall dei segreti APK usa la stessa ground truth di otto token.
Input, risultati grezzi degli strumenti e comandi di riproduzione.
La stessa analisi Ghidra 12.1.2 vede codice diverso dopo che Disrobe esporta un eseguibile pacchettizzato come PE ricostruito. Questi snapshot locali usano fixture pacchettizzate reali e benigne e registrano sia aumenti sia diminuzioni. Le colonne funzioni/istruzioni/stringhe provengono dallo snapshot di analisi a nove input; i rendering C completati provengono dallo snapshot separato del decompilatore a sei input. Un rendering completato è output non vuoto, non un voto di correttezza del sorgente.
I conteggi di kkrunchy diminuiscono. Più funzioni scoperte non sono necessariamente più funzioni corrette, e questi conteggi di analisi non sostituiscono un confronto byte per byte. Leggi lo snapshot di analisi, lo snapshot del decompilatore e le separate misurazioni di ripristino byte nativo.
L'indice delle evidenze collega le misurazioni di ripristino alle loro fixture, metodi di confronto, comandi e risultati.
I risultati distinguono ripristino byte, accettazione del compilatore e controlli comportamentali. L'accettazione del compilatore e i conteggi di copertura non sono punteggi di equivalenza.
Questi controlli misurano Disrobe rispetto a un artefatto originale, un compilatore, un interprete o un corpus etichettato. Sono distinti dal confronto tra due decompilatori. Ogni risultato collegato registra la popolazione di input, i prerequisiti e il comando di riproduzione.
I record di evidenza completi descrivono ciascuna popolazione e regola di valutazione.
Le etichette dei grafici usano strong per un riferimento di correttezza indipendente, recompile-only per l'accettazione del compilatore e coverage-self-reported per i contatori di copertura di Disrobe stesso. Il metodo di confronto e la popolazione definiscono l'ambito di ciascun risultato.
Consulta i risultati, i confronti tra strumenti e i prerequisiti di riproduzione per le singole misurazioni.
--backend auto. Controlla l'help del comando e la guida all'installazione prima di scegliere un backend.
Il chain runner collega pass a scopo singolo tramite artefatti condivisi e rappresentazioni intermedie. Un pass contribuisce con l'output che può giustificare; i consumatori a valle conservano la provenienza e segnalano i confini non supportati. Esplora l'architettura, il modello dei pass, la scala IR e il chain runner.
Inizia con la documentazione, la guida rapida e la guida ai risultati. Usa disrobe explain <code> per cercare una diagnostica. Per modifiche al progetto, leggi la guida ai contributi e i test e le evidenze della funzionalità pertinente.
Il modello di minaccia descrive i confini di fiducia e la gestione degli input. Segnala problemi di sicurezza tramite SECURITY.md. LEGAL.md descrive le considerazioni legali del progetto; il permesso di analizzare un artefatto dipende dalle tue circostanze.
Ogni versione di Disrobe è proprietaria e source-available secondo la Disrobe Source-Available License, Version 1.1, che sostituisce la Elastic License 2.0 e la Version 1.0 per tutte le versioni e revoca tutte le concessioni precedenti come indicato nell'avviso di relicensing.
Progetti personali per hobby, apprendimento personale e ricerca di sicurezza indipendente non retribuita da parte di individui, istruzione e ricerca senza scopo di lucro e giornalismo in buona fede sono gratuiti, come definito nella licenza.
Qualsiasi uso da parte di o per conto di un'azienda richiede una licenza a pagamento. Vedi licenza commerciale.
Attribuzione richiesta: Questo lavoro ha utilizzato Disrobe, creato da 1-3-7: https://github.com/1-3-7/disrobe
Fork diversi dai fork di contribuzione, ripubblicazione, rebranding, rivendita, hosting e sviluppo concorrente sono vietati. Il software è fornito così com'è, a rischio dell'utente.
Vedi attribuzione, termini per i contributori, riepilogo e avvisi di terze parti.
Copyright (c) 2025-2026 1-3-7. Tutti i diritti riservati.
I commit di sviluppo precedenti sono stati consolidati in una singola baseline come parte dell'aggiornamento di documentazione e grafica.
| Attività | Comandi | Output o passaggio successivo |
|---|
| Trovare indicatori, segreti e risultati statici | scan, frisk, strings, ioc, indicators, behavior | Risultati e offset |
| Ispezionare funzioni, flussi e comportamento | query, capabilities, taint, vulnmatch | IR interrogabile, mappature ATT&CK/MBC e report source-to-sink |
| Conservare annotazioni e artefatti strutturati | annot, rename, envelope, verify, yara | Envelope degli artefatti e stato dell'analista |
| Seguire la provenienza e confrontare le esecuzioni | chain, context, status, report, diff, guard, semdiff | Report, hash e differenze di ripristino |
| Raccogliere dati di rete pubblici | prowl | Raccolta di rete esplicita, separata dal ripristino offline |
| Superficie | Punto di ingresso | Guida |
|---|
| Rust | Tipi core condivisi e singoli crate dei pass | API della libreria |
| Python | Binding tipizzati tramite import disrobe | Binding Python |
| HTTP, gRPC e LSP | disrobe serve | Servizio |
| Model Context Protocol | disrobe-mcp o disrobe serve --mcp | Integrazione MCP |
| Editor e strumenti di analisi | VS Code, IDA Pro, Ghidra, Binary Ninja | Integrazioni per editor |
| GitHub Actions | Action del repository e output SARIF | GitHub Action |
| Controlli locali dei commit | Hook ID disrobe | pre-commit |
| Browser | Worker Wasm lato client | Playground |
| Contesto di progetto per strumenti di coding | disrobe init --ide | Sidecar dei metadati |
| Attività di ripristino | Strumenti citati | Percorso di Disrobe | Come sceglierli o combinarli |
|---|
| Bytecode Python in sorgente | pycdc, PyLingual, uncompyle6, decompyle3 | Decompilatore CPython 1.0-3.15 in-process, ripristino di code-object annidati, output sorgente/disassembly/AST | Ispeziona sorgente, disassembly e AST recuperati dal decompilatore Python integrato |
| Estrazione di Python congelato | pyinstxtractor-ng, pydecipher | Estrazione PyInstaller, Nuitka e freezer seguita dal ripristino del bytecode | auto può proseguire dal membro estratto attraverso un protector fino al decompilatore Python |
| PyArmor | Pyarmor-Static-Unpack-1shot | Ripristino statico di wrapper/runtime, report delle modalità, lifting BCC statico opzionale | Fornisci il runtime corrispondente per recuperare i dati del wrapper e ispezionare i risultati specifici della modalità |
| Ispezione di Pickle | fickling, pickletools di Python | Traccia delle istruzioni, riduttori simbolici, classificazione e ricostruzione dei valori | Ispeziona senza eseguire i riduttori; pickletools valuta l'ispezione e CPython verifica la ricostruzione su 470 fixture generate |
| Deoffuscamento JavaScript | webcrack, synchrony, REstringer | obfuscator.io, JS-Confuser, pattern Jscrambler supportati, decoder esoterici, ripristino di costanti/control-flow | Usa js deob per opzioni esplicite o auto quando il JS è dentro un pacchetto |
| Unbundling JS e source map | wakaru, webcrack, sourcemapper | Estrazione dei moduli, gestione delle source-map, rinomina scope-aware, ispezione V8 pacchettizzato | js unbundle espone più route di bundler rispetto all'invio automatico della catena |
| WebAssembly | WABT wasm-decompile, Binaryen | Pseudo-sorgente WAT e C/Rust/TypeScript, riepiloghi JSON, inversione di offuscamento supportata | Ispeziona un source target selezionato; l'esecuzione con wasmtime verifica il comportamento recuperato in modo indipendente |
| Sorgente JVM | CFR, Vineflower, Procyon, Fernflower | Ripristino nativo dei classfile più gestione di protector/stringhe | jvm decompile scrive artefatti Disrobe accanto all'output di un backend installato; CFR ha un risultato misurato di compile-yield di seguito |
| Pacchetti Android e DEX | JADX, apktool, androguard, dex2jar | Ripristino Dalvik in-process, metadati/firme APK, estrazione a runtime, output Java | La decompilazione DEX/APK usa per default il percorso nativo; un backend Android viene selezionato esplicitamente. JADX ha una gamba misurata di seguito |
| Assembly .NET | ILSpy, dnSpy, dnSpyEx, de4dot | Ripristino CIL più costanti specifiche del protector, risorse, corpi VM e metadati Native AOT | dotnet decompile scrive l'output CIL di Disrobe accanto a un renderer installato; --backend auto seleziona ILSpy, dnSpyEx, dnSpy o de4dot |
| Decompilazione nativa | Ghidra, IDA, Binary Ninja | Pseudo-C x86-64 C/Rust e AArch64/ARM32/MIPS32 in-process; report di simboli/tipi recuperati | Seleziona Ghidra headless con --backend ghidra, oppure usa le integrazioni per editor e i simboli esportati in una sessione di analisi interattiva |
| Eseguibili nativi pacchettizzati | upx -d, unipacker, Detect It Easy | Unpacker implementati ed emulazione bounded dello stub, immagini PE ricostruite, moduli loader incorporati | Esporta le immagini PE recuperate in Ghidra/IDA. Le misurazioni Ghidra di seguito confrontano gli input pacchettizzati e ricostruiti |
| Offuscamento nativo | Ghidra, IDA, Binary Ninja e script di deoffuscamento | Trasformazioni OLLVM/Tigress, semplificazione MBA, stack strings, metadati nativi e report di ripristino | Seleziona l'operazione/API nativa pertinente; una sola fingerprint di VM-protector non implica il ripristino del corpo |
| Metadati Go e garble | GoReSym, redress, gore | pclntab, metadati di modulo/tipo, file incorporati e literal garble recuperabili | go riporta nomi/tipi; native decompile gestisce separatamente il percorso sorgente del codice macchina |
| Swift / Objective-C | swift-demangle, class-dump, jtool2 | Dati runtime di classi/protocolli/selector, rendering dei simboli, fat slice, dylib in shared-cache | Fornisci mapping sopravvissuti e file sub-cache; i nomi originali cancellati dalla rinomina richiedono una mappa esterna |
| Bytecode e VM Lua | unluac, luadec, LuaDec51 | Sorgente Lua/LuaJIT/Luau più offuscatori supportati e ripristino di VM personalizzate | IronBrew2 ha evidenza di differenziale di esecuzione con strumenti reali; il ripristino di .luac ordinario e il ripristino di VM sono operazioni diverse |
| Bytecode Ruby | Disassembly MRI | Sorgente YARV e mruby, elenchi di opcode, classificazione freezer/AOT | La ricompilazione MRI valuta il recall dei nomi degli opcode; quella misura non stabilisce l'equivalenza di esecuzione |
| Livelli PHP | php-malware-finder | Peeling di catene eval e loop/cifrari a chiave letterale, estrazione Phar, report di envelope degli encoder | Usa i livelli statici e il materiale di chiave disponibile; i payload commerciali con chiave del loader nativo restano sigillati |
| PowerShell, Bash, VBA | PowerDecode, strumenti FLARE, olevba | Deoffuscamento di shell, sorgente/p-code VBA e stomping, formule XLM, azioni PDF | shell colloca il ripristino degli script e i risultati sui documenti accanto al resto dell'analisi degli artefatti |
| BEAM / ActionScript | beam_disasm di Erlang, RABCDAsm | Ripristino di debug-source/Core Erlang di BEAM e pseudocodice dei corpi dei metodi ABC | Conserva i chunk di debug quando disponibili; BEAM stripped ha un controllo separato di esecuzione con Erlang reale |
| Hermes / React Native | hermes-dec, hbctool, DroidSaw | Estrazione a runtime, struttura HBC, lifting pseudo-JavaScript supportato | Il parsing HBC copre da v60 a v96; il lifting del sorgente ha un confine misurato più ristretto. Il taint del bridge Hermes-to-DEX non è implementato |
| Flutter / Dart AOT | reFlutter, Darter, blutter | Tabelle sorgente del Kernel, grafo delle dichiarazioni AOT, corpi ARM64, stringhe, parsing delle rename-map | Sorgente Kernel e metadati AOT sono livelli di ripristino diversi; le versioni degli snapshot vincolano il parsing AOT |
| Container e firmware | binwalk, unblob, 7-Zip | Estrazione di formati registrati, routing ricorsivo dei figli, decodifica/carving del firmware, report di rifiuto per membro | Passa i membri estratti direttamente ai pass dei linguaggi; confronta i byte dei membri invece di trattare una magic riconosciuta come estrazione riuscita |
| Segreti e indicatori | APKLeaks, TruffleHog, Gitleaks, LinkFinder | Risultati su albero recuperato/APK, offset dei token, stringhe statiche, report di segreti e IOC | Scansiona l'APK o l'albero recuperato; confronta APKLeaks con gli stessi segreti piantati di seguito |
| Identificazione di formato, packer, compilatore | Detect It Easy, TrID, PEiD, binwalk | Identificazione multi-segnale, simboli, firme e suggerimenti di routing | Usa identify/detect per selezionare un percorso di ripristino, poi ispeziona il suo output effettivo |
| Capacità e taint | capa, script Ghidra, Joern | Risultati ATT&CK/MBC con offset, query su IR normalizzato, report di flusso source-to-sink | Esegui il matching delle capacità e l'analisi source-to-sink sugli artefatti recuperati; il report di taint include la sua popolazione di test Juliet |
| Strumento e input | Risultato Disrobe | Risultato dello strumento citato | Cosa verifica la misurazione |
|---|
| JADX 1.5.5 · Android DEX | 157 / 228 regioni emesse compilano senza errori | 281 / 303 regioni emesse compilano senza errori | DEX EdgeCases committato; javac reale, compilazione dell'intero sorgente poi isolamento bounded delle regioni che bloccano l'attribuzione; popolazioni emesse diverse |
| CFR 0.152 · JVM classfile | 181 / 181 regioni emesse compilano senza errori | 152 / 166 regioni emesse compilano senza errori | JAR EdgeCases committato; la stessa procedura di compilatore/scorer; popolazioni emesse diverse |
| APKLeaks 2.6.3 · APK con segreti piantati | 8 / 8 segreti piantati | 5 / 8 segreti piantati | Recall a token esatto sullo stesso APK; Disrobe trova anche la chiave di accesso segreta AWS piantata, la credenziale Basic e il JWT |
| Input pacchettizzato | Funzioni Ghidra, pacchettizzato → ricostruito | Istruzioni, pacchettizzato → ricostruito | Stringhe, pacchettizzato → ricostruito | Rendering C completati, pacchettizzato → ricostruito |
|---|
| 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 misurato |
| MEW · AccessEnum | 4 → 152 | 125 → 9.592 | 3 → 802 | Non misurato |
| MEW · Autologon | 4 → 295 | 125 → 19.595 | 3 → 406 | Non misurato |
| kkrunchy classic · NASM hello | 4 → 1 | 149 → 10 | 3 → 4 | 4 → 1 |
| Input | Regioni emesse da Disrobe | Regioni emesse dallo strumento citato | Confine della popolazione | Riproduci |
|---|
| Android DEX | 157 / 228 regioni emesse compilano senza errori | JADX 1.5.5: 281 / 303 regioni emesse compilano senza errori | nessuna classifica tra strumenti: ogni strumento ha la propria popolazione di regioni emesse | cargo run --locked -p disrobe-bench-head-to-head -- --check --only apk-jadx-cfr |
| JVM classfile | 181 / 181 regioni emesse compilano senza errori | CFR 0.152: 152 / 166 regioni emesse compilano senza errori | nessuna classifica tra strumenti: ogni strumento ha la propria popolazione di regioni emesse | cargo run --locked -p disrobe-bench-head-to-head -- --check --only apk-jadx-cfr |
| Ripristino | Risultato registrato | Riferimento e limite |
|---|
| Python 3.14.5, moduli fissati | 6077 di 6286 code object | Ricompilazione CPython con confronto normalizzato della struttura degli opcode; jump target, la maggior parte degli operandi e oggetti recuperati aggiuntivi non sono valutati. Risultato |
| Python 3.14.5, popolazione core fissa | 17396 di 18276 code object, misurazione locale | Lo stesso confronto normalizzato su 574 moduli; questo non è un risultato di equivalenza semantica. Risultato |
| Python legacy 1.0-3.7 | almeno 150 di 191 fixture (soglia di regressione) | Ricompilazione con interprete del periodo o token strutturali rispetto al sorgente originale. Risultato |
| Classificazione Pickle | 102 / 102 fixture di classificazione | Semantica di pickletools. Risultato |
| Ricostruzione Pickle | 470 / 470 fixture ricostruite superano i controlli di uguaglianza alla riesecuzione | Riesecuzione CPython. Risultato |
| Compilazione sorgente JVM | 131 di 131 metodi compilano | javac reale. Risultato |
| Comportamento JVM | 117 / 131 metodi corrispondono all'esecuzione osservata | JVM reale; otto metodi divergono e sei non sono pilotati in isolamento. Risultato |
| Android DEX | 118 / 118 classi presentate al verifier | JVM -Xverify:all; 37 di 155 classi sono link-skipped e non valutate. Risultato |
| .NET C# | 18 / 35 tipi EdgeCases completi ricompilano standalone | Roslyn csc reale; sorgente legale non stabilisce comportamento equivalente. Risultato |
| Corpi VM .NET | Modello Eazfuscator: 67 / 67 istruzioni; KoiVM reale: 6 / 6 corpi sollevati | Riferimenti separati originali/clean-build; EazVM usa un virtualizer nel repository, KoiVM usa l'output di uno strumento reale. Evidenza |
| WebAssembly | 57 / 57 funzioni idonee | wasmtime confronta return, trap e i primi 4.096 byte della memoria lineare sugli input di test. Risultato |
| BEAM senza chunk di debug | 19 / 19 moduli | Ricompilazione Erlang/OTP 27.3.4, confronto degli export e output/stato di uscita di test/0. Risultato |
| Lua IronBrew2 | Output reale 2.7.0 standard e MAX recuperato a esecuzione corrispondente | Interprete Lua reale rispetto ai programmi originali; una famiglia di VM. Risultato |
| Ruby YARV | Greeter 100%; megafile 98,67% di recall dei nomi degli opcode | Ricompilazione MRI; il recall multiset ignora ordine, operandi, branch target e istruzioni extra. Risultato |
| Nomi di tipo Go stripped | 838 di 838 nomi | Metadati reali go1.26.3 dalla build di confronto. Risultato |
| Hermes HBC v96 | 8 di 8 funzioni, zero operazioni di fallback | Campione hermesc reale con sorgente originale e nomi delle funzioni. Risultato |
| Byte nativi pacchettizzati | UPX, FSG, NSPack, Petite, MPRESS .text byte-identico su coppie committate citate; risorse di Yoda's Crypter byte-identiche | Byte originali allineati a RVA; i residui di immagine intera e risorse restano riportati separatamente. Tabella per input |
| Indicatori piantati | 6 / 6 categorie IOC rappresentate | Endpoint committati, risultati nel manifest, URL, IPv4, email e ground truth .onion. Risultato |
| Grafo di chiamata MCP | 5 / 5 archi diretti, tutti identificati correttamente | ELF stripped confrontato con il suo gemello distinto non stripped della toolchain. Precisione, recall |
| Taint nativo | 93 / 190 flussi etichettati richiamati; zero falsi positivi, misurazione locale | Slice NIST Juliet CWE-78 char/system, gcc 16.2.0 -O2; sette categorie di flusso dichiarate non hanno casi in questa slice. Risultato |