An MCP harness that lets Claude Code drive Ghidra, IDA or Hopper in a question-and-answer loop. It was recorded as a candidate for moo1-re, then torn down (2026-10-16) to see what a mature RE harness does that ours doesn’t. Not installed. Ghidra isn’t installed either.
Links: moo1-re · Data-First RE (the DOS overlay wall) · The AI Decomp Wave (earlier video, same trend) · Transpilation as Grounding (why the KOEI work skipped Ghidra) · Contract vs. Substrate (the frame for the comparison) · Theory of the Firm (build vs. buy) · Jevons for Software, CyborgDJ as Controller — the same pattern (inference driving tools over MCP) proposed for DJ analysis
Source: YouTube: Low Level, “I Tested The Viral Reverse Engineering Repo” (~16 min, mostly an overview) · repo morluto/rea (MIT, created 2026-04-14; shallow clone read at d5be402, 2026-10-17 +0800; 61 MB, TypeScript) · npm rea-agents
x86:LE:16:Real Mode, but docs/ghidra-dos.md says appended overlays are excluded from analysis. Checking the headers: STARMAP.EXE is 563,328 bytes, and 281,392 of them (50%) are a Borland FBOV overlay. ORION.EXE has a 33,792-byte FBOV overlay. So REA alone sees at most half of STARMAP, and the turn logic may be in the half it can’t see. Getting past this would need a step that splits out the FBOV overlays first. This is zappatic’s relocation/overlay wall again.| REA technique | Our nearest equivalent | Read |
|—|—|—|
| Every result is an Evidence record: an ID, coverage, limitations, and observation vs. inference vs. unknown kept separate | The rule that a learned fact records its cause (projects SDK) | They enforce it in the schema. We enforce it in prose. Worth borrowing as a field convention for findings files. |
| record_unknown / update_unknown: a registry of open questions with revisions and supporting/contradicting evidence IDs | ## Open Questions sections, matched with grep | Vault/CLAUDE.md already names our failure: questions get re-asked or answered without anyone noticing. This is the mechanical fix. Strongest thing to borrow. |
| “Missing coverage is unknown, not absence”: a bounded negative search stays bounded | The zero-yield-is-a-wrong-path rule | Same instinct, with REA’s version applied per result. |
| Load-image verification: digest the loaded program against the file bytes and relocations | The EXE byte-search verifier (moo1-re) | Verification-independence at the loader layer. Our tools assume the loader is right. |
| Reconstruction obligation ledger: a claim closes only when a verifier of comparable authority passes | The oracle ladder (data-first-re) | The same thing written as a closure rule. |
| Summary first, then page through retained results, with token-cost measurements in experiments/analysis-efficiency/ (e.g. 4 selective replies cost more than 1 full dossier) | Coordinator holds context and curates the working set | They measure. We don’t. Their numbers are relevant to cost-conscious runs. |
| Primitives over workflows; add a workflow only after repeated use shows it’s needed (docs/tool-design.md) | Skills appear after a pattern repeats | Same rule. |
| annotate_native_function writes a name and reads it back, but edits are discarded on close | The .toml symbol registry, which persists | We’re ahead here. REA is a per-delivery contract. The vault is substrate. |
Could we build it? The core is an MCP wrapper over headless Ghidra plus an evidence schema, so yes. But reuse beats rebuild: REA is MIT-licensed and already works. The part only we would build is the persistence bridge: exporting Ghidra annotations into our symbol registries so they survive the session.
raw/ hook: if a rule can be checked mechanically, it belongs in a schema or a hook, not in an instruction. The accounting and checklists (evidence records, the unknowns registry, the end-of-investigation checklist in REA’s skill) are the first candidates.0x1000, linear address = seg×16+off) makes zappatic’s failed manual join (part 5: RAM 0813:92FC = Ghidra 1468:4B7C, delta 0x7DD0) solvable by formula. 0x1000 − 0x7DD = 0x0823 = 0x0813 + 0x10, which is the PSP plus 16 paragraphs, the usual MZ image base. So for the root module, Ghidra linear = DOSBox linear + (0x1000 − (PSP+0x10))×16. Claude’s inference from one data point. Verified live the same day (see Open Questions): the formula holds, and overlays turned out to be cheap too (one more term, at offset :0000).Low Level’s three concerns: (1) all software becomes abandonware (who maintains a one-shot clone?), (2) clones are a supply-chain risk, (3) companies will protect their IP by moving software to the cloud, VDI or web apps.
[file, size, fixups] from the root stubs (dos_addr.py map). A splitter is now just slicing. Not built.)0192 observed (MCB owner), B = 01A2. Relocations match 2990/2991 (STARMAP) and 1899/1900 (ORION); the one miss in each is a saved-vector variable. All 31 table-sweep tables sit at B×16 + file_off − header. FBOV overlays load at <buffer>:0000, so a runtime offset is the in-overlay offset: zappatic’s fleet-count inc 4E23:1839 = overlay #71 + 0x1839, and was observed live at 4DF4:1839. The Ghidra form (B = 0x1000) is still unverified (not installed). Tool + evidence: moo1-re tools/dos_addr.py, notes/dos-address-join.md.record_unknown) as a tool over the ## Open Questions sections?tools/open-questions.py generates the registry from the pages. Kept: ID, status, asking page, resolved-by links, resolution note. Dropped: the revision counter (git does that) and contradicted-by (nothing on the pages marks it).