The HydIR project

What is HydIR?

HydIR is an open-source binary analysis and transformation workbench written in Rust. It connects executable bytes to Ghidra P-code, native intermediate representations, C views, and the evidence behind each result.

Get started →Browse documentation →

Latest articles and explainers#

  1. Ghidra P-code, Explained
  2. From Bitvectors to Behavior
  3. From Graphs to Code

All articles →

How HydIR works#

Start with one ELF. Follow static analysis, a recorded execution, or bounded symbolic exploration. Select a path to highlight its inputs and outputs.

Inside HydIR: bytes, state, and evidenceELF bytes feed a managed Ghidra frontend or independent native frontend. Their artifacts support bounded analysis. Explicit seeds enable concrete execution; type models inform native typed views. Frida records one input-specific execution. Triton explores bounded instruction paths and produces candidate models. These routes remain separate from LLVM and native C generation. explicit execution inputsone binary identitytyped-view evidence ELF bytes + SHA-256source addresses / selected functionsame bytes, distinct workflows Execution seedregister values + known RAMused by concrete tracing AnalysisModeltypes / prototypes / objectsevidence for typed C views Ghidra-backed analysisManaged Ghidra → raw P-codesnapshot / CFG / source-linked operationsChoose: trace / slice / bounded LLVMtracing needs a seed; each route has limitsCoverage / results / explicit stops Independent native analysisProgramSpec / FunctionIndexfunction extents + discovery evidenceMachineIR → StateIR → FunctionIRmachine effects / SSA / ABI evidenceCIR → C viewsLLVM exportoptional Inspect artifacts and their evidenceDesktop · CLI · Python SDK · authenticated service 04 / observe one execution05 / explore a bounded model Frida · concrete observation ELF + InputSpec + selected addressargv / files / explicit budgets Run the isolated Linux observerWindows uses the separately installed WSL2 worker DynamicTrace: witnessed path eventsbinary-bound, input-specific, bounded output Inspect / compare / recover targetsGhidra comparison needs a validated snapshot One run does not enumerate every possible target. Triton · symbolic exploration Selected x86-64 function + stateconcrete seed / selected symbolic inputs Optional Python / Triton bridgeinstruction semantics / bounded path exploration Expressions → conditions → solvercandidates under the supplied state and limits Inspect model / validate concretelyconcrete validation is a separate operation Not an LLVM or native C generation stage. Read the evidence before making a claimartifact identity · inputs · budgets · stops · validation Recovery ≠ fidelity ≠ observed behavior ≠ rewrite readiness
Static analysis, concrete observation, and symbolic exploration establish different claims. Inspect each artifact with its inputs and limits.

Arrows indicate artifact or input dependencies. Trace, slice, and LLVM are alternative Ghidra operations. Native LLVM exports from FunctionIR; native C generation uses CIR. Frida witnesses one input-specific run; optional comparisons and rediscovery use validated Ghidra evidence. Triton operates on bounded machine-instruction paths, independently of LLVM and native C generation. A solver candidate needs separate concrete validation. Explore the full architecture.

Documentation and tools#

Know what the output establishes#

HydIR keeps recovery, semantic fidelity, observed execution, and rewrite readiness separate. Unknown targets and opaque effects remain visible. Read the evidence and release gates alongside generated code.

GitHub and maintainers#

HydIR is developed on GitHub. Browse the source, report an issue, or read the contribution guide.

Maintainers: @Achxy and @mooofin · All contributors