
Rust CLI 제품군으로, 하나의 자동 파이프라인을 통해 15개 이상의 생태계에 걸쳐 네이티브 코드, 바이트코드, 스크립트, 펌웨어 및 앱 패키지를 정적으로 디컴파일, 난독화 해제 및 언팩합니다.
시작하기 · 지원 입력 · 자동 복구 · 도구 비교 · 증거 · 문서
Disrobe는 소프트웨어를 디컴파일, 디오브푸스케이트, 언패킹하기 위한 Rust 명령줄 도구 모음입니다. 알 수 없는 파일을 분류하거나, 리버스 엔지니어링을 위한 코드를 복구하거나, 조사를 위한 지표를 추출하거나, 디스어셈블러용 아티팩트를 준비하는 데 사용할 수 있습니다.
바이트코드와 동결된 애플리케이션에서 Python을, 클래스 파일과 DEX에서 Java를, CIL에서 C#을, 번들에서 JavaScript를, 커스텀 가상 머신에서 Lua를, 네이티브 코드에서 C 또는 Rust를 복구합니다. 설치 프로그램, 펌웨어, 모바일 패키지, Electron, Tauri, Wails 애플리케이션에서 파일을 추출합니다. 복구된 소스, 심볼, 문자열, 타입, 출처를 함께 보관하여 추가 분석에 활용할 수 있습니다.
전체 빌드는 170개 패밀리를 15개 생태계에 걸쳐 분류하고 103개 컨테이너 형식을 탐지합니다. disrobe auto는 각 계층을 식별하고, 일치하는 패스를 실행하며, 복구된 자식들을 각자의 복구 경로로 따라갑니다. 전용 명령은 더 세밀한 제어, 분석 보고서, 선택적 백엔드를 제공합니다. 복구는 기본적으로 정적으로 실행되며, 소스, 구조, 부분 출력, 누락된 키 경계는 결과에서 구분 가능한 상태로 유지됩니다.
Disrobe가 유용하다면 저장소에 스타를 눌러주세요.
2분 12초 동안 20개의 CLI 명령: 네이티브 실행 파일 언패킹, Python과 Lua 복구, JavaScript 모듈 분할, 소스 맵 복원, WebAssembly와 Android 리소스 검사, 지표 추출, 보고서와 아티팩트 해시 보존. 마지막 장에서는 프로젝트 구성, IDE 설정, 분석가 주석, 셸 완성을 보여줍니다. 스크립트에는 녹화된 빌드의 전체 명령 목록이 포함되어 있으며, 기능 맵에서 지원 한계를 설명합니다.
GitHub Releases에서 플랫폼에 맞는 아카이브를 다운로드하고, 릴리스의 SHA256SUMS와 대조한 뒤, disrobe를 PATH에 추가하세요. 릴리스 아카이브에는 서명 번들이 포함되어 있으며, 검증 가이드에서 이를 검사하는 방법을 설명합니다.
| 플랫폼 | 릴리스 대상 |
|---|---|
| Windows | x86-64, ARM64 |
| macOS | x86-64, ARM64 |
| Linux | glibc 기반 x86-64 및 ARM64; musl 기반 x86-64 |
설치한 바이너리를 확인하세요:```sh disrobe --version disrobe --help
CLI를 클론에서 빌드하려면, 저장소의 Rust 툴체인과 [네이티브 빌드 사전 요구 사항](https://github.com/1-3-7/disrobe/blob/main/docs/src/installation.md)을 설치한 후 다음을 실행하세요:```sh
cargo build --locked --release -p disrobe-cli --bin disrobe
실행 파일은 target/release/disrobe이며, Windows에서는 target/release/disrobe.exe입니다. 기능 플래그와 슬림 빌드에 대해서는 설치 가이드를 참조하세요.
애플리케이션, 라이브러리 또는 패키지로 시작하세요. 이를 식별하고, 인식된 레이어를 복구한 다음, 복구 요약을 검사합니다:```sh disrobe identify path/to/application disrobe auto path/to/application --out recovered/ --capture-stages disrobe context --out recovered/
`identify`는 형식과 사용 가능한 신호를 보고합니다. `auto`는 인식된 레이어를 추출하고 복구합니다. `context`는 결과 패스, 신뢰도, 출처를 요약합니다. `--capture-stages`를 사용하면 `recovered/01-*/`, `recovered/02-*/`, `recovered/final/` 아래의 각 단계를 검사할 수 있습니다. `chain.json`은 토폴로지와 해시를 기록하고, `recovery.json`은 결과와 타이밍을 기록합니다.
필요한 출력을 알고 있을 때는 전용 명령을 사용하세요:```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/
네이티브 디컴파일러는 x86-64에서 기본적으로 C를 출력하며, --format rust를 지정하면 Rust를 선택합니다. AArch64, ARM32, MIPS32는 의사 C(pseudo-C)를 출력합니다. native export는 외부 분석 도구를 위해 지원되는 패킹된 PE 이미지를 재구성하며, webview는 애플리케이션을 시작하지 않고 복구된 프런트엔드 자산 트리를 기록합니다.
저장소에는 브라우저 플레이그라운드용 아주 작은 WebAssembly 모듈이 포함되어 있습니다. 전체 CLI가 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
첫 번째 명령은 `add.summary.json`을 작성하고, 두 번째 명령은 WebAssembly 텍스트를 `add.lifted.wat`에 작성합니다. 자동 복구는
사용 가능한 체인을 선택하고 그 아티팩트를 `recovered/` 아래에 작성합니다. `--capture-stages`는
중간 결과를 보존합니다. 이러한 작업은 내보낸 함수를 실행하지 않고 모듈을 검사합니다.
보고서와 함께 복구된 파일을 검사하십시오. 식별만으로는 복구가 성립하지 않습니다. 지원되지 않는 구성, 부재한 키 자료, 사용할 수 없는 체인은 결과에 나타납니다. [결과 가이드](https://github.com/1-3-7/disrobe/blob/main/docs/src/reading-a-result.md)는 아티팩트, 진단, 부분 결과, 출처를 설명합니다.
[브라우저 플레이그라운드 열기](https://1-3-7.github.io/disrobe/playground/) · [퀵스타트 따라하기](https://github.com/1-3-7/disrobe/blob/main/docs/src/quickstart.md)
## 입력 찾기
**복구(Recover)** 는 도달 가능한 경로가 소스, 바이트, 또는 구조를 산출함을 의미합니다. **부분(Partial)** 은 그 정보의 일부만 복구함을 의미합니다. **탐지만(Detect-only)** 은 보호된 본문을 복구하지 않고 패밀리를 식별함을 의미합니다. 이 수준들은 지원되는 입력에 대한 작업을 설명하며, 패밀리 이름만으로 모든 버전이나 구성이 복구된다는 보장은 아닙니다. 아래 목록은 전체 패밀리 카탈로그와 전용 명령 및 추출기가 노출하는 추가 형식을 포함합니다.
| 입력 | 복구 및 출력 | 명령 및 가이드 |
|---|---|---|
| Python | CPython 1.0~3.15 바이트코드 및 marshal을 소스로; PyPy, MicroPython `.mpy` v0~v6, Jython, IronPython, Brython 디스어셈블리; frozen 페이로드 추출; 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 | 소스 난독화 해제, 축소화 역전, 모듈 분할, 소스 맵, V8 캐시 데이터 및 패키징된 런타임 검사 | `js` · [JavaScript](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/javascript.md) |
| WebAssembly | `.wasm`을 WAT, Rust, TypeScript, C 의사 소스, 또는 JSON으로; Component Model 및 GC 타입 그래프 검사; 지원되는 난독화 역전 | `wasm` · [WebAssembly](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/wasm.md) |
| JVM / Android | `.class`, JAR, DEX, APK, AAB; Java 소스, Kotlin/Scala 관용구, 매니페스트 및 서명 정보, 프로텍터 보고서 및 매핑 사이드카 | `jvm`, `apk` · [JVM and Android](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/jvm-android.md) |
| .NET | PE/CLR 메타데이터 및 CIL을 C#, F#, 또는 VB 의사 소스로; ReadyToRun 및 Native AOT 검사; 단일 파일 번들 추출 | `dotnet` · [.NET](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/dotnet.md) |
| Native | PE32/PE64, EFI PE, ELF32/ELF64, 커널 모듈, thin/fat Mach-O, COFF, MZ, NE, LE, LX, 및 원시 코드 식별 또는 분석; 위의 아키텍처별 경로에서 소스 산출 | `native`, `macho`, `semdiff` · [Native](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/native.md), [decompile](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/native-decompile.md) |
| Go | PE/ELF/Mach-O 런타임 메타데이터, 스트립된 함수 및 타입 이름, `embed.FS` 파일, garble 보고서 및 복구 가능한 리터럴 | `go` · [Go](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/go.md) |
| Swift / Objective-C | Mach-O 클래스, 프로토콜, 필드, 셀렉터, 디맹글된 심볼; 유니버설 슬라이스; dyld 공유 캐시 dylib | `swift`, `macho` · [Swift](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/swift.md) |
| Lua | Lua 5.1~5.4, LuaJIT 2.0/2.1, Luau 바이트코드, Garry's Mod Lua (GLua); 소스 및 입력별 충실도 보고서; 지원되는 VM 및 문자열 복구 | `lua` · [Lua](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/lua.md) |
| PHP | 소스/eval 체인 필링, 리터럴 키 디코드 루프 및 AES 계층, Phar 추출, 직렬화된 `op_array` 복구; 상용 인코더 봉투는 키 제한이 남음 | `php` · [PHP](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/php.md) |
| Ruby | MRI/YARV 2.6~3.4 InstructionSequence 바이너리 및 mruby RITE 바이트코드를 Ruby로; freezer 및 AOT 분류 | `ruby` · [Ruby](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/ruby.md) |
| Erlang / Elixir | BEAM 모듈 및 EZ 아카이브; 살아남은 추상 코드 또는 `Dbgi`를 소스로, Core Erlang 폴백, 명령어 목록 | `beam` · [BEAM](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/beam.md) |
| ActionScript 3 | SWF FWS/CWS/ZWS `DoABC` 블록 및 원시 ABC 바이트코드를 디스어셈블리 및 AS3 의사코드로 | `as3` · [ActionScript](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/as3.md) |
| 모바일 런타임 | Hermes v60~v96 헤더 파싱, v62/v71/v74/v76/v83/v84/v89/v96 의사 JavaScript 리프트; Flutter Dart 커널 소스 본문; ARM64 AOT 선언, 문자열, 및 디스어셈블리 | `hermes`, `flutter`, `mobile` · [Mobile](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/mobile.md) |
| Shell / 문서 | PowerShell, Bash, Batch, VBScript, WSH; VBA3/5/6/7 p-code 및 스톰핑; Office 매크로 소스, BIFF8/BIFF12 XLM 수식, PDF 내장 스크립트/액션 | `shell` · [Shell and documents](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/shell.md) |
| 기타 언어 아티팩트 | Perl op-tree/바이트코드, R RDS 및 Rcpp 메타데이터, Tcl starkit, Haxe JS/SWF/HashLink/Neko 출력; Nim, Zig, Crystal, 및 D 지문, 심볼, 및 부분 구조 | `auto`, 라이브러리 API · [Script languages](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/shell.md), [native](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/native.md) |
| Python pickle | pickle 리듀서를 호출하지 않고 프로토콜 디스어셈블리, 기호 추적, 재구성, 및 분류 | `pickle` · [Pickle](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/pickle.md) |
| 아카이브 / 펌웨어 / 프런트엔드 | 아래의 전체 컨테이너 목록; Electron ASAR, Tauri v1/v2 내장 맵, Wails v2 `embed.FS` 트리 | `extract`, `webview`, `auto` · [Containers](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: 모든 명명된 freezer, protector, 및 소스 난독화기</strong></summary>
| 패밀리 또는 형식 | 지원 및 전제 조건 |
|---|---|
| PyInstaller 2.x~6.20+ | 지원되는 AES-CTR/CFB 계층을 포함한 내장 아카이브 및 바이트코드 복구 |
| Nuitka onefile, standalone, module, wheel | onefile 페이로드 추출; 컴파일된 형태에서 심볼 및 Python에 보이는 구조 복구 |
| cx_Freeze, py2exe, shiv, pex, Briefcase | `pyfreeze`를 통한 패키저 추출; 명령은 실험적임 |
| PyOxidizer | 실험적, 검증되지 않은 추출 |
| SourceDefender `.pye` | `py sourcedefender` 및 `sourcedefender.decrypt`를 통한 정적 복호화 |
| PyArmor v3 (레거시 DES), PyArmor v4 (레거시 혼합), PyArmor v5 (레거시 AES) | 탐지만: RSA로 감싼 키 경계 |
| PyArmor v6, PyArmor v7 | 부분 정적 복구; super 모드 및 사용할 수 없는 키가 출력을 제한함 |
| PyArmor v8, PyArmor v9 / 9-Pro | 키 자료를 사용할 수 있는 경우 정적 래퍼 복구. 공개된 <!-- m:pyarmor_frac -->72 / 72<!-- /m --> 결과는 명명된 v8/v9 기본 체험판 래퍼에 대해서만 완전한 루트 `CodeObject` 디코딩을 집계하며, 소스 동등성을 확립하거나 등록 라이선스/pro, BCC, 또는 super 모드를 포괄하지 않음 |
| Kramer / Specter, Berserker, BlankOBF, PlusOBF, Wodx, pyobfuscate.com, pyobfuscate.com (2026 XOR/lambda), PyObfuscator (mauricelambert), Manglify, Oxyry, pyminifier, 온라인 난독화기 패밀리, Xindex, Patchwork, pyc-zipper | AST 평가기를 통한 정적 소스/로더 복구; 개별 계층 및 잔여물이 보고됨 |
| Jawbreaker, ObfuXtreme | 아티팩트에 존재하는 본문 복구; 런타임에 가져오는 페이로드는 부재로 남음 |
| python-obfuscator (PyPI), pyobfus, Pypacker | 부분 래퍼 필링 및 분류 |
PyArmor는 래퍼 옆에 일치하는 런타임 파일이 필요할 수 있습니다. 전용 BCC 경로는 `--allow-bcc`를 요구하며 모델링된 본문에 대해 정적 네이티브 리프트와 Python 스켈레톤을 산출합니다. 경로 인식 자동 복구는 동일한 BCC 아티팩트를 게시할 수 있습니다. PyArmor v6/v7 동적 훅만이 샘플 코드를 실행하며, `--allow-dynamic` 뒤에서 워치독과 함께 실행됩니다. `--allow-bcc`는 트리 내 정적 분석만 허용하며 샘플을 실행하거나 외부 도구를 호출하지 않습니다. [버전 및 모드 세부 정보](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/python.md#pyarmor).
</details>
<details>
<summary><strong>JavaScript, WebAssembly, 및 패키징된 웹 애플리케이션</strong></summary>
| 패밀리 또는 형식 | 지원 및 경로 |
|---|---|
| obfuscator.io / javascript-obfuscator, JS-Confuser | 지원되는 문자열 배열, 디스패처/제어 흐름 변환, 불투명 술어, 및 로더 계층 복구; 직접 명령 및 `js.deob` |
| Jscrambler, js-obfuscator (jsobfu) | 부분 템플릿 및 정적 변환 복구 |
| JSFuck, aaencode, jjencode, JSFiretruck, Dean Edwards Packer | 전용 작업 및 인식된 체인 경로를 통한 정적 디코딩 |
| JSDefender, Arxan / Digital.ai | 탐지 및 부분 정적 변환 필링; 보호된 상용 JS 작업은 명령의 권한 부여 옵션이 필요함 |
| PACE | 탐지만 |
| webpack 4, webpack 5, Vite, Rollup, Rolldown, esbuild, Turbopack, Bun, Parcel, Browserify, SystemJS; AMD 모듈 | 직접 언번들링/모듈 복구. 체인은 webpack 및 Vite를 디스패치함; 다른 번들러의 카탈로그 마커만으로는 해당 경로가 자동이 되지 않음 |
| bytenode `.jsc`, Node SEA, nexe, nw.js | 패키징된 V8 데이터 검사/카빙; Node SEA 및 bytenode는 명시적 체인 분기를 가짐 |
| Electron ASAR, Tauri v1/v2, Wails v2 | 내장 프런트엔드 트리 복구; Electron/Tauri는 `webview.carve`를, Wails는 `go.classify`를 사용; 직접 `webview`가 세 가지 모두를 처리 |
| Bun standalone, Deno eszip v2~v2.3 / `deno compile` | 각 컨테이너 리더를 통한 내장 모듈 그래프 복구; eszip은 직접 Rust 리더도 노출 |
| Wobfuscator, Jscrambler WASM, wasm-mixer / Wasmixer | `wasm.deob`를 통한 지원되는 변환의 부분 역전; 도구 형태의 픽스처가 변환을 등급화하며, 해당 난독화기 자체의 커밋된 출력은 없음 |
| Tigress → Emscripten, wasm-name-obfuscator | 탐지 및 분류; Tigress 헬퍼는 `wasm deob` 실행 경로 밖에 있으며, 파괴된 원본 이름은 사용할 수 없는 상태로 남음 |
[JavaScript 경로](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/javascript.md) · [Wasm 한계](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/wasm.md) · [내장 프런트엔드 레이아웃](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/webview.md).
</details>
<details>
<summary><strong>네이티브 패커, 프로텍터, 및 난독화 패밀리</strong></summary>
| 패밀리 | 지원 및 경로 |
|---|---|
| Donut, sRDI | 지원되는 셸코드 로더 레이아웃에서 내장 모듈 복구 |
| UPX, ASPack, Petite, MPRESS, FSG, PECompact, Yoda's Crypter, NSPack, MEW, kkrunchy | 구현된 언팩 루틴, `native unpack` 및 패커 체인을 통해 도달 가능; 충실도는 패밀리 및 표본에 따라 다름 |
| ASProtect, Morphine, nPack, NeoLite, PolyCryptor, Warzone Crypter | `StubEvalPending`: 에뮬레이터 동작에 스펙으로 구축된 스텁 증거가 있음; 실제 벤더 패킹 복구는 검증되지 않았으며 언팩 디스패치가 광고되지 않음 |
| Yoda's Protector, VMProtect, Themida / WinLicense | CLI 및 auto 탐지만. 별도의 Rust 헬퍼가 원본 보조 카빙 또는 보호 섹션 복구를 노출; 전체 프로그램 디버추얼라이제이션을 확립하지는 않음 |
| PE-Protector, PELock, Enigma Protector, Armadillo, Obsidium, WinLicense | 탐지만 |
| DotNetPatcher, NetCryptor | 관리 계층을 .NET 패스로 위임 |
| OLLVM 플래트닝, 가짜 제어 흐름, 명령어 치환; Tigress CFF | 네이티브 Rust API를 통한 지원되는 정적 난독화 해제 변환 및 보고서; 적용 가능한 분석은 네이티브 복구 보고서에 나타남 |
| Alcatraz, Emotet CFF, Mirai, Dridex, Trickbot, obfus.h, Cryptify (rust-obfuscator), guardian-rs, obfusheader.h, obfuscxx, Amice | 명명된 네이티브 난독화 시그니처; 개별 문자열/제어 흐름 헬퍼는 탐지된 전체 패밀리보다 좁은 복구 범위를 가짐 |
네이티브 분석은 또한 Rust/C++ 심볼, C++ RTTI 및 vtable, Delphi/C++Builder 객체 모델 및 DFM 리소스, DWARF/PDB/STABS 정보, 임포트, 호출 그래프, 암호화 시그니처, 및 FLIRT 매치를 복구합니다. 명령어 분석은 x86, ARM, RISC-V, MIPS, PowerPC, SPARC, eBPF, 및 AVR에 걸쳐 있으며, 소스 산출은 위에 나열된 더 작은 아키텍처 집합입니다. [네이티브 분석](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/native.md) · [언패킹 및 바이트 복구 증거](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/native-unpack.md) · [난독화 해제](https://github.com/1-3-7/disrobe/blob/main/docs/src/anti-analysis.md).
</details>
<details>
<summary><strong>JVM, Android, .NET, 및 모바일 패키지 패밀리</strong></summary>
| 패밀리 | 지원 및 전제 조건 |
|---|---|
| Zelix KlassMaster, Allatori, Stringer, DashO | 지원되는 패턴에 대한 문자열 복구, 이어서 클래스파일 디컴파일 |
| DexGuard | 탐지, 구조적 필링, 및 지원되는 키 지정 상수에 대한 클래스 내 문자열 복호화 에뮬레이션 |
| BlackObfuscator | DEX 디스패처 인식 및 블록 순서 주석 |
| ProGuard / R8 | 이름 복원 사이드카로의 매핑 재생; 원본 이름은 `mapping.txt`가 필요함 |
| yGuard, SkidSuite2, JBCO | 탐지만 |
| Promon SHIELD, Guardsquare DexGuard RASP, Guardsquare ThreatCast, Appdome, OneSpan, Arxan / Digital.ai, Zimperium zShield, Licel DexProtector | Android RASP 식별 및 구조적 보고서 |
| ConfuserEx2 | 실제 샘플 상수 복구 및 제어 흐름 평탄화 해제; 암호화된 리소스는 런타임 키 경계를 유지할 수 있음 |
| Eazfuscator.NET | 모델 등급화된 문자열 복호화 및 VM 리프팅; VM 픽스처는 저장소 내 가상화기에서 나온 것이며 출시 제품이 아님 |
| KoiVM (ConfuserEx VM) | 커밋된 실제 도구 출력에서 가상화된 본문을 CIL로 리프트 |
| ConfuserEx, Dotfuscator, Dotfuscator CE, SmartAssembly, Babel, DeepSea, Spices.Net, Goliath, Skater, .NET Reactor, CryptoObfuscator, ArmDot, Agile.NET, Obfuscar, DotNetPatcher, NetCryptor, BitMono | 탐지 및 패밀리별 부분 복구: 이름, 문자열, 리소스, 또는 메서드 구조. BitMono는 22개 항목 .NET 체인 카탈로그를 넘어 프로텍터 탐지기에 있음 |
| Themida (.NET 래퍼), ILProtector, MaxToCode | 네이티브 로더 키 지정 본문에 대한 탐지만 |
| React Native APK, React Native IPA; React Native Hermes 바이트코드 | JS/Hermes 페이로드 추출 및 지원되는 바이트코드를 Hermes 리프트로 라우팅 |
| Flutter Dart 커널; Flutter AOT 스냅샷 (`libapp.so`) | 커널 소스 테이블 복구; AOT 선언, 메타데이터, 및 ARM64 디스어셈블리. 스냅샷 버전 및 사용 가능한 이름이 복구를 제한함 |
| Xamarin / .NET MAUI APK, Apache Cordova APK, Capacitor APK, NativeScript APK | 런타임 식별 및 지원되는 패키지/멤버 추출 |
| Android APK (`classes.dex`), Android 앱 번들 (AAB / APKM / XAPK), IPA | 패키지 검사 및 자식 추출; 하위 복구는 내장 런타임에 따라 다름 |
SmartAssembly, Spices.Net, Skater, .NET Reactor, Eazfuscator.NET, 및 CryptoObfuscator용 .NET 문자열 디코더는 커밋된 벤더 제작 어셈블리가 아닌 모델링된 알고리즘으로 등급화됩니다. ConfuserEx2, Obfuscar, 및 BitMono는 실제 보호된 어셈블리 증거를 가집니다. [JVM/Android](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/jvm-android.md) · [.NET](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/dotnet.md) · [Mobile](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/mobile.md).
</details>
<details>
<summary><strong>Lua, PHP, shell, Ruby, BEAM, Swift, Go, 및 ActionScript 패밀리</strong></summary>
| 패밀리 | 지원 및 전제 조건 |
|---|---|
| IronBrew2 | VM 복구, 실제 2.7.0 standard 및 MAX 출력에서 실행 차분 검사됨 |
| Prometheus | 부분 복구, 지원되는 스택형 `Vmify` 디스패치 트리 포함 |
| MoonSec V1, MoonSec V2, MoonSec V3, AztupBrew, DarkSec, Boronide, PSU, WeAreDevs LuaU, luaobfuscator.com, SLua (Unity Lua 5.3), Hercules | 부분 Lua 복구; MoonSec 형태의 VM 증거는 합성 부트스트랩을 사용함 |
| Luraph | 탐지만 |
| Luau 바이트코드, Garry's Mod Lua (GLua) | 방언 인식; Luau 리프팅 및 부분 GLua 복구 |
| ionCube, SourceGuardian, Zend Guard | 상용 PHP 봉투 탐지; 로더 상주 키는 경계로 남음. 레거시 정적 키 사례는 부분 `op_array` 구조를 산출할 수 있음 |
| FOPO, Better PHP Obfuscator | 정적 PHP eval 체인 필링, 암호화 계층에 대한 리터럴 키 요구 사항 포함 |
| Invoke-Obfuscation (token), Invoke-Obfuscation (AST), Invoke-Obfuscation (string), Invoke-Obfuscation (encoding), Invoke-Obfuscation (compress); Invoke-Stealth, PowerHell, Chameleon, psobf | 정적 PowerShell 복구 |
| Invoke-Obfuscation (launcher), ISESteroids | 부분 PowerShell 복구 |
| Bashfuscator (token), Bashfuscator (string), Bashfuscator (obfuscate), Bashfuscator (compress); Bash 간접 참조 (IFS/eval); node-bash-obfuscate (chunk-table eval) | 정적 Bash 복구 |
| Batch 난독화 (`%random%`), Batch 난독화 (set 간접 참조); VBA 매크로 (p-code 디컴파일 + 스톰핑) | Batch 필링 및 VBA 소스/p-code 복구 |
| YARV InstructionSequence (컴파일된 `.rb`), mruby RITE 바이트코드 | Ruby 소스 복구 |
| OCRA 자체 추출 실행 파일, RubyScript2Exe 패키지 | 부분 freezer 분류/복구 |
| JRuby 컴파일된 클래스, TruffleRuby 네이티브 이미지 | Ruby 카탈로그를 통한 탐지만 |
| BEAM 파일 (Erlang / Elixir 컴파일된 모듈), EZ 아카이브 (ZIP으로 감싼 `.beam` 모듈) | 모듈 추출, 소스/디버그 청크 복구, 또는 Core Erlang 폴백 |
| garble | Go 메타데이터 및 지원되는 리터럴; 원본 이름 해싱은 누락된 시드 없이는 역전될 수 없음 |
| Mach-O Swift / Objective-C 메타데이터, Mach-O fat (유니버설) 바이너리, dyld 공유 캐시 | 런타임 메타데이터, 슬라이스 및 dylib 복구 |
| SwiftShield | 매핑 파서; 원본 이름을 복구하려면 매핑을 제공해야 함 |
| SWF (Flash, FWS/CWS/ZWS) DoABC, 원시 ABC 바이트코드 | 디스어셈블리 및 메서드 본문 의사코드 |
| secureSWF, DoSWF, Kindi, Irrfuscator, swfLock | 탐지만 |
[패밀리 카탈로그](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>등록된 103개 컨테이너 형식 전체</strong></summary>
| 범주 | 형식 |
|---|---|
| 일반 아카이브 | 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 |
| 애플리케이션 및 언어 아카이브 | JAR, WAR, APK, XPI, WHL, EGG, CRX, NUPKG, VSIX, PYZ, Electron ASAR |
| 설치 프로그램 및 애플리케이션 이미지 | PKG, DMG, DEB, RPM, AppImage, Snap, Flatpak, MSIX/APPX, MSI, NSIS, Squirrel, Inno Setup, InstallShield, Enigma Virtual Box |
| 파일시스템 및 파일시스템 스트림 | SquashFS, cramfs, ext4, romfs, MinixFS, Android sparse, btrfs-send, EROFS, JFFS2, NTFS, UBI/UBIFS, YAFFS2, QNX, partclone |
| 디스크 및 배포 이미지 | ISO, OCI, Docker 이미지, VHD, VHDX, WIM, GPT, MBR, FAT12/16/32 |
| 압축 스트림 | XZ, gzip, bzip2, zstd, LZMA, lzip, LZ4, zlib, Unix compress (`.Z`) |
| 내장 애플리케이션 데이터 | Bun standalone, UnityFS, .NET 단일 파일 번들 |
| 펌웨어 | 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; UEFI 펌웨어 볼륨 |
| 메모리 및 암호화 볼륨 | Windows 미니덤프, LUKS1 |
이 명단은 모든 항목에 대한 탐지를 선언합니다. 이 경로 중 102개는 일반 추출기를 사용하며, <!-- roster-breadth:containers-exercised -->42<!-- /roster-breadth -->개는 멤버 바이트에 도달하는 커밋된 입력을 가지고, DMG는 탐지만의 커밋된 증거를 가지며, 59개는 커밋된 입력이 없습니다. LUKS1은 평문에 대해 별도로 등급화되며 복호화를 위해 `aes-cbc-plain` 원시 볼륨 키가 필요합니다. 키가 없으면 키 경계를 보고합니다. 개별 압축 방법, 암호화된 멤버, 분할 볼륨, 및 파일시스템 기능은 더 좁은 한계를 가집니다. StuffIt 5는 현재 포크 디코더가 존재함에도 불구하고 추출을 통해 아카이브 블롭을 반환합니다. Airoha OTP-AES 콘텐츠는 그대로 카빙됩니다.
추가 Rust 리더는 Deno eszip, Apple APFS/HFS+, ELF 추가 오버레이, 및 Blazor WebCIL 구조를 노출합니다. 이들은 103개 형식 수에 추가 항목이 아닙니다. [추출 경로, 메서드 버전, 및 한계](https://github.com/1-3-7/disrobe/blob/main/docs/src/languages/containers.md) · [컨테이너 레지스트리](https://github.com/1-3-7/disrobe/blob/main/crates/disrobe-binfmt/src/container.rs).
</details>
## 자동 복구`auto`는 컴파일된 레지스트리에서 패스를 선택하고, 이를 실행한 뒤 출력과 추출된 자식들을 다시 식별합니다. 신뢰도 임계값, 반복된 콘텐츠 해시, 또는 깊이 제한(기본값 8)에서 중지합니다. 터미널로 태그된 보고서와 소스 파일은 다시 탐지로 피드백되지 않고 출력으로 남습니다. 다음 표는 전체 빌드에 등록된 모든 패스를 설명합니다. 슬림 빌드는 기능 게이트가 적용된 행을 생략할 수 있습니다.
| 입력 계층 | 등록된 패스 ID | 자동 출력 | 전용 제어 또는 전제 조건 |
|---|---|---|---|
| 아카이브, 설치 프로그램, 펌웨어, 볼륨 | `binfmt.container` | 추출된 자식들, 언어/네이티브 패스로 재귀적으로 이어짐 | 멤버 보고서용 `extract` 및 명시적 LUKS1 raw-key 옵션 |
| PyInstaller | `pyinstaller.extract` | 내장 멤버 및 `.pyc` 자식들 | 아카이브별 옵션용 `pyinstaller extract` |
| Python 프리저 | `pyfreeze.extract`, `nuitka.extract` | 추출된 페이로드 또는 지원되는 컴파일된 패키지 구조 | 실험적 `pyfreeze`; Nuitka 플레이버가 무엇이 남는지 결정 |
| 보호된 Python | `pyarmor.unpack`, `sourcedefender.decrypt` | 사용 가능한 평문/바이트코드, 메타데이터 또는 키 경계 보고서 | 일치하는 런타임/키 자료; 전용 PyArmor 모드 및 엄격성 옵션 |
| Python 소스 및 바이트코드 | `py.deob`, `py.decompile`, `py.disasm` | 필링된 소스, 디컴파일된 소스 또는 명령어 트레이스 | `py decompile --emit source,disasm,ast`; 재컴파일 검사에는 일치하는 인터프리터 필요 |
| Pickle | `pickle.classify` | 기호 분석 및 분류 | 개별 검사/재구성 작업용 `pickle` |
| JavaScript | `js.deob` | 지원되는 난독화 해제, webpack/Vite 모듈 복구, Node SEA/bytenode 처리 | `js unbundle`은 더 넓은 번들러 세트를 노출; 소스 맵과 이름 변경 옵션은 직접 제어 |
| WebAssembly | `wasm.deob` | 복구되거나 리프팅된 WAT와 탐지, 요약, 복구 사이드카 | `wasm decompile --target`은 Rust, TypeScript, C, WAT 또는 JSON을 선택 |
| Electron / Tauri | `webview.carve` | 내장 프런트엔드 멤버 | `webview`는 Wails도 지원; 자동 Wails 복구는 `go.classify` 사용 |
| PHP / Phar | `php.peel` | 필링된 소스, `op_array` 출력, 아카이브 자식들, 잔여/키 보고서 | 암호화된 계층의 경우 키와 IV가 정적으로 사용 가능해야 함 |
| JVM / DEX | `jvm.classify` | Java 소스, 프로텍터 및 복구 매니페스트, 클래스/아카이브 자식들 | 매핑, 시그니처 및 선택적 외부 백엔드용 `jvm`/`apk` |
| .NET | `dotnet.classify` | C# 및 분석, 복구된 상수/리소스/CIL 또는 Native AOT 메타데이터 | 다른 소스 형식 및 설치된 렌더링 백엔드용 `dotnet` |
| 모바일 패키지 / 바이트코드 | `mobile.classify` | 런타임/멤버 추출, Hermes 리프트, Dart 커널 소스 또는 AOT 보고서 | 형식별 제어용 `hermes`, `flutter`, `mobile` |
| Lua | `lua.deob` | 복구된 Lua 및 방언/충실도 사이드카 | 명시적 패밀리 및 출력 제어용 `lua` |
| Shell / Office / PDF | `shell.deob` | 필링된 스크립트, 매크로 소스/p-code, XLM 및 문서 보고서 | 문서별 작업용 `shell` |
| Ruby | `ruby.classify` | 분석 및 사용 가능한 경우 복구된 YARV/mruby 소스 | 플레이버별 보고서용 `ruby`; JRuby/TruffleRuby 분류는 Ruby 소스 복구가 아님 |
| BEAM / EZ | `beam.classify` | Erlang/Elixir/Core Erlang, 디스어셈블리, 아카이브 자식들 | 남아 있는 디버그 청크가 소스 충실도를 결정 |
| SWF / ABC | `as3.classify` | ABC 구조, 명령어 목록, AS3 의사코드 | 명명된 상용 난독화기는 탐지만 유지 |
| Go | `go.classify` | 심볼, 타입, garble 분석 및 내장 파일시스템 멤버 | DWARF, BuildInfo 및 기타 전용 보고서용 `go` |
| Swift / Objective-C | `swift-objc.classify` | 메타데이터, 유니버설 슬라이스 및 공유 캐시 dylib | 형제 서브 캐시/심볼 파일이 필요할 수 있음; 직접 `swift`/`macho` 제어 |
| 네이티브 패커 | `native.packer-unpack` | 사용 가능한 언패킹된 이미지 또는 내장 모듈, 심볼, 시그니처, 복구 보고서 | 구현된 패커 디스패치만 언패킹; 상용 VM 계층은 탐지에서 멈출 수 있음 |
| 네이티브 이미지 | `native.image-classify` | 아이덴티티, 심볼, 시그니처, 발견 사항 및 제한된 x86-64/AArch64 의사 소스 보고서 | `native decompile`은 전체 소스 출력 명령을 선택; ARM32/MIPS32 소스 경로는 직접 |
| Windows / OS/2 NE | `native.ne-structure` | 세그먼트, 엔트리, 임포트 및 리소스 | 소스 디컴파일이 아닌 구조적 복구 |
| Perl / R / Tcl / Haxe / WSH | `scriptlang.classify` | 언어 보고서, 복구된 구조 및 지원되는 자식 아티팩트 | 형식별 라이브러리 API가 더 세밀한 작업을 노출 |
| Nim / Zig / Crystal / D | `nativelang.classify` | 언어 지문, 심볼 및 부분적 네이티브 구조 | 분류에는 충분한 잔존 언어 마커가 필요 |
예를 들어, 인식된 PyInstaller 애플리케이션은 `pyinstaller.extract` → `pyarmor.unpack` → `py.decompile`로 진행할 수 있고, APK는 멤버 추출 → DEX → Java로, 패킹된 네이티브 이미지는 언패킹 → 언어 또는 이미지 분석으로 진행할 수 있습니다. 각 화살표는 해당 특정 계층이 실제로 산출하는 것에 따라 달라집니다.```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, 명시적 소스-타깃 선택, 매핑 재생, 선택적 외부 백엔드 호출은 전용 작업으로 남습니다. 패스 레지스트리 · 체인 선택 및 출력 레이아웃.
기능 맵은 명령 그룹과 통합을 다룹니다. 해당
기계 판독 가능 인벤토리는 소스, 테스트, 문서, 지원
상태 및 데모를 연결합니다. CLI 레퍼런스는 중첩 명령을 다루며,
전역 플래그는 공유 옵션을 다룹니다. 설치된 빌드의 인터페이스는 disrobe <command> --help를 사용하세요.
프로젝트 및 서비스 명령도 여기에 색인되어 있습니다: serve, plugin, init, config, catalog, passes, doctor, install, install-deps, self-update, completions, man, explain, bug-report. doctor를 사용하여 플랫폼에 따라 46~51개의 외부 도구를 탐색하고 누락된 선택적 백엔드를 식별하세요.
이 표는 각 복구 작업을 Disrobe의 명령 및 관련 도구에 매핑합니다. 설치된 디컴파일러와 내보낸 아티팩트가 아래에 표시된 통합 지점을 제공합니다.
비교 인벤토리는 미해결 공유 입력 비교를 명시합니다. 백엔드 옵션은 설치 및 위에 링크된 언어 가이드에 문서화되어 있습니다.
측정은 아래에 링크된 고정된 입력, 도구 버전 및 채점 규칙을 사용합니다. DEX 및 JAR 수는 각 도구가 출력한 영역의 컴파일을 측정합니다. 해당 모집단은 서로 다르므로 그 수치가 복구 품질을 순위화하지 않습니다. APK 시크릿 재현율은 동일한 8토큰 정답을 사용합니다.
동일한 Ghidra 12.1.2 분석은 Disrobe가 패킹된 실행 파일을 재구성된 PE로 내보낸 후 다른 코드를 봅니다. 이 로컬 스냅샷은 실제 무해한 패킹된 픽스처를 사용하며 증가와 감소를 모두 기록합니다. 함수/명령어/문자열 열은 9개 입력 분석 스냅샷에서, 완료된 C 렌더링은 별도의 6개 입력 디컴파일러 스냅샷에서 가져옵니다. 완료된 렌더링은 비어 있지 않은 출력이며 소스 정확성 등급이 아닙니다.
kkrunchy 수치는 감소합니다. 더 많이 발견된 함수가 반드시 더 정확한 함수는 아니며, 이러한 분석 수치는 바이트 비교를 대체하지 않습니다. 분석 스냅샷, 디컴파일러 스냅샷 및 별도의 네이티브 바이트 복구 측정을 읽어보세요.
증거 인덱스는 복구 측정을 해당 픽스처, 비교 방법, 명령 및 결과에 연결합니다.
결과는 바이트 복구, 컴파일러 수용 및 동작 검사를 구분합니다. 컴파일러 수용 및 커버리지 수는 동등성 점수가 아닙니다.
이 검사는 원본 아티팩트, 컴파일러, 인터프리터 또는 레이블이 지정된 코퍼스에 대해 Disrobe를 측정합니다. 두 디컴파일러를 비교하는 것과는 구별됩니다. 각 링크된 결과는 입력 모집단, 전제 조건 및 재현 명령을 기록합니다.
Complete evidence records describe each population and grading rule.
차트 레이블은 독립적인 정확성 참조에는 strong을, 컴파일러 수용에는 recompile-only를, Disrobe 자체의 커버리지 카운터에는 coverage-self-reported를 사용합니다. 비교 방법과 모집단이 각 결과의 범위를 정의합니다.
개별 측정값은 결과, 도구 비교, 재현 전제 조건을 참고하세요.
--backend auto를 통해 설치된 도구를 선택할 수 있습니다. 백엔드를 선택하기 전에 해당 명령의 도움말과 설치 가이드를 확인하세요.
체인 러너는 단일 목적 패스를 공유 아티팩트와 중간 표현을 통해 연결합니다. 각 패스는 정당화할 수 있는 출력을 제공하며, 다운스트림 소비자는 출처를 유지하고 지원되지 않는 경계를 보고합니다. 아키텍처, 패스 모델, IR 래더, 체인 러너를 살펴보세요.
문서, 퀵스타트, 결과 가이드부터 시작하세요. 진단을 조회하려면 disrobe explain <code>를 사용하세요. 프로젝트 변경 사항은 기여 가이드와 해당 기능의 테스트 및 증거를 읽어보세요.
위협 모델은 신뢰 경계와 입력 처리를 설명합니다. 보안 문제는 SECURITY.md를 통해 보고하세요. LEGAL.md는 프로젝트의 법적 고려 사항을 설명합니다. 아티팩트 분석 권한은 귀하의 상황에 따라 달라집니다.
Disrobe의 모든 버전은 Disrobe Source-Available License, Version 1.1에 따라 독점적이며 소스 공개 방식으로 제공됩니다. 이 라이선스는 모든 버전에 대해 Elastic License 2.0 및 Version 1.0을 대체하며, 재라이선싱 공지에 명시된 대로 이전의 모든 허여를 철회합니다.
개인의 취미 프로젝트, 개인 학습, 개인이 수행하는 무보수 독립 보안 연구, 비영리 교육 및 연구, 그리고 진정한 저널리즘은 라이선스에 정의된 대로 무료입니다.
회사에 의한 또는 회사를 위한 모든 사용에는 유료 라이선스가 필요합니다. 상업적 라이선싱을 참고하세요.
필수 출처 표기: 이 작업은 1-3-7이 만든 Disrobe를 사용했습니다: https://github.com/1-3-7/disrobe
기여 포크 이외의 포크, 재게시, 리브랜딩, 재판매, 호스팅, 경쟁 개발은 금지됩니다. 소프트웨어는 있는 그대로 제공되며, 사용자의 책임 하에 사용됩니다.
출처 표기, 기여자 약관, 요약, 제3자 고지를 참고하세요.
Copyright (c) 2025-2026 1-3-7. All rights reserved.
이전 개발 커밋은 문서 및 시각적 개편의 일환으로 단일 기준선으로 통합되었습니다.
| 작업 | 명령 | 출력 또는 다음 단계 |
|---|
| 지표, 시크릿, 정적 발견 사항 찾기 | scan, frisk, strings, ioc, indicators, behavior | 발견 사항 및 오프셋 |
| 함수, 흐름, 동작 검사 | query, capabilities, taint, vulnmatch | 쿼리 가능 IR, ATT&CK/MBC 매핑 및 소스-투-싱크 보고서 |
| 주석 및 구조화된 아티팩트 유지 | annot, rename, envelope, verify, yara | 아티팩트 엔벨로프 및 분석가 상태 |
| 출처 추적 및 실행 비교 | chain, context, status, report, diff, guard, semdiff | 보고서, 해시 및 복구 차이점 |
| 공용 네트워크 데이터 수집 | prowl | 명시적 네트워크 수집, 오프라인 복구와 분리 |
| 표면 | 진입점 | 가이드 |
|---|
| Rust | 공유 코어 타입 및 개별 패스 크레이트 | 라이브러리 API |
| Python | import disrobe를 통한 타입 지정 바인딩 | Python 바인딩 |
| HTTP, gRPC, LSP | disrobe serve | 서비스 |
| Model Context Protocol | disrobe-mcp 또는 disrobe serve --mcp | MCP 통합 |
| 에디터 및 분석 도구 | VS Code, IDA Pro, Ghidra, Binary Ninja | 에디터 통합 |
| GitHub Actions | 리포지토리 액션 및 SARIF 출력 | GitHub Action |
| 로컬 커밋 검사 | 훅 ID disrobe | pre-commit |
| 브라우저 | 클라이언트 측 Wasm 워커 | 플레이그라운드 |
| 코딩 도구용 프로젝트 컨텍스트 | disrobe init --ide | 메타데이터 사이드카 |
| 복구 작업 | 명명된 도구 | Disrobe의 경로 | 선택 또는 결합 방법 |
|---|
| Python 바이트코드에서 소스로 | pycdc, PyLingual, uncompyle6, decompyle3 | 인프로세스 CPython 1.0~3.15 디컴파일러, 중첩 코드 객체 복구, 소스/디스어셈블리/AST 출력 | 내장 Python 디컴파일러에서 복구된 소스, 디스어셈블리, AST 검사 |
| 동결된 Python 추출 | pyinstxtractor-ng, pydecipher | PyInstaller, Nuitka, 프리저 추출 후 바이트코드 복구 | auto는 추출된 멤버에서 프로텍터를 거쳐 Python 디컴파일러로 계속 진행 가능 |
| PyArmor | Pyarmor-Static-Unpack-1shot | 정적 래퍼/런타임 복구, 모드 보고서, 선택적 정적 BCC 리프팅 | 일치하는 런타임을 제공하여 래퍼 데이터를 복구하고 모드별 결과 검사 |
| Pickle 검사 | fickling, Python pickletools | 명령어 추적, 심볼릭 리듀서, 분류, 값 재구성 | 리듀서를 실행하지 않고 검사; pickletools는 검사를 등급화하고, CPython은 470개의 생성된 픽스처에서 재구성을 확인 |
| JavaScript 난독화 해제 | webcrack, synchrony, REstringer | obfuscator.io, JS-Confuser, 지원되는 Jscrambler 패턴, 난해한 디코더, 상수/제어 흐름 복구 | 명시적 옵션에는 js deob을, JS가 패키지 내부에 있을 때는 auto를 사용 |
| JS 언번들링 및 소스 맵 | wakaru, webcrack, sourcemapper | 모듈 추출, 소스 맵 처리, 스코프 인식 이름 변경, 패키지된 V8 검사 | js unbundle은 자동 체인 디스패치보다 더 많은 번들러 경로를 노출 |
| WebAssembly | WABT wasm-decompile, Binaryen | WAT 및 C/Rust/TypeScript 의사 소스, JSON 요약, 지원되는 난독화 역변환 | 선택한 소스 타깃 검사; wasmtime 실행은 아래 등급의 복구된 동작을 독립적으로 확인 |
| JVM 소스 | CFR, Vineflower, Procyon, Fernflower | 네이티브 클래스파일 복구 및 프로텍터/문자열 처리 | jvm decompile은 설치된 백엔드의 출력과 함께 Disrobe 아티팩트를 작성; CFR은 아래에 측정된 컴파일 수율 결과가 있음 |
| Android 패키지 및 DEX | JADX, apktool, androguard, dex2jar | 인프로세스 Dalvik 복구, APK 메타데이터/서명, 런타임 추출, Java 출력 | DEX/APK 디컴파일은 기본적으로 네이티브 경로를 사용; Android 백엔드는 명시적으로 선택. JADX는 아래에 측정된 레그가 있음 |
| .NET 어셈블리 | ILSpy, dnSpy, dnSpyEx, de4dot | CIL 복구 및 프로텍터별 상수, 리소스, VM 본문, Native AOT 메타데이터 | dotnet decompile은 설치된 렌더러와 함께 Disrobe CIL 출력을 작성; --backend auto는 ILSpy, dnSpyEx, dnSpy 또는 de4dot을 선택 |
| 네이티브 디컴파일 | Ghidra, IDA, Binary Ninja | 인프로세스 x86-64 C/Rust 및 AArch64/ARM32/MIPS32 의사 C; 복구된 심볼/타입 보고서 | --backend ghidra로 Ghidra를 헤드리스로 선택하거나, 대화형 분석 세션에서 에디터 통합 및 내보낸 심볼 사용 |
| 패킹된 네이티브 실행 파일 | upx -d, unipacker, Detect It Easy | 구현된 언패커 및 제한된 스텁 에뮬레이션, 재구성된 PE 이미지, 내장 로더 모듈 | 복구된 PE 이미지를 Ghidra/IDA로 내보내기. 아래 Ghidra 측정은 패킹된 입력과 재구성된 입력을 비교 |
| 네이티브 난독화 | Ghidra, IDA, Binary Ninja 및 디오브푸스케이션 스크립트 | OLLVM/Tigress 변환, MBA 단순화, 스택 문자열, 네이티브 메타데이터 및 복구 보고서 | 관련 네이티브 작업/API 선택; VM 프로텍터 지문만으로는 본문 복구를 의미하지 않음 |
| Go 메타데이터 및 garble | GoReSym, redress, gore | pclntab, 모듈/타입 메타데이터, 내장 파일, 복구 가능한 garble 리터럴 | go는 이름/타입을 보고; native decompile은 머신 코드 소스 경로를 별도로 처리 |
| Swift / Objective-C | swift-demangle, class-dump, jtool2 | 런타임 클래스/프로토콜/셀렉터 데이터, 심볼 렌더링, 팻 슬라이스, 공유 캐시 dylib | 살아남은 매핑과 서브 캐시 파일 제공; 이름 변경으로 지워진 원본 이름에는 외부 맵 필요 |
| Lua 바이트코드 및 VM | unluac, luadec, LuaDec51 | Lua/LuaJIT/Luau 소스 및 지원되는 난독화 도구와 커스텀 VM 복구 | IronBrew2는 실제 도구 실행 차분 증거가 있음; 일반 .luac 복구와 VM 복구는 서로 다른 작업 |
| Ruby 바이트코드 | MRI 디스어셈블리 | YARV 및 mruby 소스, 옵코드 목록, 프리저/AOT 분류 | MRI 재컴파일은 옵코드 이름 재현율을 등급화; 해당 측정은 실행 동등성을 입증하지 않음 |
| PHP 레이어 | php-malware-finder | Eval 체인 및 리터럴 키 루프/암호 필링, Phar 추출, 인코더 엔벨로프 보고서 | 정적 레이어와 사용 가능한 키 자료 사용; 네이티브 로더 키가 필요한 상용 페이로드는 봉인된 상태로 유지 |
| PowerShell, Bash, VBA | PowerDecode, FLARE 도구, olevba | 셸 디오브푸스케이션, VBA 소스/p-코드 및 스톰핑, XLM 수식, PDF 액션 | shell은 스크립트 복구와 문서 발견 사항을 나머지 아티팩트 분석과 함께 배치 |
| BEAM / ActionScript | Erlang beam_disasm, RABCDAsm | BEAM 디버그 소스/Core Erlang 복구 및 ABC 메서드 본문 의사 코드 | 가능한 경우 디버그 청크 보존; 스트립된 BEAM은 별도의 실제 Erlang 실행 검사가 있음 |
| Hermes / React Native | hermes-dec, hbctool, DroidSaw | 런타임 추출, HBC 구조, 지원되는 의사 JavaScript 리프트 | HBC 파싱은 v60~v96을 다룸; 소스 리프팅은 더 좁은 측정 경계를 가짐. Hermes-to-DEX 브리지 테인트는 구현되지 않음 |
| Flutter / Dart AOT | reFlutter, Darter, blutter | 커널 소스 테이블, AOT 선언 그래프, ARM64 본문, 문자열, 이름 변경 맵 파싱 | 커널 소스와 AOT 메타데이터는 서로 다른 복구 수준; 스냅샷 버전이 AOT 파싱을 제약 |
| 컨테이너 및 펌웨어 | binwalk, unblob, 7-Zip | 등록된 포맷 추출, 재귀적 자식 라우팅, 펌웨어 디코딩/카빙, 멤버별 거부 보고서 | 추출된 멤버를 언어 패스로 직접 공급; 인식된 매직을 성공적인 추출로 간주하지 말고 멤버 바이트를 비교 |
| 시크릿 및 지표 | APKLeaks, TruffleHog, Gitleaks, LinkFinder | 복구된 트리/APK 발견 사항, 토큰 오프셋, 정적 문자열, 시크릿 및 IOC 보고서 | APK 또는 복구된 트리 스캔; 아래에 심어진 동일한 시크릿에 대해 APKLeaks와 비교 |
| 포맷, 패커, 컴파일러 식별 | Detect It Easy, TrID, PEiD, binwalk | 다중 신호 식별, 심볼, 서명, 라우팅 힌트 | identify/detect를 사용하여 복구 경로를 선택한 후 실제 출력 검사 |
| 기능 및 테인트 | capa, Ghidra 스크립트, Joern | 오프셋이 있는 ATT&CK/MBC 발견 사항, 정규화된 IR 쿼리, 소스-투-싱크 흐름 보고서 | 복구된 아티팩트에서 기능 매칭 및 소스-투-싱크 분석 실행; 테인트 보고서에는 Juliet 테스트 모집단이 포함됨 |
| 도구 및 입력 | Disrobe 결과 | 명명된 도구 결과 | 측정이 확인하는 것 |
|---|
| JADX 1.5.5 · Android DEX | 157 / 228 출력 영역이 깨끗하게 컴파일됨 | 281 / 303 출력 영역이 깨끗하게 컴파일됨 | 커밋된 EdgeCases DEX; 실제 javac, 전체 소스 컴파일 후 귀속을 차단하는 영역의 제한적 격리; 서로 다른 출력 모집단 |
| CFR 0.152 · JVM 클래스파일 | 181 / 181 출력 영역이 깨끗하게 컴파일됨 | 152 / 166 출력 영역이 깨끗하게 컴파일됨 | 커밋된 EdgeCases JAR; 동일한 컴파일러/채점 절차; 서로 다른 출력 모집단 |
| APKLeaks 2.6.3 · 심어진 시크릿 APK | 8 / 8 심어진 시크릿 | 5 / 8 심어진 시크릿 | 동일한 APK에서 정확한 토큰 재현율; Disrobe는 심어진 AWS 시크릿 액세스 키, Basic 자격 증명, JWT도 찾음 |
| 패킹된 입력 | Ghidra 함수, 패킹 → 재구성 | 명령어, 패킹 → 재구성 | 문자열, 패킹 → 재구성 | 완료된 C 렌더링, 패킹 → 재구성 |
|---|
| 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 | 측정되지 않음 |
| MEW · AccessEnum | 4 → 152 | 125 → 9,592 | 3 → 802 | 측정되지 않음 |
| MEW · Autologon | 4 → 295 | 125 → 19,595 | 3 → 406 | 측정되지 않음 |
| kkrunchy classic · NASM hello | 4 → 1 | 149 → 10 | 3 → 4 | 4 → 1 |
| 입력 | Disrobe 출력 영역 | 명명된 도구 출력 영역 | 모집단 경계 | 재현 |
|---|
| Android DEX | 157 / 228 출력 영역이 깨끗하게 컴파일됨 | JADX 1.5.5: 281 / 303 출력 영역이 깨끗하게 컴파일됨 | 도구 간 순위 없음: 각 도구는 자체 출력 영역 모집단을 가짐 | cargo run --locked -p disrobe-bench-head-to-head -- --check --only apk-jadx-cfr |
| JVM 클래스파일 | 181 / 181 출력 영역이 깨끗하게 컴파일됨 | CFR 0.152: 152 / 166 출력 영역이 깨끗하게 컴파일됨 | 도구 간 순위 없음: 각 도구는 자체 출력 영역 모집단을 가짐 | cargo run --locked -p disrobe-bench-head-to-head -- --check --only apk-jadx-cfr |
| 복구 | 기록된 결과 | 참조 및 한계 |
|---|
| Python 3.14.5, 고정된 모듈 | 6286개 중 6077개 코드 객체 | 정규화된 옵코드 구조 비교를 통한 CPython 재컴파일; 점프 타깃, 대부분의 피연산자 및 추가 복구된 객체는 등급화되지 않음. 결과 |
| Python 3.14.5, 고정된 코어 모집단 | 18276개 중 17396개 코드 객체, 로컬 측정 | 574개 모듈에 걸친 동일한 정규화 비교; 이는 의미론적 동등성 결과가 아님. 결과 |
| 레거시 Python 1.0~3.7 | 최소 191개 중 150개 픽스처 (회귀 하한) | 원본 소스에 대한 시대별 인터프리터 재컴파일 또는 구조적 토큰. 결과 |
| Pickle 분류 | 102 / 102 분류 픽스처 | pickletools 의미론. 결과 |
| Pickle 재구성 | 470 / 470 재구성된 픽스처가 재실행 동등성 검사를 통과 | CPython 재실행. 결과 |
| JVM 소스 컴파일 | 131개 중 131개 메서드가 컴파일됨 | 실제 javac. 결과 |
| JVM 동작 | 117 / 131 메서드가 관찰된 실행과 일치 | 실제 JVM; 8개 메서드는 분기하고 6개는 격리 실행되지 않음. 결과 |
| Android DEX | 118 / 118 검증기에 제시된 클래스 | JVM -Xverify:all; 155개 중 37개 클래스는 링크 건너뜀으로 등급화되지 않음. 결과 |
| .NET C# | 18 / 35 완전한 EdgeCases 타입이 독립적으로 재컴파일됨 | 실제 Roslyn csc; 합법적 소스가 동등한 동작을 입증하지는 않음. 결과 |
| .NET VM 본문 | Eazfuscator 모델: 67 / 67 명령어; 실제 KoiVM: 6 / 6 본문 리프트됨 | 별도의 원본/클린 빌드 참조; EazVM은 리포지토리 내 가상화 도구를, KoiVM은 실제 도구 출력을 사용. 증거 |
| WebAssembly | 57 / 57 적격 함수 | wasmtime이 테스트 입력에서 반환값, 트랩 및 선형 메모리의 처음 4,096바이트를 비교. 결과 |
| 디버그 청크 없는 BEAM | 19 / 19 모듈 | Erlang/OTP 27.3.4 재컴파일, 내보내기 비교 및 test/0 출력/종료 상태. 결과 |
| Lua IronBrew2 | 실제 2.7.0 표준 및 MAX 출력이 일치하는 실행으로 복구됨 | 원본 프로그램에 대한 실제 Lua 인터프리터; 하나의 VM 패밀리. 결과 |
| Ruby YARV | Greeter 100%; megafile 98.67% 옵코드 이름 재현율 | MRI 재컴파일; 멀티셋 재현율은 순서, 피연산자, 분기 타깃 및 추가 명령어를 무시. 결과 |
| Go 스트립된 타입 이름 | 838개 중 838개 이름 | 비교 빌드의 실제 go1.26.3 메타데이터. 결과 |
| Hermes HBC v96 | 8개 중 8개 함수, 폴백 작업 없음 | 원본 소스 및 함수 이름이 있는 실제 hermesc 샘플. 결과 |
| 네이티브 패킹된 바이트 | UPX, FSG, NSPack, Petite, MPRESS .text가 명명된 커밋된 쌍에서 바이트 동일; Yoda's Crypter 리소스 바이트 동일 | RVA 정렬된 원본 바이트; 전체 이미지 및 리소스 잔차는 별도로 보고됨. 입력별 표 |
| 심어진 지표 | 6 / 6 IOC 카테고리 표현됨 | 커밋된 엔드포인트, 매니페스트 발견 사항, URL, IPv4, 이메일 및 .onion 정답. 결과 |
| MCP 호출 그래프 | 5 / 5 직접 엣지, 모두 올바르게 식별됨 | 스트립된 ELF를 서로 다른 스트립되지 않은 툴체인 쌍둥이와 비교. 정밀도, 재현율 |
| 네이티브 테인트 | 93 / 190 레이블된 흐름 재현됨; 거짓 양성 없음, 로컬 측정 | NIST Juliet CWE-78 char/system 슬라이스, gcc 16.2.0 -O2; 선언된 7개 흐름 카테고리에는 이 슬라이스에 사례가 없음. 결과 |