Skip to content

Repository files navigation

idacpp

C++ scripting for IDA Pro — the C++ counterpart to IDAPython.

idacpp embeds a C++ interpreter directly into IDA's scripting engine, giving you native access to the full IDA SDK — including Hex-Rays — at interpreter speed. No bindings, no FFI, no type translation: the same ea_t, func_t*, and cfunc_t* you use in compiled plugins, live in a REPL. Built on Cling and Clang 20.

Screenshots

idacpp on Windows — snippet editor with segment listing

Windows — C++ snippet listing segments

idacpp on macOS — snippet editor listing functions

macOS — C++ snippet listing functions

idacpp REPL in IDA output window

C++ REPL tab in IDA's output window

Interactive REPL

Select the C++ tab in IDA's output window:

C++> auto n = get_func_qty();
C++> msg("%d functions\n", n);
142 functions
C++> auto f = get_next_func(0);
C++> qstring name;
C++> get_func_name(&name, f->start_ea);
C++> msg("%s @ %a\n", name.c_str(), f->start_ea);
_start @ 0x1000

All declarations persist across lines — variables, functions, and types remain available for subsequent input.

Scripts

#include<funcs.hpp>
#include<segment.hpp>intmain() {
msg("%d functions, %d segments\n",
get_func_qty(), get_segm_qty());
return0;
}
C++> .x hello.cpp
4 functions, 3 segments

What you can do

  • Interactive REPL — C++ tab in IDA's output window with a persistent session
  • Full IDA SDK — headers available via PCH (or source-header fallback), including Hex-Rays decompiler types
  • Script execution.x scripts with main() entrypoint; reloading auto-unloads the previous version
  • Code completion — SDK-aware completions with prefix matching
  • Crash recoverySIGSEGV / SEH caught, interpreter stays alive
  • Undo / rollback.undo and .clear to revert interpreter state
  • Expression evaluator — IDA's expression engine routes through C++ when active
  • Plain C++ mode — works without IDA SDK as a C++ REPL (no SDK types available)

Examples

The examples/ directory contains ready-to-run scripts:

ScriptDescription
hello.cppMinimal starter — prints function and segment counts
list_functions.cppEnumerate all functions with addresses and names
list_segments.cppEnumerate all segments with address ranges
decompile_first.cppDecompile the first function using Hex-Rays
xrefs.cppList cross-references to the first function

Quick start

Agent-assisted install

Feed install-agent.md to your AI coding agent (Claude Code, Cursor, etc.) — it will clone the dependencies, build LLVM/Cling, and compile the plugin automatically.

Manual

git clone https://github.com/allthingsida/idacpp.git
cd idacpp && mkdir build &&cd build
cmake .. -DCLINGLITE_SOURCE_DIR=/path/to/clinglite \
-DCLING_BUILD_DIR=/path/to/cling-build \
-DIDASDK=/path/to/idasdk
cmake --build . --config Release

The build produces idacpp.dll / idacpp.so / idacpp.dylib, placed in the IDA SDK plugin directory by CMake. See BUILDING.md for prerequisites, platform-specific instructions, and build output details.

Plugins

idacpp has a plugin system that extends the REPL with additional headers, libraries, and PCH contributions. Plugins are auto-discovered from plugins/*/CMakeLists.txt and enabled via cmake variables.

Available plugins

PluginVariableAuto-enabledDescription
ida_sdk(always on)YesIDA SDK headers and idalib — the base layer
idax-DPLUGIN_IDAX_SRC_DIR=<path>When source dir is providedidax C++23 SDK wrapper by Kenan Sulayman
winsdk-DPLUGIN_WINSDK=ONWIN32Windows SDK headers (windows.h, tlhelp32.h, etc.)
linux-DPLUGIN_LINUX=ONUNIX AND NOT APPLELinux system headers (sys/mman.h, elf.h, etc.)
qt6-DPLUGIN_QT6=ONNoQt6 Core/Gui/Widgets — UI introspection and dynamic forms

Enable / disable

# Enable by providing source directory
cmake .. -DPLUGIN_IDAX_SRC_DIR=/path/to/idax
# Disable an auto-enabled plugin
cmake .. -DPLUGIN_WINSDK=OFF

In the monorepo, plugins are auto-enabled based on platform and source availability — no flags needed.

idax examples

The idax plugin includes example scripts using the C++23 API:

ScriptDescription
list_functions.cppAll functions with addresses and names
list_segments.cppSegments with ranges and R/W/X permissions
database_info.cppFile path, format, processor, bitness, MD5
xrefs_to.cppCross-references to the first function
callers_callees.cppCall graph of the first function
find_calls.cppCall instructions with resolved targets
imports.cppImport modules and symbols
decompile.cppDecompile the first function (Hex-Rays)

Creating a new plugin

Copy plugins/template/ and follow the plugin README for a detailed walkthrough.

Documentation

DocumentContents
install-agent.mdAgent prompt for automated build & install
BUILDING.mdPrerequisites, CMake variables, platform builds, output sizes
USAGE.mdCLI commands, script format, runtime setup, expression evaluator
examples/Ready-to-run IDA SDK scripts
plugins/Plugin system — extending the REPL with additional APIs

Troubleshooting

  • failed to initialize C++ interpreter: check CLING_DIR — it must point to a valid Cling/LLVM build tree with lib/clang/<ver>/include/ intact.
  • IDA SDK headers unavailable: set IDASDK to enable IDA API declarations in the interpreter.
  • Runtime library lookup issues: set IDADIR to the IDA installation directory on the target machine.
  • Plugin load crash / abort on startup: if test binaries that also link LLVM statically live in $IDADIR/plugins/, init_library() loads duplicate LLVM symbols and aborts. Move the plugin aside before running tests.

License

MIT License. Copyright (c) Elias Bachaalany. See LICENSE.

This project depends on clinglite and Cling — see their respective licenses.

About

A C++ REPL for IDA Pro / IDA C++ SDK

Resources

Stars

97 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages