
Suite CLI en Rust que descompila estáticamente, desofusca y desempaqueta código nativo, bytecode, scripts, firmware y paquetes de aplicaciones en más de 15 ecosistemas mediante un único pipeline automático.
Empezar · Entradas compatibles · Recuperación automática · Comparación de herramientas · Evidencia · Documentación
Disrobe es una suite de línea de comandos escrita en Rust para descompilar, desofuscar y desempaquetar software. Úsala para clasificar un archivo desconocido, recuperar código para ingeniería inversa, extraer indicadores para una investigación o preparar artefactos para un desensamblador.
Recupera Python desde bytecode y aplicaciones congeladas, Java desde classfiles y DEX, C# desde CIL, JavaScript desde bundles, Lua desde máquinas virtuales personalizadas, y C o Rust desde código nativo. Extrae archivos de instaladores, firmware, paquetes móviles y aplicaciones Electron, Tauri o Wails. Mantén el código fuente recuperado, los símbolos, las cadenas, los tipos y la procedencia juntos para su posterior análisis.
La compilación completa cataloga 170 familias en 15 ecosistemas y detecta 103 formatos de contenedor. disrobe auto identifica cada capa, ejecuta una pasada correspondiente y sigue a los hijos recuperados en sus propias rutas de recuperación. Los comandos dedicados exponen controles más precisos, informes de análisis y backends opcionales. La recuperación se ejecuta de forma estática por defecto; el código fuente, la estructura, la salida parcial y los límites de claves faltantes permanecen distinguibles en el resultado.
Si Disrobe te resulta útil, considera dar una estrella al repositorio.
Ver el vídeo completo · Leer la transcripción
Veinte comandos de CLI en 2 minutos 12 segundos: desempaqueta un ejecutable nativo, recupera Python y Lua, divide módulos JavaScript, restaura source maps, inspecciona WebAssembly y recursos de Android, extrae indicadores y conserva informes y hashes de artefactos. El capítulo final muestra la configuración del proyecto, la configuración del IDE, las anotaciones del analista y los completados de shell. La transcripción incluye el inventario completo de comandos de la compilación grabada; el mapa de capacidades explica sus límites de soporte.
Descarga el archivo para tu plataforma desde GitHub Releases, verifícalo contra el SHA256SUMS de la release y coloca disrobe en tu PATH. Los archivos de release incluyen paquetes de firmas; la guía de verificación explica cómo inspeccionarlos.
| Plataforma | Objetivos de release |
|---|---|
| Windows | x86-64, ARM64 |
| macOS | x86-64, ARM64 |
| Linux | x86-64 y ARM64 con glibc; x86-64 con musl |
Comprueba el binario que instalaste:```sh disrobe --version disrobe --help
Para compilar la CLI desde un clon, instala el toolchain de Rust del repositorio y los [requisitos previos de compilación nativos](https://github.com/1-3-7/disrobe/blob/main/docs/src/installation.md), y luego ejecuta:```sh
cargo build --locked --release -p disrobe-cli --bin disrobe
El ejecutable es target/release/disrobe, o target/release/disrobe.exe en Windows. Consulta la guía de instalación para conocer las feature flags y las compilaciones slim.
Comienza con una aplicación, biblioteca o paquete. Identifícala, recupera sus capas reconocidas y luego inspecciona el resumen de recuperación:```sh disrobe identify path/to/application disrobe auto path/to/application --out recovered/ --capture-stages disrobe context --out recovered/
`identify` informa el formato y las señales disponibles. `auto` extrae y recupera las capas reconocidas. `context` resume las pasadas resultantes, la confianza y la procedencia. Con `--capture-stages`, inspecciona cada etapa bajo `recovered/01-*/`, `recovered/02-*/` y `recovered/final/`; `chain.json` registra la topología y los hashes, y `recovery.json` registra los resultados y los tiempos.
Usa un comando dedicado cuando sepas la salida que necesitas:```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/
El decompilador nativo emite C por defecto en x86-64; --format rust selecciona Rust. AArch64, ARM32 y MIPS32 emiten pseudo-C. native export reconstruye imágenes PE empaquetadas compatibles para una herramienta de análisis externa; webview escribe el árbol de recursos del frontend recuperado sin iniciar la aplicación.
El repositorio incluye un pequeño módulo WebAssembly para el playground del navegador. Desde un clon, con la CLI completa en tu 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
El primer comando escribe `add.summary.json`; el segundo escribe texto de WebAssembly en `add.lifted.wat`. La recuperación automática
selecciona una cadena disponible y escribe sus artefactos bajo `recovered/`; `--capture-stages` conserva
los resultados intermedios. Estas operaciones inspeccionan el módulo sin ejecutar su función exportada.
Inspecciona los archivos recuperados junto con el informe: la identificación por sí sola no establece la recuperación. Las construcciones no compatibles, el material de clave ausente y las cadenas no disponibles aparecen en el resultado. La [guía de resultados](https://github.com/1-3-7/disrobe/blob/main/docs/src/reading-a-result.md) explica artefactos, diagnósticos, resultados parciales y procedencia.
[Abrir el playground del navegador](https://1-3-7.github.io/disrobe/playground/) · [Seguir la guía de inicio rápido](https://github.com/1-3-7/disrobe/blob/main/docs/src/quickstart.md)
## Encuentra tu entrada
**Recuperar** significa que una ruta alcanzable emite código fuente, bytes o estructura. **Parcial** significa que recupera solo parte de esa información. **Solo detección** significa que identifica la familia sin recuperar su cuerpo protegido. Estos niveles describen operaciones sobre entradas compatibles; un nombre de familia por sí solo no garantiza que todas las versiones o configuraciones se recuperen. Las listas a continuación incluyen el catálogo completo de familias y formatos adicionales expuestos por comandos y extractores dedicados.
| Entrada | Recuperación y salida | Comandos y guía |
|---|---|---|
| Python | Bytecode y marshal de CPython 1.0 a 3.15 a código fuente; desensamblado de PyPy, MicroPython `.mpy` v0 a v6, Jython, IronPython y Brython; extracción de payload congelado; nombres, firmas y fallback estructural de 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 | Desofuscación de código fuente, reversión de minificación, división de módulos, source maps, inspección de datos en caché de V8 y runtime empaquetado | `js` · [JavaScript](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/javascript.md) |
| WebAssembly | `.wasm` a WAT, Rust, TypeScript, pseudo-código C o JSON; inspección de Component Model y grafo de tipos GC; reversión de ofuscación compatible | `wasm` · [WebAssembly](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/wasm.md) |
| JVM / Android | `.class`, JAR, DEX, APK, AAB; código fuente Java, modismos Kotlin/Scala, información de manifiesto y firma, informes de protectores y sidecars de mapeo | `jvm`, `apk` · [JVM y Android](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/jvm-android.md) |
| .NET | Metadatos PE/CLR y CIL a pseudo-código C#, F# o VB; inspección de ReadyToRun y Native AOT; extracción de bundle de archivo único | `dotnet` · [.NET](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/dotnet.md) |
| Nativo | Identificación o análisis de PE32/PE64, EFI PE, ELF32/ELF64, módulos del kernel, Mach-O thin/fat, COFF, MZ, NE, LE, LX y código sin formato; emisión de código fuente en las rutas específicas de arquitectura anteriores | `native`, `macho`, `semdiff` · [Nativo](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/native.md), [decompilación](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/native-decompile.md) |
| Go | Metadatos de runtime de PE/ELF/Mach-O, nombres de funciones y tipos eliminados, archivos `embed.FS`, informes de garble y literales recuperables | `go` · [Go](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/go.md) |
| Swift / Objective-C | Clases, protocolos, campos, selectores, símbolos desmanglados de Mach-O; slices universales; dylibs de caché compartida de dyld | `swift`, `macho` · [Swift](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/swift.md) |
| Lua | Bytecode de Lua 5.1 a 5.4, LuaJIT 2.0/2.1, Luau, Garry's Mod Lua (GLua); código fuente e informes de fidelidad por entrada; recuperación compatible de VM y cadenas | `lua` · [Lua](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/lua.md) |
| PHP | Pelado de cadena de código fuente/eval, bucles de decodificación con clave literal y capas AES, extracción de Phar, recuperación de `op_array` serializado; los envoltorios de codificadores comerciales siguen limitados por clave | `php` · [PHP](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/php.md) |
| Ruby | Binarios InstructionSequence de MRI/YARV 2.6 a 3.4 y bytecode RITE de mruby a Ruby; clasificación de freezer y AOT | `ruby` · [Ruby](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/ruby.md) |
| Erlang / Elixir | Módulos BEAM y archivos EZ; código abstracto superviviente o `Dbgi` a código fuente, fallback a Core Erlang, listado de instrucciones | `beam` · [BEAM](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/beam.md) |
| ActionScript 3 | Bloques `DoABC` de SWF FWS/CWS/ZWS y bytecode ABC sin formato a desensamblado y pseudocódigo AS3 | `as3` · [ActionScript](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/as3.md) |
| Runtimes móviles | Análisis de cabecera de Hermes v60 a v96, lift a pseudo-JavaScript de v62/v71/v74/v76/v83/v84/v89/v96; cuerpos de código fuente del kernel Dart de Flutter; declaraciones, cadenas y desensamblado de AOT ARM64 | `hermes`, `flutter`, `mobile` · [Móvil](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/mobile.md) |
| Shell / documentos | PowerShell, Bash, Batch, VBScript, WSH; p-code y stomping de VBA3/5/6/7; código fuente de macros de Office, fórmulas XLM BIFF8/BIFF12, scripts/acciones incrustados en PDF | `shell` · [Shell y documentos](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/shell.md) |
| Otros artefactos de lenguajes | Árboles de operaciones/bytecode de Perl, metadatos RDS y Rcpp de R, starkits de Tcl, salidas JS/SWF/HashLink/Neko de Haxe; huellas, símbolos y estructura parcial de Nim, Zig, Crystal y D | `auto`, APIs de biblioteca · [Lenguajes de script](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/shell.md), [nativo](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/native.md) |
| Python pickle | Desensamblado de protocolo, traza simbólica, reconstrucción y clasificación sin llamar a reductores de pickle | `pickle` · [Pickle](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/pickle.md) |
| Archivos / firmware / frontends | La lista completa de contenedores a continuación; ASAR de Electron, mapas incrustados de Tauri v1/v2, árboles `embed.FS` de Wails v2 | `extract`, `webview`, `auto` · [Contenedores](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: todos los freezers, protectores y ofuscadores de código fuente con nombre</strong></summary>
| Familia o formato | Soporte y requisito previo |
|---|---|
| PyInstaller 2.x a 6.20+ | Recupera archivos incrustados y bytecode, incluidas las capas AES-CTR/CFB compatibles |
| Nuitka onefile, standalone, module, wheel | Extrae payloads de onefile; recupera símbolos y estructura visible en Python a partir de formas compiladas |
| cx_Freeze, py2exe, shiv, pex, Briefcase | Extracción de empaquetadores mediante `pyfreeze`; el comando sigue siendo experimental |
| PyOxidizer | Extracción experimental, no validada |
| SourceDefender `.pye` | Descifrado estático mediante `py sourcedefender` y `sourcedefender.decrypt` |
| PyArmor v3 (DES heredado), PyArmor v4 (mixto heredado), PyArmor v5 (AES heredado) | Solo detección: límite de clave envuelta en RSA |
| PyArmor v6, PyArmor v7 | Recuperación estática parcial; el modo super y las claves no disponibles restringen la salida |
| PyArmor v8, PyArmor v9 / 9-Pro | Recuperación estática de envoltorios donde el material de clave está disponible. El resultado publicado <!-- m:pyarmor_frac -->72 / 72<!-- /m --> cuenta solo la decodificación completa de `CodeObject` raíz para envoltorios de prueba predeterminados v8/v9 con nombre; no establece equivalencia de código fuente ni cubre licencia registrada/pro, BCC o modo super |
| Kramer / Specter, Berserker, BlankOBF, PlusOBF, Wodx, pyobfuscate.com, pyobfuscate.com (2026 XOR/lambda), PyObfuscator (mauricelambert), Manglify, Oxyry, pyminifier, familia de ofuscadores en línea, Xindex, Patchwork, pyc-zipper | Recuperación estática de código fuente/loader mediante el evaluador AST; se informan capas individuales y residuales |
| Jawbreaker, ObfuXtreme | Recupera el cuerpo presente en el artefacto; los payloads obtenidos en tiempo de ejecución permanecen ausentes |
| python-obfuscator (PyPI), pyobfus, Pypacker | Pelado parcial de envoltorios y clasificación |
PyArmor puede necesitar el archivo de runtime correspondiente junto al envoltorio. Su ruta BCC dedicada requiere `--allow-bcc` y emite lifts nativos estáticos más esqueletos de Python para cuerpos modelados; la recuperación automática consciente de rutas puede publicar los mismos artefactos BCC. Solo el hook dinámico de PyArmor v6/v7 ejecuta código de muestra, detrás de `--allow-dynamic` con un watchdog. `--allow-bcc` permite únicamente análisis estático dentro del árbol y no ejecuta la muestra ni invoca herramientas externas. [Detalles de versión y modo](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/python.md#pyarmor).
</details>
<details>
<summary><strong>JavaScript, WebAssembly y aplicaciones web empaquetadas</strong></summary>
| Familia o formato | Soporte y ruta |
|---|---|
| obfuscator.io / javascript-obfuscator, JS-Confuser | Recupera arrays de cadenas compatibles, transformaciones de dispatcher/control de flujo, predicados opacos y capas de loader; comandos directos y `js.deob` |
| Jscrambler, js-obfuscator (jsobfu) | Recuperación parcial de plantillas y transformaciones estáticas |
| JSFuck, aaencode, jjencode, JSFiretruck, Dean Edwards Packer | Decodificación estática mediante operaciones dedicadas y rutas de cadena reconocidas |
| JSDefender, Arxan / Digital.ai | Detección y pelado parcial de transformaciones estáticas; las operaciones de JS comercial protegido requieren la opción de autorización del comando |
| PACE | Solo detección |
| webpack 4, webpack 5, Vite, Rollup, Rolldown, esbuild, Turbopack, Bun, Parcel, Browserify, SystemJS; módulos AMD | Desempaquetado/recuperación de módulos directa. La cadena despacha webpack y Vite; los marcadores de catálogo para otros bundlers no hacen que esas rutas sean automáticas por sí mismos |
| bytenode `.jsc`, Node SEA, nexe, nw.js | Inspección/carving de datos V8 empaquetados; Node SEA y bytenode tienen ramas de cadena explícitas |
| Electron ASAR, Tauri v1/v2, Wails v2 | Recupera árboles de frontend incrustados; Electron/Tauri usan `webview.carve`, Wails usa `go.classify`; `webview` directo maneja los tres |
| Bun standalone, Deno eszip v2 a v2.3 / `deno compile` | Recupera grafos de módulos incrustados mediante los lectores de contenedor respectivos; eszip también expone un lector Rust directo |
| Wobfuscator, Jscrambler WASM, wasm-mixer / Wasmixer | Reversión parcial de transformaciones compatibles mediante `wasm.deob`; los fixtures con forma de herramienta califican las transformaciones, sin salida comprometida de esos ofuscadores mismos |
| Tigress → Emscripten, wasm-name-obfuscator | Detecta y clasifica; el helper de Tigress está fuera de la ruta de ejecución de `wasm deob`, y los nombres originales destruidos permanecen no disponibles |
[Rutas de JavaScript](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/javascript.md) · [Límites de Wasm](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/wasm.md) · [Diseños de frontend incrustado](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/webview.md).
</details>
<details>
<summary><strong>Empaquetadores, protectores y familias de ofuscación nativos</strong></summary>
| Familia | Soporte y ruta |
|---|---|
| Donut, sRDI | Recupera el módulo incrustado a partir de diseños compatibles de loader de shellcode |
| UPX, ASPack, Petite, MPRESS, FSG, PECompact, Yoda's Crypter, NSPack, MEW, kkrunchy | Rutinas de desempaquetado implementadas, accesibles mediante `native unpack` y la cadena de empaquetadores; la fidelidad varía según familia y espécimen |
| ASProtect, Morphine, nPack, NeoLite, PolyCryptor, Warzone Crypter | `StubEvalPending`: el comportamiento del emulador tiene evidencia de stub construida por especificación; la recuperación real de empaquetados de proveedor no está validada y no se anuncia despacho de desempaquetado |
| Yoda's Protector, VMProtect, Themida / WinLicense | CLI y auto solo detección. Helpers Rust separados exponen carving asistido por originales o recuperación de secciones protegidas; no establecen devirtualización de todo el programa |
| PE-Protector, PELock, Enigma Protector, Armadillo, Obsidium, WinLicense | Solo detección |
| DotNetPatcher, NetCryptor | Delegan la capa gestionada al pase de .NET |
| Aplanado de OLLVM, flujo de control falso, sustitución de instrucciones; Tigress CFF | Transformaciones e informes de desofuscación estática compatibles mediante las APIs Rust nativas; el análisis aplicable aparece en los informes de recuperación nativa |
| Alcatraz, Emotet CFF, Mirai, Dridex, Trickbot, obfus.h, Cryptify (rust-obfuscator), guardian-rs, obfusheader.h, obfuscxx, Amice | Firmas de ofuscación nativa con nombre; los helpers individuales de cadenas/control de flujo tienen una recuperación más limitada que la familia detectada completa |
El análisis nativo también recupera símbolos de Rust/C++, RTTI y vtables de C++, modelos de objetos y recursos DFM de Delphi/C++Builder, información DWARF/PDB/STABS, importaciones, grafos de llamadas, firmas criptográficas y coincidencias FLIRT. El análisis de instrucciones abarca x86, ARM, RISC-V, MIPS, PowerPC, SPARC, eBPF y AVR; la emisión de código fuente es el conjunto de arquitecturas más pequeño listado arriba. [Análisis nativo](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/native.md) · [Evidencia de desempaquetado y recuperación de bytes](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/native-unpack.md) · [Desofuscación](https://github.com/1-3-7/disrobe/blob/main/docs/src/anti-analysis.md).
</details>
<details>
<summary><strong>Familias de paquetes JVM, Android, .NET y móviles</strong></summary>
| Familia | Soporte y requisito previo |
|---|---|
| Zelix KlassMaster, Allatori, Stringer, DashO | Recuperación de cadenas para patrones compatibles, seguida de descompilación de classfile |
| DexGuard | Detección, pelado estructural y emulación de descifrado de cadenas dentro de la clase para constantes con clave compatibles |
| BlackObfuscator | Reconocimiento de dispatcher DEX y anotación de orden de bloques |
| ProGuard / R8 | Reproducción de mapeo a un sidecar de restauración de nombres; los nombres originales requieren `mapping.txt` |
| yGuard, SkidSuite2, JBCO | Solo detección |
| Promon SHIELD, Guardsquare DexGuard RASP, Guardsquare ThreatCast, Appdome, OneSpan, Arxan / Digital.ai, Zimperium zShield, Licel DexProtector | Identificación de RASP de Android e informes estructurales |
| ConfuserEx2 | Recuperación de constantes en muestras reales y aplanado de control de flujo; los recursos cifrados pueden conservar un límite de clave en tiempo de ejecución |
| Eazfuscator.NET | Descifrado de cadenas y lifting de VM calificados por modelo; el fixture de VM proviene de un virtualizador en el repositorio, no del producto comercial |
| KoiVM (ConfuserEx VM) | Cuerpos virtualizados elevados a CIL sobre salida comprometida de herramienta real |
| ConfuserEx, Dotfuscator, Dotfuscator CE, SmartAssembly, Babel, DeepSea, Spices.Net, Goliath, Skater, .NET Reactor, CryptoObfuscator, ArmDot, Agile.NET, Obfuscar, DotNetPatcher, NetCryptor, BitMono | Detección y recuperación parcial específica de familia: nombres, cadenas, recursos o estructuras de métodos. BitMono está en el detector de protectores más allá del catálogo de cadenas .NET de 22 entradas |
| Themida (envoltorio .NET), ILProtector, MaxToCode | Solo detección para cuerpos con clave de loader nativo |
| React Native APK, React Native IPA; bytecode Hermes de React Native | Extrae payloads JS/Hermes y enruta bytecode compatible al lift de Hermes |
| Kernel Dart de Flutter; snapshot AOT de Flutter (`libapp.so`) | Recuperación de tabla de código fuente del kernel; declaraciones AOT, metadatos y desensamblado ARM64. La versión del snapshot y los nombres disponibles restringen la recuperación |
| Xamarin / .NET MAUI APK, Apache Cordova APK, Capacitor APK, NativeScript APK | Identificación de runtime y extracción compatible de paquetes/miembros |
| Android APK (`classes.dex`), Android app bundle (AAB / APKM / XAPK), IPA | Inspección de paquetes y extracción de hijos; la recuperación posterior depende del runtime incrustado |
Los decodificadores de cadenas .NET para SmartAssembly, Spices.Net, Skater, .NET Reactor, Eazfuscator.NET y CryptoObfuscator se califican sobre algoritmos modelados, no sobre ensamblados producidos por proveedores comprometidos. ConfuserEx2, Obfuscar y BitMono tienen evidencia real de ensamblados protegidos. [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) · [Móvil](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/mobile.md).
</details>
<details>
<summary><strong>Familias de Lua, PHP, shell, Ruby, BEAM, Swift, Go y ActionScript</strong></summary>
| Familia | Soporte y requisito previo |
|---|---|
| IronBrew2 | Recuperación de VM, verificada diferencialmente en ejecución sobre salida real 2.7.0 estándar y MAX |
| Prometheus | Recuperación parcial, incluidos árboles de despacho `Vmify` apilados compatibles |
| MoonSec V1, MoonSec V2, MoonSec V3, AztupBrew, DarkSec, Boronide, PSU, WeAreDevs LuaU, luaobfuscator.com, SLua (Unity Lua 5.3), Hercules | Recuperación parcial de Lua; la evidencia de VM con forma MoonSec usa un bootstrap sintético |
| Luraph | Solo detección |
| Bytecode Luau, Garry's Mod Lua (GLua) | Reconocimiento de dialecto; lifting de Luau y recuperación parcial de GLua |
| ionCube, SourceGuardian, Zend Guard | Detección de envoltorios PHP comerciales; las claves residentes en el loader siguen siendo un límite. Los casos heredados de clave estática pueden producir estructura `op_array` parcial |
| FOPO, Better PHP Obfuscator | Pelado estático de cadenas eval de PHP, con requisitos de clave literal para capas cifradas |
| Invoke-Obfuscation (token), Invoke-Obfuscation (AST), Invoke-Obfuscation (string), Invoke-Obfuscation (encoding), Invoke-Obfuscation (compress); Invoke-Stealth, PowerHell, Chameleon, psobf | Recuperación estática de PowerShell |
| Invoke-Obfuscation (launcher), ISESteroids | Recuperación parcial de PowerShell |
| Bashfuscator (token), Bashfuscator (string), Bashfuscator (obfuscate), Bashfuscator (compress); indirecta de Bash (IFS/eval); node-bash-obfuscate (eval de tabla de chunks) | Recuperación estática de Bash |
| Ofuscación de Batch (`%random%`), ofuscación de Batch (indirección set); macro VBA (descompilación de p-code + stomping) | Pelado de Batch y recuperación de código fuente/p-code de VBA |
| InstructionSequence de YARV (`.rb` compilado), bytecode RITE de mruby | Recuperación de código fuente Ruby |
| Ejecutable autoextraíble OCRA, paquete RubyScript2Exe | Clasificación/recuperación parcial de freezer |
| Clase compilada de JRuby, imagen nativa de TruffleRuby | Solo detección mediante el catálogo de Ruby |
| Archivo BEAM (módulo compilado de Erlang / Elixir), archivo EZ (módulos `.beam` envueltos en ZIP) | Extracción de módulos, recuperación de código fuente/chunks de depuración o fallback a Core Erlang |
| garble | Metadatos de Go y literales compatibles; el hashing de nombres originales no puede revertirse sin la semilla faltante |
| Metadatos Swift / Objective-C de Mach-O, binario fat (universal) de Mach-O, caché compartida de dyld | Metadatos de runtime, recuperación de slices y dylibs |
| SwiftShield | Parser de mapeo; el mapeo debe proporcionarse para recuperar los nombres originales |
| DoABC de SWF (Flash, FWS/CWS/ZWS), bytecode ABC sin formato | Desensamblado y pseudocódigo de cuerpos de métodos |
| secureSWF, DoSWF, Kindi, Irrfuscator, swfLock | Solo detección |
[Catálogo de familias](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>Los 103 formatos de contenedor registrados</strong></summary>
| Categoría | Formatos |
|---|---|
| Archivos generales | 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 |
| Archivos de aplicación y lenguajes | JAR, WAR, APK, XPI, WHL, EGG, CRX, NUPKG, VSIX, PYZ, Electron ASAR |
| Instaladores e imágenes de aplicación | PKG, DMG, DEB, RPM, AppImage, Snap, Flatpak, MSIX/APPX, MSI, NSIS, Squirrel, Inno Setup, InstallShield, Enigma Virtual Box |
| Sistemas de archivos y flujos de sistemas de archivos | SquashFS, cramfs, ext4, romfs, MinixFS, Android sparse, btrfs-send, EROFS, JFFS2, NTFS, UBI/UBIFS, YAFFS2, QNX, partclone |
| Imágenes de disco y despliegue | ISO, OCI, imagen Docker, VHD, VHDX, WIM, GPT, MBR, FAT12/16/32 |
| Flujos de compresión | XZ, gzip, bzip2, zstd, LZMA, lzip, LZ4, zlib, Unix compress (`.Z`) |
| Datos de aplicación incrustados | Bun standalone, UnityFS, bundle de archivo único de .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; volumen de firmware UEFI |
| Memoria y volúmenes cifrados | Minidump de Windows, LUKS1 |
El roster declara detección para cada entrada. De esas rutas, 102 usan el extractor genérico; <!-- roster-breadth:containers-exercised -->42<!-- /roster-breadth --> tienen entradas comprometidas que alcanzan bytes de miembros, DMG tiene evidencia comprometida solo de detección, y 59 no tienen entrada comprometida. LUKS1 se califica por separado contra texto plano y requiere una clave de volumen sin formato `aes-cbc-plain` para el descifrado; sin una, informa el límite de clave. Los métodos de compresión individuales, los miembros cifrados, los volúmenes divididos y las características del sistema de archivos tienen límites más estrechos. StuffIt 5 actualmente devuelve el blob del archivo mediante extracción aunque sus decodificadores de fork existan. El contenido OTP-AES de Airoha se extrae literalmente.
Lectores Rust adicionales exponen estructuras de Deno eszip, Apple APFS/HFS+, superposiciones añadidas a ELF y Blazor WebCIL; no son entradas adicionales en el recuento de 103 formatos. [Rutas de extracción, versiones de métodos y límites](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/containers.md) · [Registro de contenedores](https://github.com/1-3-7/disrobe/blob/main/crates/disrobe-binfmt/src/container.rs).
</details>
## Recuperación automática`auto` elige una pasada del registro compilado, la ejecuta y luego vuelve a identificar su salida y los hijos extraídos. Se detiene en el umbral de confianza, un hash de contenido repetido o el límite de profundidad (ocho por defecto). Los informes y los archivos fuente etiquetados como terminales permanecen como salidas en lugar de volver a introducirse en la detección. La siguiente tabla da cuenta de cada pasada registrada por una compilación completa; una compilación reducida puede omitir filas condicionadas por características.
| Capa de entrada | IDs de pasada registrados | Salida automática | Controles dedicados o requisito previo |
|---|---|---|---|
| Archivos, instaladores, firmware, volúmenes | `binfmt.container` | Hijos extraídos, seguidos recursivamente hacia pasadas de lenguaje/nativas | `extract` para informes de miembros y la opción explícita de clave sin procesar LUKS1 |
| PyInstaller | `pyinstaller.extract` | Miembros incrustados e hijos `.pyc` | `pyinstaller extract` para opciones específicas del archivo |
| Congeladores de Python | `pyfreeze.extract`, `nuitka.extract` | Cargas útiles extraídas o estructura de paquete compilado compatible | `pyfreeze` experimental; el sabor de Nuitka determina qué sobrevive |
| Python protegido | `pyarmor.unpack`, `sourcedefender.decrypt` | Texto plano/bytecode disponible, metadatos o informes de límites de clave | Material de tiempo de ejecución/clave correspondiente; modo PyArmor dedicado y opciones de rigor |
| Código fuente y bytecode de Python | `py.deob`, `py.decompile`, `py.disasm` | Código fuente pelado, código fuente descompilado o traza de instrucciones | `py decompile --emit source,disasm,ast`; se necesita un intérprete correspondiente para las comprobaciones de recompilación |
| Pickle | `pickle.classify` | Análisis simbólico y clasificación | `pickle` para las operaciones individuales de inspección/reconstrucción |
| JavaScript | `js.deob` | Desofuscación compatible, recuperación de módulos webpack/Vite, manejo de Node SEA/bytenode | `js unbundle` expone el conjunto más amplio de empaquetadores; los mapas de origen y las opciones de renombrado son controles directos |
| WebAssembly | `wasm.deob` | WAT recuperado o elevado más archivos auxiliares de detección, resumen y recuperación | `wasm decompile --target` elige Rust, TypeScript, C, WAT o JSON |
| Electron / Tauri | `webview.carve` | Miembros de frontend incrustados | `webview` también admite Wails; la recuperación automática de Wails usa `go.classify` |
| PHP / Phar | `php.peel` | Código fuente pelado, salida `op_array`, hijos del archivo, informes de residuales/claves | Las claves e IV deben estar disponibles estáticamente para las capas cifradas |
| JVM / DEX | `jvm.classify` | Código fuente Java, manifiestos de protector y recuperación, hijos de clase/archivo | `jvm`/`apk` para mapeo, firmas y backends externos opcionales |
| .NET | `dotnet.classify` | C# y análisis, constantes/recursos/CIL recuperados o metadatos de Native AOT | `dotnet` para otros formatos de código fuente y backends de renderizado instalados |
| Paquetes móviles / bytecode | `mobile.classify` | Extracción de tiempo de ejecución/miembros, elevación de Hermes, código fuente del kernel de Dart o informes AOT | `hermes`, `flutter`, `mobile` para controles específicos de formato |
| Lua | `lua.deob` | Lua recuperado y archivos auxiliares de dialecto/fidelidad | `lua` para controles explícitos de familia y salida |
| Shell / Office / PDF | `shell.deob` | Scripts pelados, código fuente/p-code de macros, XLM e informes de documentos | `shell` para operaciones específicas de documentos |
| Ruby | `ruby.classify` | Análisis más código fuente YARV/mruby recuperado cuando esté disponible | `ruby` para informes específicos de sabor; la clasificación de JRuby/TruffleRuby no es recuperación de código fuente Ruby |
| BEAM / EZ | `beam.classify` | Erlang/Elixir/Core Erlang, desensamblado, hijos del archivo | Los fragmentos de depuración supervivientes determinan la fidelidad del código fuente |
| SWF / ABC | `as3.classify` | Estructura ABC, listados de instrucciones, pseudocódigo AS3 | Los ofuscadores comerciales con nombre permanecen solo como detección |
| Go | `go.classify` | Símbolos, tipos, análisis de garble y miembros del sistema de archivos incrustado | `go` para DWARF, BuildInfo y otros informes dedicados |
| Swift / Objective-C | `swift-objc.classify` | Metadatos, segmentos universales y dylibs de caché compartida | Pueden ser necesarios archivos hermanos de subcaché/símbolos; controles directos `swift`/`macho` |
| Empaquetadores nativos | `native.packer-unpack` | Imagen desempaquetada disponible o módulo incrustado, símbolos, firmas, informes de recuperación | Solo los despachos de empaquetadores implementados desempaquetan; los niveles de VM comerciales pueden detenerse en la detección |
| Imágenes nativas | `native.image-classify` | Identidad, símbolos, firmas, hallazgos y un informe acotado de pseudocódigo x86-64/AArch64 | `native decompile` selecciona un comando completo de salida de código fuente; las rutas de código fuente ARM32/MIPS32 son directas |
| Windows / OS/2 NE | `native.ne-structure` | Segmentos, entradas, importaciones y recursos | Recuperación estructural en lugar de descompilación de código fuente |
| Perl / R / Tcl / Haxe / WSH | `scriptlang.classify` | Informes de lenguaje, estructuras recuperadas y artefactos hijos compatibles | Las API de biblioteca por formato exponen operaciones más detalladas |
| Nim / Zig / Crystal / D | `nativelang.classify` | Huellas de lenguaje, símbolos y estructura nativa parcial | La clasificación requiere suficientes marcadores de lenguaje supervivientes |
Por ejemplo, una aplicación PyInstaller reconocida puede progresar a través de `pyinstaller.extract` → `pyarmor.unpack` → `py.decompile`; un APK a través de la extracción de miembros → DEX → Java; y una imagen nativa empaquetada a través del desempaquetado → análisis de lenguaje o imagen. Cada flecha depende de lo que esa capa particular produzca realmente.```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 selección explícita de origen-destino, la reproducción de mapeos y la invocación opcional de backends externos siguen siendo operaciones dedicadas. Registro de pases · Selección de cadena y diseño de salida.
El mapa de capacidades cubre grupos de comandos e integraciones. Su
inventario legible por máquina enlaza código fuente, pruebas, documentación, estado de
soporte y demos. La referencia de la CLI cubre comandos anidados;
los indicadores globales cubren opciones compartidas. Usa disrobe <command> --help
para consultar la interfaz de tu compilación instalada.
Los comandos de proyecto y servicio también están indexados allí: serve, plugin, init, config, catalog, passes, doctor, install, install-deps, self-update, completions, man, explain y bug-report. Usa doctor para sondear entre 46 y 51 herramientas externas según la plataforma e identificar backends opcionales faltantes.
La tabla asigna cada tarea de recuperación a los comandos de Disrobe y a herramientas relacionadas. Los descompiladores instalados y los artefactos exportados proporcionan los puntos de integración que se muestran a continuación.
El inventario de comparación nombra las comparaciones pendientes de entrada compartida. Las opciones de backend están documentadas en instalación y en las guías de lenguaje enlazadas arriba.
Las mediciones usan las entradas fijadas, las versiones de herramientas y las reglas de puntuación enlazadas abajo. Los recuentos de DEX y JAR miden la compilación de las regiones emitidas por cada herramienta. Esas poblaciones difieren, por lo que sus recuentos no clasifican la calidad de la recuperación. La recuperación de secretos en APK usa la misma verdad de referencia de ocho tokens.
Entradas, resultados brutos de las herramientas y comandos de reproducción.
El mismo análisis de Ghidra 12.1.2 ve código diferente después de que Disrobe exporta un ejecutable empaquetado como un PE reconstruido. Estas instantáneas locales usan fixtures empaquetados benignos reales y registran tanto aumentos como disminuciones. Las columnas de funciones/instrucciones/cadenas provienen de la instantánea de análisis de nueve entradas; los renderizados C completados provienen de la instantánea separada del descompilador de seis entradas. Un renderizado completado es una salida no vacía, no una calificación de corrección del código fuente.
Los recuentos de kkrunchy disminuyen. Más funciones descubiertas no son necesariamente más funciones correctas, y estos recuentos de análisis no sustituyen una comparación de bytes. Lee la instantánea de análisis, la instantánea del descompilador y las mediciones separadas de recuperación de bytes nativos.
El índice de evidencia enlaza las mediciones de recuperación con sus fixtures, métodos de comparación, comandos y resultados.
Los resultados distinguen entre recuperación de bytes, aceptación del compilador y comprobaciones de comportamiento. La aceptación del compilador y los recuentos de cobertura no son puntuaciones de equivalencia.
Estas comprobaciones miden Disrobe contra un artefacto original, un compilador, un intérprete o un corpus etiquetado. Son distintas de comparar dos descompiladores. Cada resultado enlazado registra la población de entrada, los requisitos previos y el comando de reproducción.
Registros de evidencia completos describen cada población y regla de calificación.
Las etiquetas de los gráficos usan strong para una referencia de corrección independiente, recompile-only para la aceptación del compilador, y coverage-self-reported para los propios contadores de cobertura de Disrobe. El método de comparación y la población definen el alcance de cada resultado.
Explora los resultados, las comparaciones de herramientas y los requisitos previos de reproducción para mediciones individuales.
--backend auto. Consulta la ayuda del comando y la guía de instalación antes de elegir un backend.
El ejecutor de cadenas conecta pasos de propósito único a través de artefactos compartidos y representaciones intermedias. Un paso aporta la salida que puede justificar; los consumidores posteriores conservan la procedencia e informan los límites no compatibles. Explora la arquitectura, el modelo de pasos, la escalera de IR y el ejecutor de cadenas.
Comienza con la documentación, la guía de inicio rápido y la guía de resultados. Usa disrobe explain <code> para consultar un diagnóstico. Para cambios en el proyecto, lee la guía de contribución y las pruebas y evidencia de la función correspondiente.
El modelo de amenazas describe los límites de confianza y el manejo de entradas. Informa problemas de seguridad a través de SECURITY.md. LEGAL.md describe las consideraciones legales del proyecto; el permiso para analizar un artefacto depende de tus circunstancias.
Todas las versiones de Disrobe son propietarias y de código disponible bajo la Licencia Source-Available de Disrobe, Versión 1.1, que reemplaza la Elastic License 2.0 y la Versión 1.0 para todas las versiones y revoca todas las concesiones anteriores según lo establecido en el aviso de relicencia.
Los proyectos de hobby personales, el aprendizaje personal y la investigación de seguridad independiente no remunerada por parte de individuos, la educación e investigación sin fines de lucro, y el periodismo genuino son gratuitos, según se define en la licencia.
Cualquier uso por o para una empresa requiere una licencia paga. Consulta licencias comerciales.
Crédito requerido: Este trabajo utilizó Disrobe, creado por 1-3-7: https://github.com/1-3-7/disrobe
Los forks que no sean forks de contribución, la republicación, el cambio de marca, la reventa, el alojamiento y el desarrollo competidor están prohibidos. El software se proporciona tal cual, bajo el propio riesgo del usuario.
Consulta atribución, términos para contribuyentes, resumen y avisos de terceros.
Copyright (c) 2025-2026 1-3-7. Todos los derechos reservados.
Los commits de desarrollo anteriores se consolidaron en una única línea base como parte de la actualización de documentación y visual.
| Tarea | Comandos | Salida o siguiente paso |
|---|
| Encontrar indicadores, secretos y hallazgos estáticos | scan, frisk, strings, ioc, indicators, behavior | Hallazgos y desplazamientos |
| Inspeccionar funciones, flujos y comportamiento | query, capabilities, taint, vulnmatch | IR consultable, mapeos ATT&CK/MBC e informes de origen a destino |
| Conservar anotaciones y artefactos estructurados | annot, rename, envelope, verify, yara | Envoltorios de artefactos y estado del analista |
| Seguir la procedencia y comparar ejecuciones | chain, context, status, report, diff, guard, semdiff | Informes, hashes y diferencias de recuperación |
| Recopilar datos de red públicos | prowl | Recopilación de red explícita, separada de la recuperación sin conexión |
| Superficie | Punto de entrada | Guía |
|---|
| Rust | Tipos centrales compartidos y crates de pases individuales | API de biblioteca |
| Python | Enlaces tipados mediante import disrobe | Enlaces de Python |
| HTTP, gRPC y LSP | disrobe serve | Servicio |
| Model Context Protocol | disrobe-mcp o disrobe serve --mcp | Integración MCP |
| Editores y herramientas de análisis | VS Code, IDA Pro, Ghidra, Binary Ninja | Integraciones de editor |
| GitHub Actions | Acción de repositorio y salida SARIF | GitHub Action |
| Comprobaciones de commit locales | ID de hook disrobe | pre-commit |
| Navegador | Worker Wasm del lado del cliente | Playground |
| Contexto de proyecto para herramientas de programación | disrobe init --ide | Sidecar de metadatos |
| Tarea de recuperación | Herramientas nombradas | Ruta de Disrobe | Cómo elegirlas o combinarlas |
|---|
| Bytecode de Python a código fuente | pycdc, PyLingual, uncompyle6, decompyle3 | Descompilador de CPython 1.0 a 3.15 en proceso, recuperación de objetos de código anidados, salida de código fuente/desensamblado/AST | Inspecciona el código fuente recuperado, el desensamblado y el AST del descompilador de Python integrado |
| Extracción de Python congelado | pyinstxtractor-ng, pydecipher | Extracción de PyInstaller, Nuitka y freezers seguida de recuperación de bytecode | auto puede continuar desde el miembro extraído a través de un protector y llegar al descompilador de Python |
| PyArmor | Pyarmor-Static-Unpack-1shot | Recuperación estática de wrapper/runtime, informes de modo, elevación estática opcional de BCC | Proporciona el runtime correspondiente para recuperar los datos del wrapper e inspeccionar los resultados específicos de cada modo |
| Inspección de Pickle | fickling, pickletools de Python | Traza de instrucciones, reductores simbólicos, clasificación y reconstrucción de valores | Inspecciona sin ejecutar reductores; pickletools califica la inspección y CPython comprueba la reconstrucción en 470 fixtures generados |
| Desofuscación de JavaScript | webcrack, synchrony, REstringer | obfuscator.io, JS-Confuser, patrones de Jscrambler compatibles, decodificadores esotéricos, recuperación de constantes/flujo de control | Usa js deob para opciones explícitas o auto cuando el JS está dentro de un paquete |
| Desempaquetado de JS y source maps | wakaru, webcrack, sourcemapper | Extracción de módulos, manejo de source maps, renombrado con reconocimiento de ámbito, inspección de V8 empaquetado | js unbundle expone más rutas de bundlers que el despacho automático de cadenas |
| WebAssembly | WABT wasm-decompile, Binaryen | Pseudo-código fuente WAT y C/Rust/TypeScript, resúmenes JSON, reversión de ofuscación compatible | Inspecciona un destino de código fuente seleccionado; la ejecución con wasmtime comprueba el comportamiento recuperado de forma independiente más abajo |
| Código fuente JVM | CFR, Vineflower, Procyon, Fernflower | Recuperación nativa de classfiles más manejo de protectores/cadenas | jvm decompile escribe artefactos de Disrobe junto a la salida de un backend instalado; CFR tiene un resultado medido de rendimiento de compilación más abajo |
| Paquetes Android y DEX | JADX, apktool, androguard, dex2jar | Recuperación de Dalvik en proceso, metadatos/firmas de APK, extracción en runtime, salida Java | La descompilación de DEX/APK usa por defecto la ruta nativa; un backend de Android se selecciona explícitamente. JADX tiene una etapa medida más abajo |
| Ensamblados .NET | ILSpy, dnSpy, dnSpyEx, de4dot | Recuperación de CIL más constantes específicas de protectores, recursos, cuerpos de VM y metadatos de Native AOT | dotnet decompile escribe la salida CIL de Disrobe junto a un renderizador instalado; --backend auto selecciona ILSpy, dnSpyEx, dnSpy o de4dot |
| Descompilación nativa | Ghidra, IDA, Binary Ninja | Pseudo-C de x86-64 C/Rust y AArch64/ARM32/MIPS32 en proceso; informes de símbolos/tipos recuperados | Selecciona Ghidra en modo headless con --backend ghidra, o usa integraciones de editor y símbolos exportados en una sesión de análisis interactiva |
| Ejecutables nativos empaquetados | upx -d, unipacker, Detect It Easy | Desempaquetadores implementados y emulación acotada de stubs, imágenes PE reconstruidas, módulos loader incrustados | Exporta las imágenes PE recuperadas a Ghidra/IDA. Las mediciones de Ghidra de abajo comparan las entradas empaquetadas y reconstruidas |
| Ofuscación nativa | Ghidra, IDA, Binary Ninja y scripts de desofuscación | Transformaciones OLLVM/Tigress, simplificación MBA, stack strings, metadatos nativos e informes de recuperación | Selecciona la operación/API nativa relevante; una huella de protector de VM por sí sola no implica la recuperación del cuerpo |
| Metadatos de Go y garble | GoReSym, redress, gore | pclntab, metadatos de módulos/tipos, archivos incrustados y literales de garble recuperables | go informa nombres/tipos; native decompile maneja por separado la ruta de código fuente de máquina |
| Swift / Objective-C | swift-demangle, class-dump, jtool2 | Datos de clases/protocolos/selectores en runtime, renderizado de símbolos, slices fat, dylibs de caché compartida | Proporciona los mapeos supervivientes y los archivos de subcaché; los nombres originales borrados por renombrado necesitan un mapa externo |
| Bytecode y VMs de Lua | unluac, luadec, LuaDec51 | Código fuente Lua/LuaJIT/Luau más recuperación de ofuscadores compatibles y VMs personalizadas | IronBrew2 tiene evidencia de diferencial de ejecución con herramienta real; la recuperación ordinaria de .luac y la recuperación de VM son operaciones distintas |
| Bytecode de Ruby | Desensamblado de MRI | Código fuente YARV y mruby, listados de opcodes, clasificación de freezer/AOT | La recompilación de MRI califica la recuperación de nombres de opcodes; esa medida no establece equivalencia de ejecución |
| Capas de PHP | php-malware-finder | Pelado de cadenas eval y bucles/cifrados de claves literales, extracción de Phar, informes de envoltorios de codificadores | Usa capas estáticas y el material de claves disponible; las cargas comerciales con claves de loader nativo permanecen selladas |
| PowerShell, Bash, VBA | PowerDecode, herramientas FLARE, olevba | Desofuscación de shell, código fuente/p-code y stomping de VBA, fórmulas XLM, acciones de PDF | shell coloca la recuperación de scripts y los hallazgos de documentos junto al resto del análisis de artefactos |
| BEAM / ActionScript | beam_disasm de Erlang, RABCDAsm | Recuperación de debug-source/Core Erlang de BEAM y pseudocódigo de cuerpos de métodos ABC | Conserva los chunks de depuración cuando estén disponibles; el BEAM sin ellos tiene una comprobación de ejecución con Erlang real aparte |
| Hermes / React Native | hermes-dec, hbctool, DroidSaw | Extracción en runtime, estructura HBC, elevación de pseudo-JavaScript compatible | El análisis de HBC cubre de v60 a v96; la elevación de código fuente tiene un límite medido más estrecho. El taint del puente Hermes-a-DEX no está implementado |
| Flutter / Dart AOT | reFlutter, Darter, blutter | Tablas de código fuente de Kernel, grafo de declaraciones AOT, cuerpos ARM64, cadenas, análisis de mapas de renombrado | El código fuente de Kernel y los metadatos AOT son niveles de recuperación distintos; las versiones de snapshot limitan el análisis AOT |
| Contenedores y firmware | binwalk, unblob, 7-Zip | Extracción de formatos registrados, enrutamiento recursivo de hijos, decodificación/carving de firmware, informes de rechazo por miembro | Alimenta los miembros extraídos directamente a los pases de lenguaje; compara los bytes de los miembros en lugar de tratar una magia reconocida como extracción exitosa |
| Secretos e indicadores | APKLeaks, TruffleHog, Gitleaks, LinkFinder | Hallazgos en árbol recuperado/APK, desplazamientos de tokens, cadenas estáticas, informes de secretos e IOC | Escanea el APK o el árbol recuperado; compara APKLeaks con los mismos secretos plantados de abajo |
| Identificación de formato, empaquetador, compilador | Detect It Easy, TrID, PEiD, binwalk | Identificación multi-señal, símbolos, firmas y pistas de enrutamiento | Usa identify/detect para seleccionar una ruta de recuperación y luego inspecciona su salida real |
| Capacidades y taint | capa, scripts de Ghidra, Joern | Hallazgos ATT&CK/MBC con desplazamientos, consultas de IR normalizada, informes de flujo de origen a destino | Ejecuta la coincidencia de capacidades y el análisis de origen a destino sobre los artefactos recuperados; el informe de taint incluye su población de pruebas Juliet |
| Herramienta y entrada | Resultado de Disrobe | Resultado de la herramienta nombrada | Qué comprueba la medición |
|---|
| JADX 1.5.5 · Android DEX | 157 / 228 regiones emitidas compilan limpiamente | 281 / 303 regiones emitidas compilan limpiamente | DEX de EdgeCases comprometido; javac real, compilación de código fuente completo y luego aislamiento acotado de las regiones que bloquean la atribución; poblaciones emitidas diferentes |
| CFR 0.152 · classfile JVM | 181 / 181 regiones emitidas compilan limpiamente | 152 / 166 regiones emitidas compilan limpiamente | JAR de EdgeCases comprometido; el mismo procedimiento de compilador/puntuador; poblaciones emitidas diferentes |
| APKLeaks 2.6.3 · APK con secretos plantados | 8 / 8 secretos plantados | 5 / 8 secretos plantados | Recuperación de tokens exactos en el mismo APK; Disrobe también encuentra la clave de acceso de AWS plantada, la credencial Basic y el JWT |
| Entrada empaquetada | Funciones de Ghidra, empaquetado → reconstruido | Instrucciones, empaquetado → reconstruido | Cadenas, empaquetado → reconstruido | Renderizados C completados, empaquetado → reconstruido |
|---|
| 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 | No medido |
| MEW · AccessEnum | 4 → 152 | 125 → 9.592 | 3 → 802 | No medido |
| MEW · Autologon | 4 → 295 | 125 → 19.595 | 3 → 406 | No medido |
| kkrunchy classic · NASM hello | 4 → 1 | 149 → 10 | 3 → 4 | 4 → 1 |
| Entrada | Regiones emitidas por Disrobe | Regiones emitidas por la herramienta nombrada | Límite de población | Reproducir |
|---|
| Android DEX | 157 / 228 regiones emitidas compilan limpiamente | JADX 1.5.5: 281 / 303 regiones emitidas compilan limpiamente | sin clasificación entre herramientas: cada herramienta tiene su propia población de regiones emitidas | cargo run --locked -p disrobe-bench-head-to-head -- --check --only apk-jadx-cfr |
| classfile JVM | 181 / 181 regiones emitidas compilan limpiamente | CFR 0.152: 152 / 166 regiones emitidas compilan limpiamente | sin clasificación entre herramientas: cada herramienta tiene su propia población de regiones emitidas | cargo run --locked -p disrobe-bench-head-to-head -- --check --only apk-jadx-cfr |
| Recuperación | Resultado registrado | Referencia y límite |
|---|
| Python 3.14.5, módulos fijados | 6077 de 6286 objetos de código | Recompilación de CPython con comparación normalizada de estructura de opcodes; los destinos de salto, la mayoría de operandos y los objetos recuperados adicionales no se califican. Resultado |
| Python 3.14.5, población central fija | 17396 de 18276 objetos de código, medición local | La misma comparación normalizada en 574 módulos; esto no es un resultado de equivalencia semántica. Resultado |
| Python legacy 1.0 a 3.7 | al menos 150 de 191 fixtures (umbral de regresión) | Recompilación con el intérprete de la época o tokens estructurales contra el código fuente original. Resultado |
| Clasificación de Pickle | 102 / 102 fixtures de clasificación | Semántica de pickletools. Resultado |
| Reconstrucción de Pickle | 470 / 470 fixtures reconstruidos pasan comprobaciones de igualdad de re-ejecución | Re-ejecución de CPython. Resultado |
| Compilación de código fuente JVM | 131 de 131 métodos compilan | javac real. Resultado |
| Comportamiento JVM | 117 / 131 métodos coinciden con la ejecución observada | JVM real; ocho métodos divergen y seis no se ejecutan de forma aislada. Resultado |
| Android DEX | 118 / 118 clases presentadas al verificador | JVM -Xverify:all; 37 de 155 clases se omiten en el enlazado y no se califican. Resultado |
| .NET C# | 18 / 35 tipos completos de EdgeCases recompilan de forma independiente | Roslyn csc real; código fuente legal no establece comportamiento equivalente. Resultado |
| Cuerpos de VM .NET | Modelo Eazfuscator: 67 / 67 instrucciones; KoiVM real: 6 / 6 cuerpos elevados | Referencias separadas de original/compilación limpia; EazVM usa un virtualizador en el repositorio, KoiVM usa salida de herramienta real. Evidencia |
| WebAssembly | 57 / 57 funciones elegibles | wasmtime compara retornos, traps y los primeros 4.096 bytes de memoria lineal en las entradas de prueba. Resultado |
| BEAM sin chunks de depuración | 19 / 19 módulos | Recompilación con Erlang/OTP 27.3.4, comparación de exportaciones y salida/estado de salida de test/0. Resultado |
| Lua IronBrew2 | La salida real estándar y MAX de 2.7.0 se recupera a una ejecución coincidente | Intérprete de Lua real contra los programas originales; una familia de VM. Resultado |
| Ruby YARV | Greeter 100%; megafile 98.67% de recuperación de nombres de opcodes | Recompilación de MRI; la recuperación de multiconjunto ignora el orden, los operandos, los destinos de salto y las instrucciones adicionales. Resultado |
| Nombres de tipos de Go sin símbolos | 838 de 838 nombres | Metadatos reales de go1.26.3 de la compilación de comparación. Resultado |
| Hermes HBC v96 | 8 de 8 funciones, cero operaciones de reserva | Muestra real de hermesc con código fuente original y nombres de funciones. Resultado |
| Bytes nativos empaquetados | UPX, FSG, NSPack, Petite, MPRESS .text idéntico a nivel de byte en pares comprometidos nombrados; recursos de Yoda's Crypter idénticos a nivel de byte | Bytes originales alineados por RVA; los residuales de imagen completa y recursos se informan por separado. Tabla por entrada |
| Indicadores plantados | 6 / 6 categorías de IOC representadas | Verdad de referencia de endpoints comprometidos, hallazgos de manifiestos, URLs, IPv4, correo electrónico y .onion. Resultado |
| Grafo de llamadas MCP | 5 / 5 aristas directas, todas identificadas correctamente | ELF sin símbolos comparado con su gemelo distinto de toolchain con símbolos. Precisión, recuperación |
| Taint nativo | 93 / 190 flujos etiquetados recuperados; cero falsos positivos, medición local | Slice char/system de NIST Juliet CWE-78, gcc 16.2.0 -O2; siete categorías de flujo declaradas no tienen casos en este slice. Resultado |