
IDA Pro IDALib을 래핑하여 상태 비저장 JSON 출력 바이너리 분석을 제공하는 에이전트 네이티브 CLI: 디스어셈블리, Hex-Rays 디컴파일, CFG, 상호 참조, 문자열, 그리고 배치 또는 병렬 IDB 처리.
IDA Pro IDALib를 위한 에이전트 네이티브 CLI — 모든 명령은 하나의 -d/--db 플래그를 받고, 모든 응답은 JSON입니다.
-d/--db <PATH> (바이너리 또는 .i64)를 전달하세요. 데몬도, 세션 관리도 없습니다.사전 요구사항: 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 설치를 링크합니다.