CiRCLE: Recovering Complex Data Structures in Binaries beyond Fragmentation
Zeyu Gao, Junlin Zhou, Songtao Yang, Chao Zhang�Tsinghua University · Sichuan University · Zhongguancun Laboratory�IEEE S&P 2026
Problem: Decompilation Loses Data Structures
Examples of structure representation in decompiled pseudocode
Why Recovery Is Hard: Three Bottlenecks
memset(struct * A dest, …)
memset(struct * B dest, …)
dest🡪field0: int
dest🡪field0: char
Limitations of Prior Work
Limitations of Prior Work
How Does the Author Solve the Problem?
Build MOSAIC graph to maintain the information
Bottom up aggregation + Top-down consolidation
Use LLM for more chances
CiRCLE: A Staged Recovery Framework
Stage 1 in Depth (1/2): Building the MOSAIC Graph
The MOSAIC Graph?
How *(a1+4) = 456 becomes graph facts:
a1
a1 + 4
*(a1 + 4)
#456
OFFSET(4)
DEREF
SHARE
The MOSAIC Graph?
Stage 1 in Depth (2/2): Per-Base-Pointer Local Drafts
It can generate the draft of types; based on MOSAIC graph
Stage 1 in Depth (2/2): Per-Base-Pointer Local Drafts (Example)
Stage 2: Conflict-Aware Global Aggregation
Pass 1 — Bottom-Up
Callees first. Layout requirements propagate from uses back to definitions across assignments and calls.
Pass 2 — Top-Down
Revisits call chains and re-merges caller–callee groups only when sharing stays conflict-free.
Stage 2 in Depth (1/2): Bottom-Up Propagation
Stage 2 in Depth (2/2): Top-Down Consolidation & Pruning
Stage 3: Bounded LLM Refinement
LLM proposes structure
Apply in decompiler
Validate pseudocode
Accept / Fallback
retry — up to 4 rounds
Stage 3 in Depth: Trigger Tasks and the Validation Loop
Evaluation
Metric
Metric Example
Results
Ablation Study
Conclusion