
IDA Pro, Ghidra 및 Binary Ninja의 디스어셈블리를 컴팩트한 protobuf 파일로 내보내며, Python 바인딩을 통해 빠르고 독립적인 바이너리 분석 및 프로그램 조작을 지원합니다.
이미지는 DALL-E로 생성되었습니다.
Quokka는 바이너리 익스포터입니다. 프로그램의 디스어셈블리로부터 디스어셈블러 없이도 사용할 수 있는 익스포트 파일을 생성합니다. 현재 디스어셈블리 백엔드로 IDA Pro, Ghidra, Binary Ninja를 지원합니다.
Quokka의 주요 목적은 초기 익스포트 이후에는 디스어셈블러를 열지 않고도 바이너리를 완전히 조작할 수 있게 하는 것입니다. 또한 디스어셈블러의 API를 추상화하여 사용자에게 깔끔한 인터페이스를 제공합니다.
Quokka는 BinDiff에서 사용하는 바이너리 익스포터인 BinExport에서 많은 영감을 받았습니다.
IDA Pro Ghidra Binary Ninja
│ │ │
IDA Plugin (C++) Ghidra Plugin (Java) BinaryNinja Plugin (Python)
│ │ │
└────────────── quokka.proto ─────────────────┘
(protobuf schema)
│
.quokka files
│
Python bindings (quokka.Program)
├── Capstone backend (primary)
└── Pypcode backend (optional)
플러그인은 CI에서 빌드되며 레지스트리에서 사용할 수 있습니다.
다음과 같은 명령을 사용하여 PIP에서 직접 설치할 수 있습니다:
$ pip install quokka-project
참고: Quokka 생성 파일을 읽는 데 IDA 플러그인은 필요하지 않습니다. 플러그인은 파일을 생성하는 데에만 사용됩니다.
Quokka는 IDA 9.1+와 호환됩니다.
Quokka는 Hex-Rays 플러그인 저장소에 게시되어 있으며 hcli로 설치할 수 있습니다:
user@host:~$ hcli plugin install quokka
플러그인은 또한 CI에서 빌드되어 Releases 탭에서 사용할 수 있습니다.
플러그인을 다운로드하려면 quokka_plugin.so 파일(또는 IDA 버전에 맞는 quokka-ida<version>.zip 아카이브)을 받아 IDA plugins 디렉터리에 복사하세요.
Quokka는 전용 확장 프로그램을 통해 Ghidra(>= 12.0.3)에서의 익스포트도 지원합니다. Python 라이브러리가 로드할 수 있는 동일한 .quokka protobuf 파일을 생성합니다.
빌드 방법, 설치 및 사용 방법에 대한 자세한 내용은 Ghidra 확장 프로그램 README를 참조하세요.
Quokka는 Python 플러그인을 통해 Binary Ninja에서의 익스포트도 지원합니다. Python 라이브러리가 로드할 수 있는 동일한 .quokka protobuf 파일을 생성합니다.
설치 및 사용 방법에 대한 자세한 내용은 BinaryNinja 확장 프로그램 README를 참조하세요.
바이너리를 익스포트하는 첫 번째 수동 방법은 IDA Pro에서 플러그인을 사용하는 것입니다. IDA의 기본 단축키는 Alt+A입니다. 다음 대화상자가 열립니다:

사용 가능한 모드는 다음과 같습니다:
참고: FULL 모드는 아직 구현되지 않았습니다. 현재는 LIGHT 모드만 작동합니다.
참고: 정상적으로 작동하는 IDA 설치가 필요합니다.
$ idat -OQuokkaAuto:true -OQuokkaDecompiled:true -A /path/to/hello.i64
사용 가능한 모든 옵션은 Usage에 설명되어 있습니다.
참고: 그래픽 인터페이스가 필요하지 않으므로 익스포트 속도를 높이기 위해 ida 대신 idat을 사용합니다.
$ analyzeHeadless /tmp/proj Test \
-import /path/to/binary \
-scriptPath ghidra_extension/src/script/ghidra_scripts \
-postScript QuokkaExportHeadless.java \
--out=/path/to/output.quokka --mode=LIGHT
자세한 내용은 Ghidra 확장 프로그램 README를 참조하세요.
참고: Binary Ninja API의 헤드리스 사용에는 상업용 라이선스가 필요합니다. 라이선스가 없으면 Binary Ninja UI 내에서 익스포트 명령을 대신 사용하세요.
$ python binaryninja_extension/export_headless.py /path/to/binary \
-o /path/to/output.quokka --mode LIGHT
자세한 내용은 BinaryNinja 확장 프로그램 README를 참조하세요.
Quokka는 하나 이상의 파일 및/또는 디렉터리(각 디렉터리의 모든 실행 파일)를 병렬로 자동 익스포트하는 CLI 유틸리티 도구를 제공합니다. IDA Pro와 Ghidra 백엔드를 모두 지원합니다:
$ quokka-cli --backend ghidra -t 8 dir/
$ quokka-cli --backend ida --ida-path /opt/ida -t 8 dir/
$ quokka-cli -t 8 dir/ # auto-detect backend
$ quokka-cli -o "%p/exports/%f.quokka" binary # custom output directory
$ quokka-cli -b ida -o %F_ida.quokka -t 4 dir/ # Using relative path
$ quokka-cli -t 8 dir1/ dir2/ binary1 binary2 # multiple inputs
기본적으로 .quokka 파일은 입력 바이너리 옆에 생성됩니다(예: /usr/bin/ls는 /usr/bin/ls.quokka를 생성). -o를 사용하여 리터럴 경로 또는 파일별로 확장되는 템플릿으로 이 위치를 재정의할 수 있습니다 (%f = 파일명(확장자 제외), %F = 파일명, %p = 상위 디렉터리, %P = 전체 경로, %e = 확장자, %% = 리터럴 %).
모든 옵션을 보려면 quokka-cli --help를 실행하세요. 주요 플래그는 다음과 같습니다:
-b, --backend: 디스어셈블러 백엔드 선택 (ida, ghidra 또는 auto)-i, --ida-path: IDA 설치 디렉터리 경로 지정 (idat이 포함된 폴더)--ghidra-path: Ghidra 설치 디렉터리 지정 (GHIDRA_INSTALL_DIR 재정의)-o, --output: 출력 경로 또는 템플릿 설정 (기본값: %F.quokka)-m, --mode: 익스포트 모드 선택 ( 또는 )import quokka
from quokka.types import Disassembler
# Directly from the binary (auto-detects available backend)
prog = quokka.Program.from_binary("/bin/ls")
# Explicitly choose a backend
prog = quokka.Program.from_binary("/bin/ls", disassembler=Disassembler.GHIDRA)
prog = quokka.Program.from_binary("/bin/ls", disassembler=Disassembler.IDA)
# From the exported file
prog = quokka.Program("ls.quokka", # the exported file
"/bin/ls") # the original binary
# Add new types from C declarations
prog.add_type("struct context { int id; char name[64]; };")
prog.add_type("enum status { OK=0, ERROR=1 };")
# Save the .quokka file
prog.write()
# Or apply changes (including new types) back to the IDA database
prog.commit(database_file="ls.i64", overwrite=True)
함수 이름 변경, 프로토타입 설정 등에 대한 자세한 내용은 전체 편집 문서를 참조하세요.
빌드 과정은 사용 중인 IDA SDK 버전에 따라 다릅니다. 이 두 가지 방식을 새로운 방식과 기존 방식이라고도 합니다.
IDA SDK가 마침내 오픈소스화되어 더 이상 별도로 다운로드할 필요가 없습니다.
cmake 옵션 -DIDA_VERSION=<major>.<minor>를 사용하여 github에서 자동으로 동기화할 수 있습니다.
user@host:~/quokka$ cmake -B build \ # Where to build
-S . \ # Where are the sources
-DIDA_VERSION=9.2 \ # IDA SDK version
-DCMAKE_BUILD_TYPE:STRING=Release \ # Build Type
user@host:~/quokka$ cmake --build build -- -j
IDA SDK는 여전히 독점 코드이므로 직접 다운로드한 후 -DIdaSdk_ROOT_DIR:STRING=path/to/sdk 옵션을 통해 cmake에 경로를 제공해야 합니다.
참고: 이 방식은 최신 버전에서도 작동하지만 사용자가 SDK를 직접 다운로드해야 하므로 더 많은 단계가 필요합니다.
user@host:~/quokka$ cmake -B build \ # Where to build
-S . \ # Where are the sources
-DIdaSdk_ROOT_DIR:STRING=path/to/ida_sdk \ # Path to IDA SDK
-DCMAKE_BUILD_TYPE:STRING=Release \ # Build Type
user@host:~/quokka$ cmake --build build --target quokka_plugin -- -j
플러그인을 설치하려면:
user@host:~/quokka$ cmake --install build
어떤 경우든 플러그인은 build/quokka-install에도 있습니다. 이를 IDA의 사용자 플러그인 디렉터리에 복사할 수 있습니다.
user@host:~/quokka$ cp build/quokka-install/quokka_plugin.so $HOME/.idapro/plugins/
빌드에 대한 더 자세한 내용은 빌드를 참조하세요.
문서는 온라인 documentation에서 확인할 수 있습니다.
자주 묻는 질문 목록은 FAQ에서 확인할 수 있습니다.
참고: 현재는 LIGHT 모드만 구현되어 있습니다. FULL(자체 포함) 모드는 계획되어 있지만 아직 기능하지 않습니다.
Quokka는 디스어셈블리 분석을 익스포트하는 두 가지 모드를 제공합니다: 라이트 모드와 자체 포함 모드입니다.
라이트 모드는 필수 정보만 익스포트하여 빠르고 가벼운 파일을 생성하는 데 중점을 둡니다. 이 모드에서는 명령어 수준 이하의 정보는 익스포트되지 않으므로 런타임에 Capstone 엔진을 사용하여 명령어의 디스어셈블리를 얻습니다.
반면 자체 포함 모드는 백엔드 디스어셈블러가 표시하는 그대로 전체 디스어셈블리를 익스포트합니다. 이 경우 더 무거운 파일이 생성되지만 런타임에 타사 디스어셈블러에 의존할 필요가 없습니다.
두 모드 모두 Python 바인딩에서 동일한 API를 제공한다는 점을 알아두는 것이 중요합니다.
[!WARNING] 자체 포함 모드에서도 Capstone 명령어 객체를 얻을 수 있지만, Capstone 디스어셈블리는 Quokka가 익스포트한 것과 다를 수 있음에 유의하세요(명령어가 분할되거나 병합되거나 지원되지 않거나 다른 니모닉을 가질 수 있음). 일반적으로 서로 다른 바이너리 분석 플랫폼은 서로 다른 디스어셈블리를 생성하므로, Capstone을 자체 포함 모드와 함께 사용할 때 이 점을 염두에 두세요.
두 모드 간 차이점에 대한 전체 개요는 아래 표를 참조하세요:
¹ 선택적으로 활성화
² 현재 지원되지 않음
lightfull--decompiled: 디컴파일된 코드 익스포트 활성화 (IDA 전용)-v, --verbose: 상세 로깅 활성화| 라이트 모드 | 자체 포함 모드 |
|---|
| 함수 | ✅ | ✅ |
| 기본 블록 | ✅ | ✅ |
| 명령어 | ❌ | ✅ |
| 피연산자 | ❌ | ✅ |
| 데이터 참조 | ✅ | ✅ |
| 교차 참조 | ✅ | ✅ |
| 섹션/레이아웃 | ✅ | ✅ |
| 디컴파일 | ✅¹ | ✅¹ |
| CFG 그리기 좌표 | ✅¹² | ✅¹² |