
Quokka: 빠르고 정확한 바이너리 익스포터
이미지는 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: 익스포트 모드 선택 (light 또는 full)--decompiled: 디컴파일된 코드 익스포트 활성화 (IDA 전용)-v, --verbose: 상세 로깅 활성화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에서 확인할 수 있습니다.