Skip to main content

Reference

Tools, and what each one actually produced

A catalogue organised around one column: did this tool produce a working rewritten binary of the original specimen? For most of them the answer is no, and that is not a criticism.

Tool catalogues usually list capabilities. This one lists outputs, because the difference between an expression, a proof, a graph, a lifted module and a rewritten executable is the difference this course exists to teach. A tool that emits a simpler expression has done something valuable and has not deobfuscated a binary, and saying so is not a complaint about the tool.

Obfuscators

Four compilers and one post-link rewriter. Note that "working rewritten binary?" here asks about deobfuscation of the original specimen — an obfuscator producing a valid obfuscated program is the input to this course, not an output of it.

ToolPurpose / abstractionProject useStrongest retained resultStrongest limitationWorking rewritten binary?
OLLVM-16 (wwh1004 port)LLVM IR substitution, bogus control flow and flatteningIndependent treatments and O0–O3 comparisons on frozen showcaseAll 24 intended O0 SUB IR sites; useful BCF/FLA positive controls for downstream rewritingSUB canonicalization; global fallback after inactive annotation pilot; modern port is not the historical original implementationProduces obfuscated PEs, not deobfuscation; downstream BCF/FLA rewrites passed.
Hikari LLVM15LLVM IR SUB/BCF/FLA/splittingExisting locally patched production compiler; retained matrix and transfer casesWorking O0 FLA input and stock rewrite with 28/28 successor pairsAnnotation-only SUB pilot inactive; global enable flags used. BCF gates fold in native code; exact BCF IR text cannot be reparsed in tested frontendObfuscated originals passed; downstream O0 FLA rewrite passed. Not universal Hikari support.
Polaris LLVM16LLVM IR passes plus separate X86 MIR/backend transformationsIndividual smoke validation, selected IR matrix and MBA/BCF/FLA studiesStrong executable MBA expansion; generic BCF proof/rewrite transfer; backend-obfu worked in separate smoke laneSame requested seed insufficient for MBA/MIR reproducibility; stock FLA rewrite is WRONG; IR and MIR metrics cannot be conflatedObfuscated originals passed; downstream BCF rewrite passed, stock FLA rewrite failed.
Tigress 4.0.11C source-to-source obfuscationEnvironment-matched generated C for EncodeArithmetic, AddOpaque, Flatten; same C reused across optimization levelsArithmetic remains substantial at /Ox; generated source exposes state/dispatch provenanceInitialized-state proof assumptions; stock indirect CFG discovery failure; whole generated file not seed-reconstructed reliablyObfuscated originals passed; no working deobfuscated Tigress PE in this study.
BinProtectPost-link x64 PE instruction/control-flow transformationsEight controlled protected outputs and static follow-on analysis; virtualization disabledVisible post-link arithmetic expansion and useful counterexample to naive opacity claims0/8 protected outputs valid at runtime; global processing can include runtime code; no exposed seedNo valid protected output in this study, hence no working end-to-end deobfuscation lane. No protected PE bundled.

Semantic analysis and deobfuscation

Read the "strongest limitation" column beside the "strongest result" column. Every row on this site has both, and a page that shows you one without the other is not finished.

Tool / workflowPurpose / abstractionProject useStrongest retained resultStrongest limitationWorking rewritten binary?
MiasmNative disassembly, semantic IR and symbolic executionExtract local/whole-function expressions and support stock successor recoveryUsable ground-truth-linked expression and CFG evidence across familiesPolaris complex MBA flag-AST growth; stock tool's Tigress jump-table discovery incomplete—do not generalize this to all Miasm integrationsFramework can support rewriting; here outputs depend on the integrating tool, notably ollvm-unflattener.
msynth AST/oracleSimplify symbolic expressions via rewrites/oracle matchesRepeated-site and composed-expression comparisons with independent SMT checksSelected local reductions; controls distinguish pre-existing canonical expressions from new recoveryWeak on remaining native MBA; oracle activity is not a causal proof of recovery; no full complex-return recoveryNo; expressions and proof records only.
SiMBAAlgebraic linear-MBA simplificationSeparate msynth pipeline mode, not stochastic searchTigress partial reduction, including 305→79 nodes in a complex mixed returnReduced expression may remain far from source; restricted representation/class assumptionsNo; expression output, not PE reconstruction.
msynth SynthesizerSearch for smaller candidate expressions from behaviorSmall three-XOR pilot, then a separate preregistered 12-site expansion and complete-expression probesTen of twelve expanded isolated-site candidates accepted with SMT proofTwo UNKNOWN; complete-expression searches failed within budget, including clean controls. Sampling alone is insufficientNo; candidates require independent equivalence checks.
ollvm-unflattenerNative CFG discovery plus Miasm symbolic successor recovery and patchingUntouched stock tool on O0/O2 cases, separately labelled diagnostics/assistanceOLLVM/Hikari O0 working canonical rewritesPolaris wrong rewrite; Tigress discovery failure; optimized layouts and metadata assumptionsYes for retained OLLVM/Hikari O0; not for all cases.
RPISEC llvm-deobfuscator methodologyBinary Ninja SSA state def/use traversal and local patchingSource inspection only; alternative conceptual comparisonExplains a different state-identification and patching strategyNo plugin execution or corpus success demonstrated; SSA alone does not resolve indirect discovery or multiway semantic-switch errorsUpstream is a patching methodology; no working output from it was produced here.
TritonActual-instruction dynamic symbolic analysis and SMT branch reasoningGeneric bounded harness, genuine-branch controls, symbolic writable globals and initialized Tigress state22/22 OLLVM and 16/16 Polaris gates proved; 3/3 Tigress under captured stateExploration/model limits; state assumptions and UNKNOWN must be explicit. This is Salwan's DBA library, not GPU TritonNot by the analysis alone. A separate project-local proof consumer produced passing OLLVM/Polaris branch-patched PEs.
Mergenx64 PE function lifting to LLVM IR with internal simplificationSeventeen selected cases, raw/internal stages plus ordinary LLVM O2 and runtime contracts68 verifier-valid/recompilable modules; passing Polaris MBA lift with residual complexityOLLVM SUB raw lift already wrong; helper/memory contracts restrict execution; valid IR is insufficientNo rewritten original PE. Recompiled validation harnesses are a different deliverable.

Manual inspection

No core exercise in this course requires a paid decompiler or a commercial binary-analysis platform. Every lab has a route that works from the supplied source, IR, text disassembly, result files and SVGs — on Linux, offline. A disassembler makes some of them faster and none of them possible.

ToolPurpose / abstractionProject useStrongest resultLimitationWorking rewritten binary?
IDANative disassembly, graph navigation; optional decompiler depending on installationUser-provided target graphs and instruction comparisonsReadable semantic landmarks and a Tigress switch/jump-table viewA recovered view is not a complete/correctness proof; licensing/features vary; supplied images are not pseudocodeNo automatic recovery result claimed.
DiaphoraFunction matching and binary-diff views within IDAUser-supplied primary/secondary graph and assembly comparisonsSide-by-side structure makes residual code and rewritten routing visibleColours/similarity are not equivalence; database hashes/tool versions not supplied; two screenshot identities need reviewNo working rewrite claim; diff analysis only.
x64dbgWindows native debuggingIntended manual setup/use for the retained PE examples; export/RVA instructions suppliedEnables optional breakpoint/step/return-value observation on WindowsNo new debugger session was run or validated in this handoff; not a native Linux tool; stale PDB and ASLR caveatsNo automated deobfuscation result claimed.

What each workflow emits

The same question, as a single table: given an input, what comes out, and what is the boundary on it?

Table 06

What does each deobfuscator actually produce?

Expression recovery, a branch proof, LLVM IR and a rewritten PE are different outputs.

WorkflowInput / ideaDelivered resultBoundary to remember
msynth AST/oracleExtracted expression; rewrite / matchSimpler expressionNo rewritten PE in this study.
SiMBAAlgebraic MBA simplificationSimpler expressionPartial reduction is not full recovery.
SynthesizerSearch for a small expressionCandidate expressionAccept only after equivalence proof.
ollvm-unflattenerDiscover states; recover successorsRewritten PE or failureA produced PE can have wrong semantics.
Triton DSE/SMTSymbolic branch conditionsProof / witnessAnalysis itself does not patch the PE.
Proof-driven rewriterConsume proofs and exact bytesPatched PEPredicates and dead bytes can remain.
MergenLift x64 instructionsLLVM IRValid IR can silently miscompute.
Ordinary LLVM O2Optimize retained or lifted IROptimized IRCannot repair an unsound lift.

Ask two questions: what representation was recovered, and how was its correctness checked?

PE = Windows Portable Executable. The Mergen test harness is not a rewritten original PE.Open the original lecture figure (SVG)

Two names that collide

Triton in this course is Jonathan Salwan's dynamic binary-analysis and SMT framework. It is not the GPU kernel compiler of the same name, and searching for the wrong one will waste an afternoon.

Virtualization in this course means translating protected behaviour into custom bytecode run by an embedded interpreter. It does not mean the Windows virtual machine the lab runs in. No virtualization or devirtualization experiment was performed in this corpus, so week 12 treats it as an endpoint the course can point at and cannot measure.

Lab access and the execution boundary

All twenty-one specimens are Windows x64 PE files. Reading them — source, IR, disassembly, graphs, result files — works on any platform, and that is the route every core exercise uses. Executing or debugging them needs the course's Windows x64 lab image. No Wine or Linux-rebuild equivalence is claimed: a Linux rebuild would be a different specimen with a different ABI and different lowering, and it must not be silently substituted for these results.

See BINARY_GUIDE.md for the per-specimen execution status, and the evidence page for why no executable is downloadable from this site.

Enlarged evidence

Open the file