
CLI nativo de agente que envuelve IDA Pro IDALib para análisis binario sin estado con salida JSON: desensamblado, descompilación Hex-Rays, CFG, xrefs, strings y procesamiento de IDB por lotes o en paralelo.
Requisitos previos: IDA Pro 9.1 (con licencia, iniciado al menos una vez) · SDK de IDA 9.1 descomprimido (solo en tiempo de compilación) · Rust + LLVM/Clang (requisitos de 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
El SDK es necesario solo en tiempo de compilación; el binario enlaza tus bibliotecas locales de IDA en tiempo de ejecución. Comprobaciones de desarrollo sin SDK:
cargo test --no-default-features --features stub-idalib.
Cada comando necesita -d/--db <PATH> — un archivo IDB (.i64) o un binario (se
crea un IDB junto a él en el primer uso). Las direcciones aceptan 0x401000 o
401000. La salida es siempre un documento JSON; los errores van a stderr con un
código de salida distinto de cero.
| Comando | Descripción |
|---|---|
idalib-cli -d <bin-or-i64> db info | Rutas resueltas, estado del IDB, tamaño |
| Comando | Descripción |
|---|---|
idalib-cli -d <db> meta | Tipo de archivo, compilador, bits |
idalib-cli -d <db> processor | Información del procesador |
idalib-cli -d <db> segments | Todos los segmentos |
idalib-cli -d <db> segments-by-range -a <ea> | Segmento que contiene una dirección |
idalib-cli -d <db> functions [-u] | Lista de funciones (-u = omitir lib/thunk) |
idalib-cli -d <db> function -a <ea> | Una función: CFG, bloques, xrefs |
idalib-cli -d <db> disasm -a <ea> [-n N] | Desensambla N instrucciones (por defecto 8) |
idalib-cli -d <db> decompile -a <ea> [--all-blocks] | Pseudo-código de Hex-Rays |
idalib-cli -d <db> insn -a <ea> | Instrucción única (+ clasificación group/is_call/is_ret) |
idalib-cli -d <db> strings | Lista de cadenas |
idalib-cli -d <db> names | Ubicaciones con nombre |
idalib-cli -d <db> xrefs [-a <ea>] [--all] [--from] | Xrefs hacia una dirección (por defecto) o desde ella (--from), o todas |
idalib-cli -d <db> find --text <s> | Busca coincidencias de texto |
idalib-cli -d <db> find --imm 0x1337 | Busca coincidencias de valor inmediato |
idalib-cli -d <db> find --pattern 554889e5 | Busca un patrón de bytes en hex |
idalib-cli -d <db> bytes -a <ea> [-n N] [--width byte|word|dword|qword] | Bytes crudos (hexdump) o enteros little-endian |
idalib-cli -d <db> entries | Puntos de entrada |
| Comando | Descripción |
|---|---|
idalib-cli -d <db> comments get|set|append|remove -a <ea> [-c "text"] | Comentarios |
idalib-cli -d <db> bookmarks list|add|get|remove -a <ea> [-d "desc"] | Marcadores |
idalib-cli -d <db> rename -a <ea> -n <name> | Renombra una función / etiqueta de datos |
idalib-cli -d <db> set-type -a <ea> -t "int f(int, char *);" | Aplica una declaración de tipo C (prototipo de función / tipo de datos) |
idalib-cli -d <db> signatures --make [--only-pat] | Genera firmas FLIRT |
| Comando | Descripción |
|---|---|
idalib-cli -d <db> batch -- <op> [<op>...] | Operaciones secuenciales, IDB abierto una vez |
idalib-cli parallel -d <list|glob> [--jobs N] -- <op> | Una operación en muchas DBs, un subproceso por cada una |
idalib-cli info [--version|--ida|--all] | Versión de la herramienta / IDA, licencia |
🔎 Triaje de un binario desconocido
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
🔍 Profundizar en una función
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
📝 Anotar hallazgos (sobrevive entre procesos/agentes)
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
⚡ Análisis masivo de muchas muestras
# 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"
🔎 Buscar e inspeccionar datos crudos
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
🤖 Inspección por lotes para agentes (un documento JSON)
idalib-cli -d ./sample batch -- "meta" "segments" "functions -u" "decompile -a 0x401000"
Guía de flujo de trabajo para agentes: skills/idalib-cli/SKILL.md; un ejemplo
ejecutable de extremo a extremo en examples/workflow.sh.
decompile){
"id": 7,
"start": "0x401000",
"end": "0x401080",
"size": 128,
"name": "main",
"blocks": 3,
"decompiled": true,
"pseudocode": "int __cdecl main(...) { ... }"
}
Archivo opcional ~/.idapro/idalib-cli/config.toml (directorio base: $IDALIB_CLI_HOME):
| Campo | Descripción |
|---|---|
| idadir | Directorio de instalación de IDA (por defecto: autodetectado) |
| idb_dir | Dónde se crean los nuevos IDBs (por defecto: junto al binario) |
| default_db | Se usa cuando se omite -d |
| save | Guarda el IDB después de cada comando (por defecto true) |
| auto_analyse | Ejecuta el autoanálisis completo al crear un IDB (por defecto true) |
Junto al binario: ./target.bin → ./target.bin.i64. Configura idb_dir en el
archivo de configuración para cambiar la ubicación.
batch abre el IDB una vez y ejecuta cada operación contra ese handle (guarda una vez
al final) — ideal cuando necesitas varios datos sobre una misma base de datos. parallel
genera un subproceso por base de datos (IDALib no es thread-safe, así que el aislamiento es
por proceso) con un pool de workers limitado por --jobs — ideal para muchas muestras.
-d acepta una ruta única, una lista separada por comas o un glob (*.i64).
No. Un proceso por IDB a la vez. parallel respeta esto generando un
subproceso por base de datos; para trabajo manual con múltiples agentes, dale a cada agente su propio
objetivo -d.
idalib-rs genera sus bindings FFI en tiempo de compilación analizando las cabeceras
del SDK (bindgen). El SDK solo se distribuye con tu licencia de Hex-Rays y nunca se
redistribuye ni se incrusta — el binario compilado enlaza tu propia instalación de IDA
en tiempo de ejecución.
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
Las versiones de la herramienta son x.y.z; una rama de desarrollo + una de release por minor:
| Ref | Propósito | Ejemplo |
|---|---|---|
main | último desarrollo (destino de merge de v*_dev) | — |
v0.9_dev | rama de desarrollo para la herramienta 0.9.x | trabajo actual |
v0.9_release | rama estable para la herramienta 0.9.x (solo correcciones) | backports |
v0.9.1 (tag) | punto de release | release actual |
| Versión de la herramienta | IDA compatible | idalib-rs |
|---|---|---|
| 0.9.x | 9.1 | 0.6.1 (fijado =0.6.1) |
siguiente (v0.10_*) | nueva versión de IDA | dependencia actualizada |
Dar soporte a una nueva versión de IDA = actualizar la dependencia idalib, actualizar
[package.metadata.ida] en Cargo.toml, abrir una nueva línea de rama (v0.10_*).
Distribuido bajo la Apache License 2.0. El campo license en
Cargo.toml declara MIT OR Apache-2.0 por compatibilidad con las
dependencias de idalib-rs; este repositorio
incluye únicamente el texto de Apache-2.0. Nunca hagas commit ni redistribuyas el SDK de IDA.