
IDA Pro IDALib을 래핑하여 상태 비저장 JSON 출력 바이너리 분석을 제공하는 에이전트 네이티브 CLI: 디스어셈블리, Hex-Rays 디컴파일, CFG, 상호 참조, 문자열, 그리고 배치 또는 병렬 IDB 처리.
사전 요구사항: IDA Pro 9.1 (라이선스 보유, 한 번 실행) · IDA 9.1 SDK 압축 해제 (빌드 시에만 필요) · Rust + LLVM/Clang (bindgen 요구사항)
export IDADIR="/Applications/IDA Professional 9.1.app/Contents/MacOS" # IDA install dir
export IDASDKDIR=/path/to/idasdk91 # unpacked SDK (absolute path!)
git clone <this-repo> && cd idalib-cli
cargo install --path .
idalib-cli info # ✅ verify tool version, IDA version, license
SDK는 빌드 시에만 필요합니다. 바이너리는 런타임에 로컬 IDA 라이브러리를 링크합니다. SDK 없이 개발 검사를 하려면:
cargo test --no-default-features --features stub-idalib.
모든 명령에는 -d/--db <PATH>가 필요합니다 — IDB 파일(.i64) 또는 바이너리
(처음 사용 시 옆에 IDB가 생성됨)입니다. 주소는 0x401000 또는
401000 형식을 받습니다. 출력은 항상 하나의 JSON 문서이며, 오류는
0이 아닌 종료 코드와 함께 stderr로 전달됩니다.
| 명령어 | 설명 |
|---|---|
idalib-cli -d <bin-or-i64> db info | 확인된 경로, IDB 상태, 크기 |
| 명령어 | 설명 |
|---|---|
idalib-cli -d <db> meta | 파일 형식, 컴파일러, 비트 수 |
idalib-cli -d <db> processor | 프로세서 정보 |
idalib-cli -d <db> segments | 모든 세그먼트 |
idalib-cli -d <db> segments-by-range -a <ea> | 주소를 포함하는 세그먼트 |
idalib-cli -d <db> functions [-u] | 함수 목록 (-u = lib/thunk 제외) |
idalib-cli -d <db> function -a <ea> | 단일 함수: CFG, 블록, xref |
idalib-cli -d <db> disasm -a <ea> [-n N] | N개 명령어 디스어셈블 (기본값 8) |
idalib-cli -d <db> decompile -a <ea> [--all-blocks] | Hex-Rays 의사 코드 |
idalib-cli -d <db> insn -a <ea> | 단일 명령어 (+ group/is_call/is_ret 분류) |
idalib-cli -d <db> strings | 문자열 목록 |
idalib-cli -d <db> names | 이름이 지정된 위치 |
idalib-cli -d <db> xrefs [-a <ea>] [--all] [--from] | 주소로의 xref (기본값) 또는 주소로부터의 xref (--from), 또는 전체 |
idalib-cli -d <db> find --text <s> | 텍스트 검색 결과 |
idalib-cli -d <db> find --imm 0x1337 | 즉시값 검색 결과 |
idalib-cli -d <db> find --pattern 554889e5 | 16진수 바이트 패턴 검색 |
idalib-cli -d <db> bytes -a <ea> [-n N] [--width byte|word|dword|qword] | 원시 바이트 (hexdump) 또는 리틀 엔디언 정수 |
idalib-cli -d <db> entries | 진입점 |
| 명령어 | 설명 |
|---|---|
idalib-cli -d <db> comments get|set|append|remove -a <ea> [-c "text"] | 주석 |
idalib-cli -d <db> bookmarks list|add|get|remove -a <ea> [-d "desc"] | 북마크 |
idalib-cli -d <db> rename -a <ea> -n <name> | 함수 / 데이터 레이블 이름 변경 |
idalib-cli -d <db> set-type -a <ea> -t "int f(int, char *);" | C 타입 선언 적용 (함수 프로토타입 / 데이터 타입) |
idalib-cli -d <db> signatures --make [--only-pat] | FLIRT 시그니처 생성 |
| 명령어 | 설명 |
|---|---|
idalib-cli -d <db> batch -- <op> [<op>...] | 순차 작업, IDB는 한 번만 열림 |
idalib-cli parallel -d <list|glob> [--jobs N] -- <op> | 여러 DB에 하나의 작업, 각각 서브프로세스로 실행 |
idalib-cli info [--version|--ida|--all] | 도구 / IDA 버전, 라이선스 |
🔎 알 수 없는 바이너리 분류
idalib-cli -d ./sample meta # what is it? (filetype/compiler/bitness)
idalib-cli -d ./sample segments # memory layout
idalib-cli -d ./sample strings # quick hints
idalib-cli -d ./sample functions -u # user code only
🔍 함수 파고들기
idalib-cli -d ./sample function -a 0x401000 # CFG + blocks + xrefs
idalib-cli -d ./sample decompile -a 0x401000 # read the pseudo-code
idalib-cli -d ./sample disasm -a 0x401000 -n 20 # or the raw instructions
idalib-cli -d ./sample xrefs -a 0x401000 --all # who calls it
📝 발견 사항 주석 달기 (프로세스/에이전트 간 유지됨)
idalib-cli -d ./sample comments set -a 0x401000 -c "parses config, see 0x402100"
idalib-cli -d ./sample bookmarks add -a 0x401000 -d "entry point"
idalib-cli -d ./sample comments get -a 0x401000 # verify
⚡ 여러 샘플 일괄 분석
# first pass: create IDBs + overview for every sample
idalib-cli parallel -d "./samples/*.bin" -- "batch -- meta functions -u"
# deep pass: decompile one hot function in every IDB
idalib-cli parallel -d "./samples/*.i64" --jobs 8 -- "decompile -a 0x401000"
🔎 원시 데이터 검색 & 검사
idalib-cli -d ./sample find --text "MAGIC" # string hits
idalib-cli -d ./sample find --imm 0x1337 # immediate-value hits
idalib-cli -d ./sample find --pattern 554889e5 # byte pattern (prologue)
idalib-cli -d ./sample bytes -a 0x401000 -n 32 # hexdump
idalib-cli -d ./sample bytes -a 0x401000 --width qword -n 4
idalib-cli -d ./sample xrefs -a 0x401000 --from # outgoing refs (calls)
idalib-cli -d ./sample rename -a 0x401000 -n decrypt # label it
idalib-cli -d ./sample set-type -a 0x401000 -t "int f(const char *, int);" # set prototype
🤖 에이전트 친화적 일괄 검사 (하나의 JSON 문서)
idalib-cli -d ./sample batch -- "meta" "segments" "functions -u" "decompile -a 0x401000"
에이전트 워크플로 가이드: skills/idalib-cli/SKILL.md; 실행 가능한
엔드투엔드 예제는 examples/workflow.sh에 있습니다.
decompile){
"id": 7,
"start": "0x401000",
"end": "0x401080",
"size": 128,
"name": "main",
"blocks": 3,
"decompiled": true,
"pseudocode": "int __cdecl main(...) { ... }"
}
선택적 ~/.idapro/idalib-cli/config.toml (기본 디렉터리: $IDALIB_CLI_HOME):
| 필드 | 설명 |
|---|---|
| idadir | IDA 설치 디렉터리 (기본값: 자동 감지) |
| idb_dir | 새 IDB가 생성되는 위치 (기본값: 바이너리 옆) |
| default_db | -d를 생략했을 때 사용됨 |
| save | 각 명령 후 IDB 저장 (기본값 true) |
| auto_analyse | IDB 생성 시 전체 자동 분석 실행 (기본값 true) |
바이너리 옆입니다: ./target.bin → ./target.bin.i64. 위치를 변경하려면
구성에서 idb_dir을 설정하세요.
batch는 IDB를 한 번 열고 모든 작업을 해당 핸들에 대해 실행합니다 (마지막에
한 번 저장) — 하나의 데이터베이스에 대해 여러 정보가 필요할 때 최적입니다. parallel은
데이터베이스마다 하나의 서브프로세스를 생성하며 (IDALib은 스레드 안전하지 않으므로
프로세스로 격리됨), --jobs로 제한된 워커 풀을 사용합니다 — 많은 샘플에 최적입니다.
-d는 단일 경로, 쉼표로 구분된 목록, 또는 glob(*.i64)을 받습니다.
안 됩니다. 한 번에 IDB당 하나의 프로세스만 사용하세요. parallel은 데이터베이스마다
하나의 서브프로세스를 생성하여 이를 준수합니다. 수동 다중 에이전트 작업의 경우,
각 에이전트에 자체 -d 대상을 부여하세요.
idalib-rs는 컴파일 시 SDK 헤더를 파싱하여 FFI 바인딩을 생성합니다 (bindgen).
SDK는 Hex-Rays 라이선스와 함께만 제공되며 재배포되거나 내장되지 않습니다 —
빌드된 바이너리는 런타임에 사용자의 IDA 설치를 링크합니다.
idalib-cli/
├── src/
│ ├── cli.rs # clap definitions; every command + -d/--db
│ ├── ops/ # metadata, comments, bookmarks, db, batch, parallel, ...
│ ├── session/ # config.toml handling
│ └── helpers/ # JSON output views
├── stubs/idalib/ # dev-only API stub (SDK-free checks, never shipped)
├── tests/ # integration tests
├── skills/idalib-cli/ # single agent skill (workflow guide)
└── examples/workflow.sh # runnable end-to-end example
도구 버전은 x.y.z 형식이며, 마이너 버전마다 하나의 dev 브랜치와 하나의 릴리스 브랜치가 있습니다:
| Ref | 용도 | 예시 |
|---|---|---|
main | 최신 개발 (v*_dev의 병합 대상) | — |
v0.9_dev | 도구 0.9.x용 개발 브랜치 | 현재 작업 |
v0.9_release | 도구 0.9.x용 안정 브랜치 (수정만) | 백포트 |
v0.9.1 (tag) | 릴리스 지점 | 현재 릴리스 |
| 도구 버전 | 호환 IDA | idalib-rs |
|---|---|---|
| 0.9.x | 9.1 | 0.6.1 (고정 =0.6.1) |
다음 (v0.10_*) | 새 IDA 버전 | 의존성 범프 |
새 IDA 버전 지원 = idalib 의존성 범프, Cargo.toml의
[package.metadata.ida] 업데이트, 새 브랜치 라인(v0.10_*) 생성.
Apache License 2.0에 따라 배포됩니다. Cargo.toml의 license 필드는
idalib-rs 의존성과의 호환성을 위해
MIT OR Apache-2.0으로 선언되어 있으나, 이 저장소는 Apache-2.0 텍스트만
포함합니다. IDA SDK를 절대 커밋하거나 재배포하지 마세요.