Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Submit
ToolsExploitsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

··Feeds·Contact·Privacy·© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
disrobe — Rust CLI suite that statically decompiles, deobfuscates, and unpacks native code, bytecode, scripts, firmware, and app packages across 15+ ecosystems via one automatic pipeline. | Kitploit
Tools/GitHubGitHub/1-3-7/disrobe
Android SecurityStatic AnalysisReverse EngineeringMalware AnalysisMobile SecurityBinary AnalysisFirmware Analysis
GitHub1-3-7/disrobe

disrobe

Rust CLI suite that statically decompiles, deobfuscates, and unpacks native code, bytecode, scripts, firmware, and app packages across 15+ ecosystems via one automatic pipeline.

View Repository
1136125 days agoReviewed by Kitploit

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share
Website
disrobe: recover source, structure, and bytes from compiled software

Get started · Supported inputs · Automatic recovery · Tool comparisons · Evidence · Documentation

See the software underneath

Disrobe is a Rust command-line suite for decompiling, deobfuscating, and unpacking software. Use it to triage an unknown file, recover code for reverse engineering, extract indicators for an investigation, or prepare artifacts for a disassembler.

Recover Python from bytecode and frozen applications, Java from classfiles and DEX, C# from CIL, JavaScript from bundles, Lua from custom virtual machines, and C or Rust from native code. Extract files from installers, firmware, mobile packages, and Electron, Tauri, or Wails applications. Keep recovered source, symbols, strings, types, and provenance together for further analysis.

The full build catalogs 170 families across 15 ecosystems and detects 103 container formats. disrobe auto identifies each layer, runs a matching pass, and follows recovered children into their own recovery paths. Dedicated commands expose finer controls, analysis reports, and optional backends. Recovery runs statically by default; source, structure, partial output, and missing-key boundaries remain distinguishable in the result.

If Disrobe is useful to you, consider starring the repository.

See it in action

Disrobe CLI: unpack, recover, and inspect software

Watch the full video · Read the transcript

Twenty CLI commands in 2 minutes 12 seconds: unpack a native executable, recover Python and Lua, split JavaScript modules, restore source maps, inspect WebAssembly and Android resources, extract indicators, and preserve reports and artifact hashes. The final chapter shows project configuration, IDE setup, analyst annotations, and shell completions. The transcript includes the recorded build's complete command inventory; the capability map explains its support limits.

Get started

Download the archive for your platform from GitHub Releases, check it against the release's SHA256SUMS, and put disrobe on your PATH. Release archives include signature bundles; the verification guide explains how to inspect them.

PlatformRelease targets
Windowsx86-64, ARM64
macOSx86-64, ARM64
Linuxx86-64 and ARM64 with glibc; x86-64 with musl

Check the binary you installed:

root@kitploit:~
disrobe --version
disrobe --help

To build the CLI from a clone, install the repository's Rust toolchain and the native build prerequisites, then run:

root@kitploit:~
cargo build --locked --release -p disrobe-cli --bin disrobe

The executable is target/release/disrobe, or target/release/disrobe.exe on Windows. See the installation guide for feature flags and slim builds.

Recover an application

Start with an application, library, or package. Identify it, recover its recognized layers, then inspect the recovery summary:

root@kitploit:~
disrobe identify path/to/application
disrobe auto path/to/application --out recovered/ --capture-stages
disrobe context --out recovered/

identify reports the format and available signals. auto extracts and recovers the recognized layers. context summarizes the resulting passes, confidence, and provenance. With --capture-stages, inspect each stage under recovered/01-*/, recovered/02-*/, and recovered/final/; chain.json records the topology and hashes, and recovery.json records outcomes and timings.

Use a dedicated command when you know the output you need:

root@kitploit:~
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/

The native decompiler emits C by default on x86-64; --format rust selects Rust. AArch64, ARM32, and MIPS32 emit pseudo-C. native export rebuilds supported packed PE images for an external analysis tool; webview writes the recovered frontend asset tree without starting the application.

Try a small, inspectable artifact

The repository includes a tiny WebAssembly module for the browser playground. From a clone, with the full CLI on your PATH:

root@kitploit:~
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

The first command writes add.summary.json; the second writes WebAssembly text to add.lifted.wat. Automatic recovery selects an available chain and writes its artifacts under recovered/; --capture-stages retains intermediate results. These operations inspect the module without running its exported function.

Inspect the recovered files alongside the report: identification alone does not establish recovery. Unsupported constructs, absent key material, and unavailable chains appear in the result. The result guide explains artifacts, diagnostics, partial outcomes, and provenance.

Open the browser playground · Follow the quickstart

Find your input

Recover means a reachable path emits source, bytes, or structure. Partial means it recovers only part of that information. Detect-only means it identifies the family without recovering its protected body. These levels describe operations on supported inputs; a family name alone is not a guarantee that every version or configuration recovers. The lists below include the full family catalog and additional formats exposed by dedicated commands and extractors.

Python: every named freezer, protector, and source obfuscator
JavaScript, WebAssembly, and packaged web applications
Native packers, protectors, and obfuscation families
JVM, Android, .NET, and mobile package families
Lua, PHP, shell, Ruby, BEAM, Swift, Go, and ActionScript families
All 103 registered container formats

Automatic recovery

auto chooses a pass from the compiled registry, runs it, then re-identifies its output and extracted children. It stops at the confidence threshold, a repeated content hash, or the depth limit (eight by default). Reports and source files tagged as terminal remain outputs rather than being fed back into detection. The following table accounts for every pass registered by a full build; a slim build can omit feature-gated rows.

For example, a recognized PyInstaller application can progress through pyinstaller.extract → pyarmor.unpack → py.decompile; an APK through member extraction → DEX → Java; and a packed native image through unpacking → language or image analysis. Each arrow depends on what that particular layer actually yields.

root@kitploit:~
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, explicit source-target selection, mapping replay, and optional external-backend invocation remain dedicated operations. Pass registry · Chain selection and output layout.

Analyze and export the result

The capability map covers command groups and integrations. Its machine-readable inventory links source, tests, documentation, support status, and demos. The CLI reference covers nested commands; global flags cover shared options. Use disrobe <command> --help for the interface of your installed build.

Project and service commands are also indexed there: serve, plugin, init, config, catalog, passes, doctor, install, install-deps, self-update, completions, man, explain, and bug-report. Use doctor to probe 46 to 51 external tools depending on the platform and identify missing optional backends.

Use the same recovery in your workflow

Compare tools

The table maps each recovery task to Disrobe’s commands and related tools. Installed decompilers and exported artifacts provide the integration points shown below.

The comparison inventory names the outstanding shared-input comparisons. Backend options are documented in installation and the linked language guides above.

Measured tool comparisons

Measurements use the pinned inputs, tool versions, and scoring rules linked below. DEX and JAR counts measure compilation of each tool’s emitted regions. Those populations differ, so their counts do not rank recovery quality. APK secret recall uses the same eight-token ground truth.

Inputs, raw tool results, and reproduction commands.

Give Ghidra the recovered executable

The same Ghidra 12.1.2 analysis sees different code after Disrobe exports a packed executable as a rebuilt PE. These local snapshots use real benign packed fixtures and record both increases and decreases. The function/instruction/string columns come from the nine-input analysis snapshot; completed C renderings come from the separate six-input decompiler snapshot. A completed rendering is nonempty output, not a source-correctness grade.

The kkrunchy counts decrease. More discovered functions are not necessarily more correct functions, and these analysis counts do not replace a byte comparison. Read the analysis snapshot, decompiler snapshot, and separate native byte-recovery measurements.

Inspect the evidence

The evidence index links recovery measurements to their fixtures, comparison methods, commands, and results.

Results distinguish byte recovery, compiler acceptance, and behavioral checks. Compiler acceptance and coverage counts are not equivalence scores.

JADX/CFR scoring details and reproduction commands

Recovery checked against independent references

These checks measure Disrobe against an original artifact, compiler, interpreter, or labeled corpus. They are distinct from comparing two decompilers. Each linked result records the input population, prerequisites, and reproduction command.

Coverage counts and their smaller correctness populations

Chart labels use strong for an independent correctness reference, recompile-only for compiler acceptance, and coverage-self-reported for Disrobe's own coverage counters. The comparison method and population define each result's scope.

Browse the results, tool comparisons, and reproduction prerequisites for individual measurements.

Know the limits

  • Compiled output loses information. Original comments, formatting, names, and some type information may be absent.
  • Family recognition is broader than recovery. A catalog match or successful parser can coexist with partial source emission. Read the family tier and the actual result.
  • Native recovery depends on architecture and output language. The native guide lists supported paths and their tests.
  • Commercial VM-protector detection is not a general source-recovery promise. Internal helpers and protected-section artifacts do not establish a complete CLI recovery path. See native unpacking.
  • Missing keys remain missing. Runtime-derived keys and absent name-hashing seeds cannot be inferred from an unsupported artifact. Python, PHP, and container guides state format-specific boundaries.
  • External backends have their own requirements. Some commands can select installed tools through --backend auto. Check the command's help and installation guide before choosing a backend.
  • Analysis defaults to static recovery. This does not make untrusted input harmless. Resource limits, explicitly selected dynamic operations, and external-process boundaries are described in forensics safety.

Understand the pipeline

Disrobe's intermediate representations, from bytes through program structure to source

The chain runner connects single-purpose passes through shared artifacts and intermediate representations. A pass contributes the output it can justify; downstream consumers retain provenance and report unsupported boundaries. Explore the architecture, pass model, IR ladder, and chain runner.

Documentation and contribution

Start with the documentation, quickstart, and result guide. Use disrobe explain <code> to look up a diagnostic. For changes to the project, read the contributing guide and the relevant feature's tests and evidence.

The threat model describes trust boundaries and input handling. Report security concerns through SECURITY.md. LEGAL.md describes the project's legal considerations; permission to analyze an artifact depends on your circumstances.

License

License: Disrobe Source-Available

Every version of Disrobe is proprietary and source-available under the Disrobe Source-Available License, Version 1.1, which supersedes the Elastic License 2.0 and Version 1.0 for all versions and revokes all earlier grants as stated in the relicensing notice.

Personal hobby projects, personal learning, and unpaid independent security research by individuals, nonprofit education and research, and bona fide journalism are free, as defined in the license.

Any use by or for a company requires a paid license. See commercial licensing.

Required credit: This work used Disrobe, created by 1-3-7: https://github.com/1-3-7/disrobe

Forks other than contribution forks, reposting, rebranding, resale, hosting, and competing development are prohibited. The software is provided as is, at the user's own risk.

See attribution, contributor terms, summary, and third-party notices.

Copyright (c) 2025-2026 1-3-7. All rights reserved.

Earlier development commits were consolidated into a single baseline as part of the documentation and visual refresh.

Download Tool
InputRecovery and outputCommands and guide
PythonCPython 1.0 to 3.15 bytecode and marshal to source; PyPy, MicroPython .mpy v0 to v6, Jython, IronPython, and Brython disassembly; frozen payload extraction; Cython .pyd/.so names, signatures, and structural fallbackpy, pyinstaller, pyarmor, pyfreeze, nuitka · Python
JavaScript / TypeScriptSource deobfuscation, minification reversal, module splitting, source maps, V8 cached-data and packaged-runtime inspectionjs · JavaScript
WebAssembly.wasm to WAT, Rust, TypeScript, C pseudo-source, or JSON; Component Model and GC type-graph inspection; supported obfuscation reversalwasm · WebAssembly
JVM / Android.class, JAR, DEX, APK, AAB; Java source, Kotlin/Scala idioms, manifest and signing information, protector reports and mapping sidecarsjvm, apk · JVM and Android
.NETPE/CLR metadata and CIL to C#, F#, or VB pseudo-source; ReadyToRun and Native AOT inspection; single-file bundle extractiondotnet · .NET
NativePE32/PE64, EFI PE, ELF32/ELF64, kernel modules, thin/fat Mach-O, COFF, MZ, NE, LE, LX, and raw-code identification or analysis; source emission on the architecture-specific paths abovenative, macho, semdiff · Native, decompile
GoPE/ELF/Mach-O runtime metadata, stripped function and type names, embed.FS files, garble reports and recoverable literalsgo · Go
Swift / Objective-CMach-O classes, protocols, fields, selectors, demangled symbols; universal slices; dyld shared-cache dylibsswift, macho · Swift
LuaLua 5.1 to 5.4, LuaJIT 2.0/2.1, Luau bytecode, Garry's Mod Lua (GLua); source and per-input fidelity reports; supported VM and string recoverylua · Lua
PHPSource/eval-chain peeling, literal-key decode loops and AES layers, Phar extraction, serialized op_array recovery; commercial encoder envelopes remain key-limitedphp · PHP
RubyMRI/YARV 2.6 to 3.4 InstructionSequence binaries and mruby RITE bytecode to Ruby; freezer and AOT classificationruby · Ruby
Erlang / ElixirBEAM modules and EZ archives; surviving abstract code or Dbgi to source, Core Erlang fallback, instruction listingbeam · BEAM
ActionScript 3SWF FWS/CWS/ZWS DoABC blocks and raw ABC bytecode to disassembly and AS3 pseudocodeas3 · ActionScript
Mobile runtimesHermes v60 to v96 header parsing, v62/v71/v74/v76/v83/v84/v89/v96 pseudo-JavaScript lift; Flutter Dart kernel source bodies; ARM64 AOT declarations, strings, and disassemblyhermes, flutter, mobile · Mobile
Shell / documentsPowerShell, Bash, Batch, VBScript, WSH; VBA3/5/6/7 p-code and stomping; Office macro source, BIFF8/BIFF12 XLM formulas, PDF embedded scripts/actionsshell · Shell and documents
Other language artifactsPerl op-trees/bytecode, R RDS and Rcpp metadata, Tcl starkits, Haxe JS/SWF/HashLink/Neko outputs; Nim, Zig, Crystal, and D fingerprints, symbols, and partial structureauto, library APIs · Script languages, native
Python pickleProtocol disassembly, symbolic trace, reconstruction, and classification without calling pickle reducerspickle · Pickle
Archives / firmware / frontendsThe complete container list below; Electron ASAR, Tauri v1/v2 embedded maps, Wails v2 embed.FS treesextract, webview, auto · Containers, webview
Family or formatSupport and prerequisite
PyInstaller 2.x to 6.20+Recover embedded archives and bytecode, including supported AES-CTR/CFB layers
Nuitka onefile, standalone, module, wheelExtract onefile payloads; recover symbols and Python-visible structure from compiled forms
cx_Freeze, py2exe, shiv, pex, BriefcasePackager extraction through pyfreeze; the command remains experimental
PyOxidizerExperimental, unvalidated extraction
SourceDefender .pyeStatic decryption through py sourcedefender and sourcedefender.decrypt
PyArmor v3 (legacy DES), PyArmor v4 (legacy mixed), PyArmor v5 (legacy AES)Detect-only: RSA-wrapped key boundary
PyArmor v6, PyArmor v7Partial static recovery; super mode and unavailable keys restrict output
PyArmor v8, PyArmor v9 / 9-ProStatic wrapper recovery where key material is available. The published 72 / 72 result counts complete root CodeObject decoding only for named v8/v9 default-trial wrappers; it does not establish source equivalence or cover registered-license/pro, BCC, or super mode
Kramer / Specter, Berserker, BlankOBF, PlusOBF, Wodx, pyobfuscate.com, pyobfuscate.com (2026 XOR/lambda), PyObfuscator (mauricelambert), Manglify, Oxyry, pyminifier, online obfuscator family, Xindex, Patchwork, pyc-zipperStatic source/loader recovery through the AST evaluator; individual layers and residuals are reported
Jawbreaker, ObfuXtremeRecover the body present in the artifact; runtime-fetched payloads remain absent
python-obfuscator (PyPI), pyobfus, PypackerPartial wrapper peeling and classification

PyArmor can need the matching runtime file beside the wrapper. Its dedicated BCC path requires --allow-bcc and emits static native lifts plus Python skeletons for modeled bodies; path-aware automatic recovery can publish the same BCC artifacts. Only the PyArmor v6/v7 dynamic hook executes sample code, behind --allow-dynamic with a watchdog. --allow-bcc permits only in-tree static analysis and does not execute the sample or invoke external tools. Version and mode details.

Family or formatSupport and route
obfuscator.io / javascript-obfuscator, JS-ConfuserRecover supported string arrays, dispatcher/control-flow transforms, opaque predicates, and loader layers; direct commands and js.deob
Jscrambler, js-obfuscator (jsobfu)Partial template and static-transform recovery
JSFuck, aaencode, jjencode, JSFiretruck, Dean Edwards PackerStatic decoding through dedicated operations and recognized chain routes
JSDefender, Arxan / Digital.aiDetection and partial static-transform peeling; protected commercial-JS operations require the command's authorization option
PACEDetect-only
webpack 4, webpack 5, Vite, Rollup, Rolldown, esbuild, Turbopack, Bun, Parcel, Browserify, SystemJS; AMD modulesDirect unbundling/module recovery. The chain dispatches webpack and Vite; catalog markers for other bundlers do not by themselves make those routes automatic
bytenode .jsc, Node SEA, nexe, nw.jsPackaged V8 data inspection/carving; Node SEA and bytenode have explicit chain branches
Electron ASAR, Tauri v1/v2, Wails v2Recover embedded frontend trees; Electron/Tauri use webview.carve, Wails uses go.classify; direct webview handles all three
Bun standalone, Deno eszip v2 to v2.3 / deno compileRecover embedded module graphs through the respective container readers; eszip also exposes a direct Rust reader
Wobfuscator, Jscrambler WASM, wasm-mixer / WasmixerPartial reversal of supported transforms through wasm.deob; tool-shaped fixtures grade the transforms, with no committed output from those obfuscators themselves
Tigress → Emscripten, wasm-name-obfuscatorDetect and classify; the Tigress helper is outside the wasm deob run path, and destroyed original names remain unavailable

JavaScript routes · Wasm limits · Embedded frontend layouts.

FamilySupport and route
Donut, sRDIRecover the embedded module from supported shellcode-loader layouts
UPX, ASPack, Petite, MPRESS, FSG, PECompact, Yoda's Crypter, NSPack, MEW, kkrunchyImplemented unpack routines, reachable through native unpack and the packer chain; fidelity varies by family and specimen
ASProtect, Morphine, nPack, NeoLite, PolyCryptor, Warzone CrypterStubEvalPending: emulator behavior has spec-built stub evidence; real vendor-packed recovery is unvalidated and no unpack dispatch is advertised
Yoda's Protector, VMProtect, Themida / WinLicenseCLI and auto detect-only. Separate Rust helpers expose original-assisted carving or protected-section recovery; they do not establish whole-program devirtualization
PE-Protector, PELock, Enigma Protector, Armadillo, Obsidium, WinLicenseDetect-only
DotNetPatcher, NetCryptorDelegate the managed layer to the .NET pass
OLLVM flattening, bogus control flow, instruction substitution; Tigress CFFSupported static deobfuscation transforms and reports through the native Rust APIs; applicable analysis appears in native recovery reports
Alcatraz, Emotet CFF, Mirai, Dridex, Trickbot, obfus.h, Cryptify (rust-obfuscator), guardian-rs, obfusheader.h, obfuscxx, AmiceNamed native obfuscation signatures; individual string/control-flow helpers have narrower recovery than the complete detected family

Native analysis also recovers Rust/C++ symbols, C++ RTTI and vtables, Delphi/C++Builder object models and DFM resources, DWARF/PDB/STABS information, imports, call graphs, crypto signatures, and FLIRT matches. Instruction analysis spans x86, ARM, RISC-V, MIPS, PowerPC, SPARC, eBPF, and AVR; source emission is the smaller architecture set listed above. Native analysis · Unpacking and byte-recovery evidence · Deobfuscation.

FamilySupport and prerequisite
Zelix KlassMaster, Allatori, Stringer, DashOString recovery for supported patterns, followed by classfile decompilation
DexGuardDetection, structural peeling, and in-class string-decrypt emulation for supported keyed constants
BlackObfuscatorDEX dispatcher recognition and block-order annotation
ProGuard / R8Mapping replay to a name-restoration sidecar; original names require mapping.txt
yGuard, SkidSuite2, JBCODetect-only
Promon SHIELD, Guardsquare DexGuard RASP, Guardsquare ThreatCast, Appdome, OneSpan, Arxan / Digital.ai, Zimperium zShield, Licel DexProtectorAndroid RASP identification and structural reports
ConfuserEx2Real-sample constant recovery and control-flow deflattening; encrypted resources can retain a runtime-key boundary
Eazfuscator.NETModel-graded string decryption and VM lifting; the VM fixture comes from an in-repository virtualizer, not the shipping product
KoiVM (ConfuserEx VM)Virtualized bodies lifted to CIL on committed real-tool output
ConfuserEx, Dotfuscator, Dotfuscator CE, SmartAssembly, Babel, DeepSea, Spices.Net, Goliath, Skater, .NET Reactor, CryptoObfuscator, ArmDot, Agile.NET, Obfuscar, DotNetPatcher, NetCryptor, BitMonoDetection and family-specific partial recovery: names, strings, resources, or method structures. BitMono is in the protector detector beyond the 22-entry .NET chain catalog
Themida (.NET wrapper), ILProtector, MaxToCodeDetect-only for native-loader-keyed bodies
React Native APK, React Native IPA; React Native Hermes bytecodeExtract JS/Hermes payloads and route supported bytecode into the Hermes lift
Flutter Dart kernel; Flutter AOT snapshot (libapp.so)Kernel source-table recovery; AOT declarations, metadata, and ARM64 disassembly. Snapshot version and available names constrain recovery
Xamarin / .NET MAUI APK, Apache Cordova APK, Capacitor APK, NativeScript APKRuntime identification and supported package/member extraction
Android APK (classes.dex), Android app bundle (AAB / APKM / XAPK), IPAPackage inspection and child extraction; downstream recovery depends on the embedded runtime

The .NET string decoders for SmartAssembly, Spices.Net, Skater, .NET Reactor, Eazfuscator.NET, and CryptoObfuscator are graded on modeled algorithms, not committed vendor-produced assemblies. ConfuserEx2, Obfuscar, and BitMono have real protected-assembly evidence. JVM/Android · .NET · Mobile.

FamilySupport and prerequisite
IronBrew2VM recovery, execution-differentially checked on real 2.7.0 standard and MAX output
PrometheusPartial recovery, including supported stacked Vmify dispatch trees
MoonSec V1, MoonSec V2, MoonSec V3, AztupBrew, DarkSec, Boronide, PSU, WeAreDevs LuaU, luaobfuscator.com, SLua (Unity Lua 5.3), HerculesPartial Lua recovery; MoonSec-shape VM evidence uses a synthetic bootstrap
LuraphDetect-only
Luau bytecode, Garry's Mod Lua (GLua)Dialect recognition; Luau lifting and partial GLua recovery
ionCube, SourceGuardian, Zend GuardCommercial PHP envelope detection; loader-resident keys remain a boundary. Legacy static-key cases can yield partial op_array structure
FOPO, Better PHP ObfuscatorStatic PHP eval-chain peeling, with literal-key requirements for encrypted layers
Invoke-Obfuscation (token), Invoke-Obfuscation (AST), Invoke-Obfuscation (string), Invoke-Obfuscation (encoding), Invoke-Obfuscation (compress); Invoke-Stealth, PowerHell, Chameleon, psobfStatic PowerShell recovery
Invoke-Obfuscation (launcher), ISESteroidsPartial PowerShell recovery
Bashfuscator (token), Bashfuscator (string), Bashfuscator (obfuscate), Bashfuscator (compress); Bash indirection (IFS/eval); node-bash-obfuscate (chunk-table eval)Static Bash recovery
Batch obfuscation (%random%), Batch obfuscation (set indirection); VBA macro (p-code decompile + stomping)Batch peeling and VBA source/p-code recovery
YARV InstructionSequence (compiled .rb), mruby RITE bytecodeRuby source recovery
OCRA self-extracting executable, RubyScript2Exe packagePartial freezer classification/recovery
JRuby compiled class, TruffleRuby native imageDetect-only through the Ruby catalog
BEAM file (Erlang / Elixir compiled module), EZ archive (ZIP-wrapped .beam modules)Module extraction, source/debug-chunk recovery, or Core Erlang fallback
garbleGo metadata and supported literals; original name hashing cannot be reversed without the missing seed
Mach-O Swift / Objective-C metadata, Mach-O fat (universal) binary, dyld shared cacheRuntime metadata, slice and dylib recovery
SwiftShieldMapping parser; the mapping must be supplied to recover original names
SWF (Flash, FWS/CWS/ZWS) DoABC, raw ABC bytecodeDisassembly and method-body pseudocode
secureSWF, DoSWF, Kindi, Irrfuscator, swfLockDetect-only

Family catalog · Lua · PHP · Shell · Ruby · BEAM · Go · Swift · AS3.

CategoryFormats
General archivesZIP, TAR, tar.gz, tar.bz2, tar.xz, tar.zst, 7z, RAR, CAB, CPIO, ar, ARJ, ARC, LZH, LZO/lzop, uzip, Xamarin xalz, PAR2, StuffIt
Application and language archivesJAR, WAR, APK, XPI, WHL, EGG, CRX, NUPKG, VSIX, PYZ, Electron ASAR
Installers and application imagesPKG, DMG, DEB, RPM, AppImage, Snap, Flatpak, MSIX/APPX, MSI, NSIS, Squirrel, Inno Setup, InstallShield, Enigma Virtual Box
Filesystems and filesystem streamsSquashFS, cramfs, ext4, romfs, MinixFS, Android sparse, btrfs-send, EROFS, JFFS2, NTFS, UBI/UBIFS, YAFFS2, QNX, partclone
Disk and deployment imagesISO, OCI, Docker image, VHD, VHDX, WIM, GPT, MBR, FAT12/16/32
Compression streamsXZ, gzip, bzip2, zstd, LZMA, lzip, LZ4, zlib, Unix compress (.Z)
Embedded application dataBun standalone, UnityFS, .NET single-file bundle
FirmwareD-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; UEFI firmware volume
Memory and encrypted volumesWindows minidump, LUKS1

The roster declares detection for every entry. Of those routes, 102 use the generic extractor; 42 have committed inputs that reach member bytes, DMG has detection-only committed evidence, and 59 have no committed input. LUKS1 is graded separately against plaintext and requires an aes-cbc-plain raw volume key for decryption; without one it reports the key boundary. Individual compression methods, encrypted members, split volumes, and filesystem features have narrower limits. StuffIt 5 currently returns the archive blob through extraction even though its fork decoders exist. Airoha OTP-AES content is carved verbatim.

Additional Rust readers expose Deno eszip, Apple APFS/HFS+, ELF appended overlays, and Blazor WebCIL structures; they are not extra entries in the 103-format count. Extraction routes, method versions, and limits · Container registry.

Input layerRegistered pass IDsAutomatic outputDedicated controls or prerequisite
Archives, installers, firmware, volumesbinfmt.containerExtracted children, followed recursively into language/native passesextract for member reports and the explicit LUKS1 raw-key option
PyInstallerpyinstaller.extractEmbedded members and .pyc childrenpyinstaller extract for archive-specific options
Python freezerspyfreeze.extract, nuitka.extractExtracted payloads or supported compiled-package structureExperimental pyfreeze; Nuitka flavor determines what survives
Protected Pythonpyarmor.unpack, sourcedefender.decryptAvailable plaintext/bytecode, metadata, or key-boundary reportsMatching runtime/key material; dedicated PyArmor mode and strictness options
Python source and bytecodepy.deob, py.decompile, py.disasmPeeled source, decompiled source, or instruction tracepy decompile --emit source,disasm,ast; a matching interpreter is needed for recompilation checks
Picklepickle.classifySymbolic analysis and classificationpickle for the individual inspection/reconstruction operations
JavaScriptjs.deobSupported deobfuscation, webpack/Vite module recovery, Node SEA/bytenode handlingjs unbundle exposes the broader bundler set; source maps and rename options are direct controls
WebAssemblywasm.deobRecovered or lifted WAT plus detection, summary, and recovery sidecarswasm decompile --target chooses Rust, TypeScript, C, WAT, or JSON
Electron / Tauriwebview.carveEmbedded frontend memberswebview also supports Wails; automatic Wails recovery uses go.classify
PHP / Pharphp.peelPeeled source, op_array output, archive children, residual/key reportsKeys and IVs must be statically available for encrypted layers
JVM / DEXjvm.classifyJava source, protector and recovery manifests, class/archive childrenjvm/apk for mapping, signatures, and optional external backends
.NETdotnet.classifyC# and analysis, recovered constants/resources/CIL, or Native AOT metadatadotnet for other source formats and installed rendering backends
Mobile packages / bytecodemobile.classifyRuntime/member extraction, Hermes lift, Dart kernel source or AOT reportshermes, flutter, mobile for format-specific controls
Lualua.deobRecovered Lua and dialect/fidelity sidecarslua for explicit family and output controls
Shell / Office / PDFshell.deobPeeled scripts, macro source/p-code, XLM and document reportsshell for document-specific operations
Rubyruby.classifyAnalysis plus recovered YARV/mruby source where availableruby for flavor-specific reports; JRuby/TruffleRuby classification is not Ruby source recovery
BEAM / EZbeam.classifyErlang/Elixir/Core Erlang, disassembly, archive childrenSurviving debug chunks determine source fidelity
SWF / ABCas3.classifyABC structure, instruction listings, AS3 pseudocodeNamed commercial obfuscators remain detect-only
Gogo.classifySymbols, types, garble analysis, and embedded filesystem membersgo for DWARF, BuildInfo, and other dedicated reports
Swift / Objective-Cswift-objc.classifyMetadata, universal slices, and shared-cache dylibsSibling sub-cache/symbol files may be needed; direct swift/macho controls
Native packersnative.packer-unpackAvailable unpacked image or embedded module, symbols, signatures, recovery reportsOnly implemented packer dispatches unpack; commercial VM tiers can stop at detection
Native imagesnative.image-classifyIdentity, symbols, signatures, findings, and a bounded x86-64/AArch64 pseudo-source reportnative decompile selects a full source-output command; ARM32/MIPS32 source paths are direct
Windows / OS/2 NEnative.ne-structureSegments, entries, imports, and resourcesStructural recovery rather than source decompilation
Perl / R / Tcl / Haxe / WSHscriptlang.classifyLanguage reports, recovered structures, and supported child artifactsPer-format library APIs expose finer operations
Nim / Zig / Crystal / Dnativelang.classifyLanguage fingerprints, symbols, and partial native structureClassification requires sufficient surviving language markers
TaskCommandsOutput or next step
Find indicators, secrets, and static findingsscan, frisk, strings, ioc, indicators, behaviorFindings and offsets
Inspect functions, flows, and behaviorquery, capabilities, taint, vulnmatchQueryable IR, ATT&CK/MBC mappings and source-to-sink reports
Keep annotations and structured artifactsannot, rename, envelope, verify, yaraArtifact envelopes and analyst state
Follow provenance and compare runschain, context, status, report, diff, guard, semdiffReports, hashes, and recovery differences
Collect public network dataprowlExplicit network collection, separate from offline recovery
SurfaceEntry pointGuide
RustShared core types and individual pass cratesLibrary APIs
PythonTyped bindings through import disrobePython bindings
HTTP, gRPC, and LSPdisrobe serveService
Model Context Protocoldisrobe-mcp or disrobe serve --mcpMCP integration
Editors and analysis toolsVS Code, IDA Pro, Ghidra, Binary NinjaEditor integrations
GitHub ActionsRepository action and SARIF outputGitHub Action
Local commit checksHook ID disrobepre-commit
BrowserClient-side Wasm workerPlayground
Project context for coding toolsdisrobe init --ideMetadata sidecar
Recovery taskNamed toolsDisrobe's pathHow to choose or combine them
Python bytecode to sourcepycdc, PyLingual, uncompyle6, decompyle3In-process CPython 1.0 to 3.15 decompiler, nested code-object recovery, source/disassembly/AST outputInspect recovered source, disassembly, and AST from the built-in Python decompiler
Frozen Python extractionpyinstxtractor-ng, pydecipherPyInstaller, Nuitka, and freezer extraction followed by bytecode recoveryauto can continue from the extracted member through a protector and into the Python decompiler
PyArmorPyarmor-Static-Unpack-1shotStatic wrapper/runtime recovery, mode reports, optional static BCC liftingSupply the matching runtime to recover wrapper data and inspect mode-specific results
Pickle inspectionfickling, Python pickletoolsInstruction trace, symbolic reducers, classification, and value reconstructionInspect without executing reducers; pickletools grades inspection, and CPython checks reconstruction on 470 generated fixtures
JavaScript deobfuscationwebcrack, synchrony, REstringerobfuscator.io, JS-Confuser, supported Jscrambler patterns, esoteric decoders, constant/control-flow recoveryUse js deob for explicit options or auto when JS is inside a package
JS unbundling and source mapswakaru, webcrack, sourcemapperModule extraction, source-map handling, scope-aware renaming, packaged V8 inspectionjs unbundle exposes more bundler routes than automatic chain dispatch
WebAssemblyWABT wasm-decompile, BinaryenWAT and C/Rust/TypeScript pseudo-source, JSON summaries, supported obfuscation reversalInspect a selected source target; wasmtime execution checks below grade recovered behavior independently
JVM sourceCFR, Vineflower, Procyon, FernflowerNative classfile recovery plus protector/string handlingjvm decompile writes Disrobe artifacts alongside output from an installed backend; CFR has a measured compile-yield result below
Android packages and DEXJADX, apktool, androguard, dex2jarIn-process Dalvik recovery, APK metadata/signatures, runtime extraction, Java outputDEX/APK decompilation defaults to the native path; an Android backend is selected explicitly. JADX has a measured leg below
.NET assembliesILSpy, dnSpy, dnSpyEx, de4dotCIL recovery plus protector-specific constants, resources, VM bodies, and Native AOT metadatadotnet decompile writes Disrobe CIL output alongside an installed renderer; --backend auto selects ILSpy, dnSpyEx, dnSpy, or de4dot
Native decompilationGhidra, IDA, Binary NinjaIn-process x86-64 C/Rust and AArch64/ARM32/MIPS32 pseudo-C; recovered symbol/type reportsSelect Ghidra headlessly with --backend ghidra, or use editor integrations and exported symbols in an interactive analysis session
Packed native executablesupx -d, unipacker, Detect It EasyImplemented unpackers and bounded stub emulation, rebuilt PE images, embedded loader modulesExport recovered PE images into Ghidra/IDA. The Ghidra measurements below compare the packed and rebuilt inputs
Native obfuscationGhidra, IDA, Binary Ninja and deobfuscation scriptsOLLVM/Tigress transforms, MBA simplification, stack strings, native metadata and recovery reportsSelect the relevant native operation/API; a VM-protector fingerprint alone does not imply body recovery
Go metadata and garbleGoReSym, redress, gorepclntab, module/type metadata, embedded files, and recoverable garble literalsgo reports names/types; native decompile handles the machine-code source path separately
Swift / Objective-Cswift-demangle, class-dump, jtool2Runtime class/protocol/selector data, symbol rendering, fat slices, shared-cache dylibsSupply surviving mappings and sub-cache files; original names erased by renaming need an external map
Lua bytecode and VMsunluac, luadec, LuaDec51Lua/LuaJIT/Luau source plus supported obfuscator and custom-VM recoveryIronBrew2 has real-tool execution-differential evidence; ordinary .luac recovery and VM recovery are different operations
Ruby bytecodeMRI disassemblyYARV and mruby source, opcode listings, freezer/AOT classificationMRI recompilation grades opcode-name recall; that measure does not establish execution equivalence
PHP layersphp-malware-finderEval-chain and literal-key loop/cipher peeling, Phar extraction, encoder-envelope reportsUse static layers and available key material; native-loader-keyed commercial payloads stay sealed
PowerShell, Bash, VBAPowerDecode, FLARE tools, olevbaShell deobfuscation, VBA source/p-code and stomping, XLM formulas, PDF actionsshell places script recovery and document findings beside the rest of the artifact analysis
BEAM / ActionScriptErlang beam_disasm, RABCDAsmBEAM debug-source/Core Erlang recovery and ABC method-body pseudocodePreserve debug chunks when available; stripped BEAM has a separate real-Erlang execution check
Hermes / React Nativehermes-dec, hbctool, DroidSawRuntime extraction, HBC structure, supported pseudo-JavaScript liftHBC parsing covers v60 to v96; source lifting has a narrower measured boundary. Hermes-to-DEX bridge taint is not implemented
Flutter / Dart AOTreFlutter, Darter, blutterKernel source tables, AOT declaration graph, ARM64 bodies, strings, rename-map parsingKernel source and AOT metadata are different recovery levels; snapshot versions constrain AOT parsing
Containers and firmwarebinwalk, unblob, 7-ZipRegistered format extraction, recursive child routing, firmware decoding/carving, per-member refusal reportsFeed extracted members straight into language passes; compare member bytes rather than treating a recognized magic as successful extraction
Secrets and indicatorsAPKLeaks, TruffleHog, Gitleaks, LinkFinderRecovered-tree/APK findings, token offsets, static strings, secret and IOC reportsScan the APK or recovered tree; compare APKLeaks against the same planted secrets below
Format, packer, compiler identificationDetect It Easy, TrID, PEiD, binwalkMulti-signal identification, symbols, signatures, and routing hintsUse identify/detect to select a recovery path, then inspect its actual output
Capabilities and taintcapa, Ghidra scripts, JoernATT&CK/MBC findings with offsets, normalized-IR queries, source-to-sink flow reportsRun capability matching and source-to-sink analysis on recovered artifacts; the taint report includes its Juliet test population
Tool and inputDisrobe resultNamed tool resultWhat the measurement checks
JADX 1.5.5 · Android DEX157 / 228 emitted regions compile clean281 / 303 emitted regions compile cleanCommitted EdgeCases DEX; real javac, complete-source compilation then bounded isolation of regions blocking attribution; different emitted populations
CFR 0.152 · JVM classfile181 / 181 emitted regions compile clean152 / 166 emitted regions compile cleanCommitted EdgeCases JAR; the same compiler/scorer procedure; different emitted populations
APKLeaks 2.6.3 · planted-secrets APK8 / 8 planted secrets5 / 8 planted secretsExact-token recall on the same APK; Disrobe also finds the planted AWS secret access key, Basic credential, and JWT
Packed inputGhidra functions, packed → rebuiltInstructions, packed → rebuiltStrings, packed → rebuiltCompleted C renderings, packed → rebuilt
UPX · Rust hello4 → 287225 → 19,06023 → 1794 → 287
ASPack · Clockres5 → 24358 → 10,54448 → 1165 → 210
ASPack · AccessEnum5 → 10173 → 5,78162 → 1955 → 101
PECompact · Clockres2 → 306148 → 14,60327 → 271 → 267
PECompact · AccessEnum2 → 186155 → 9,27852 → 532 → 186
MEW · Clockres4 → 333125 → 20,9903 → 358Not measured
MEW · AccessEnum4 → 152125 → 9,5923 → 802Not measured
MEW · Autologon4 → 295125 → 19,5953 → 406Not measured
kkrunchy classic · NASM hello4 → 1149 → 103 → 44 → 1
InputDisrobe emitted regionsNamed tool emitted regionsPopulation boundaryReproduce
Android DEX157 / 228 emitted regions compile cleanJADX 1.5.5: 281 / 303 emitted regions compile cleanno cross-tool ranking: each tool has its own emitted-region populationcargo run --locked -p disrobe-bench-head-to-head -- --check --only apk-jadx-cfr
JVM classfile181 / 181 emitted regions compile cleanCFR 0.152: 152 / 166 emitted regions compile cleanno cross-tool ranking: each tool has its own emitted-region populationcargo run --locked -p disrobe-bench-head-to-head -- --check --only apk-jadx-cfr
RecoveryRecorded resultReference and limit
Python 3.14.5, pinned modules6077 of 6286 code objectsCPython recompilation with normalized opcode-structure comparison; jump targets, most operands, and additional recovered objects are not graded. Result
Python 3.14.5, fixed core population17396 of 18276 code objects, local measurementThe same normalized comparison across 574 modules; this is not a semantic-equivalence result. Result
Legacy Python 1.0 to 3.7at least 150 of 191 fixtures (regression floor)Period-interpreter recompilation or structural tokens against original source. Result
Pickle classification102 / 102 classification fixturespickletools semantics. Result
Pickle reconstruction470 / 470 reconstructed fixtures pass re-execution equality checksCPython re-execution. Result
JVM source compilation131 of 131 methods compileReal javac. Result
JVM behavior117 / 131 methods match observed executionReal JVM; eight methods diverge and six are not driven in isolation. Result
Android DEX118 / 118 verifier-presented classesJVM -Xverify:all; 37 of 155 classes are link-skipped and ungraded. Result
.NET C#18 / 35 complete EdgeCases types recompile standaloneReal Roslyn csc; legal source does not establish equivalent behavior. Result
.NET VM bodiesEazfuscator model: 67 / 67 instructions; real KoiVM: 6 / 6 bodies liftedSeparate original/clean-build references; EazVM uses an in-repository virtualizer, KoiVM uses real-tool output. Evidence
WebAssembly57 / 57 eligible functionswasmtime compares returns, traps, and the first 4,096 bytes of linear memory on the test inputs. Result
BEAM without debug chunks19 / 19 modulesErlang/OTP 27.3.4 recompilation, export comparison, and test/0 output/exit status. Result
Lua IronBrew2Real 2.7.0 standard and MAX output recovers to matching executionReal Lua interpreter against original programs; one VM family. Result
Ruby YARVGreeter 100%; megafile 98.67% opcode-name recallMRI recompilation; multiset recall ignores order, operands, branch targets, and extra instructions. Result
Go stripped type names838 of 838 namesReal go1.26.3 metadata from the comparison build. Result
Hermes HBC v968 of 8 functions, zero fallback operationsReal hermesc sample with original source and function names. Result
Native packed bytesUPX, FSG, NSPack, Petite, MPRESS .text byte-identical on named committed pairs; Yoda's Crypter resources byte-identicalRVA-aligned original bytes; whole-image and resource residuals remain separately reported. Per-input table
Planted indicators6 / 6 IOC categories representedCommitted endpoints, manifest findings, URLs, IPv4, email, and .onion ground truth. Result
MCP call graph5 / 5 direct edges, all correctly identifiedStripped ELF compared with its distinct unstripped toolchain twin. Precision, recall
Native taint93 / 190 labeled flows recalled; zero false positives, local measurementNIST Juliet CWE-78 char/system slice, gcc 16.2.0 -O2; seven declared flow categories have no cases in this slice. Result
SurfaceCountWhat it establishes
PyArmor72 / 72 named v8/v9 default-trial wrappersStatic decryption and complete root CodeObject parsing, without an external correctness comparison
Android, three real APKs83662 / 83943 methods lowered, localSelf-reported body coverage. The separate verifier population is 2988 of 2998 bodies presented in isolated carriers
Wasm instruction inventory1034 of 1034 instructionsExternal wasm-tools denominator and re-assemblable WAT; the lowering numerator is self-counted
Luau instruction table86 of 88 entries liftedDisrobe's declared table; BREAK and NEWCLASSMEMBER remain decoded but unresolved
Swift symbolsCommitted symbol population renders to pinned stringsRegression consistency, with no required external demangler comparison
OLLVM flattening9 reached states out of 9 derived statesDispatcher-state coverage over two committed functions; both counts are derived in-process
Mixed boolean arithmetic316 entries; reference run answered 247 and refused 69; external solver proved 236 answers and refuted noneBudgeted recovery and held-out originals; unanswered or unproven entries do not become solver-proved results
Containers42 generic routes write member bytesExercised breadth within the 103 detected formats; LUKS1 has its own plaintext comparison

Complete evidence records describe each population and grading rule.