reverify README

The project's README from github.com/2akouwu/reverify. As one markdown file: README.md.

Reverify

Stop your AI from making things up.
It proposes; deterministic tools check every claim against ground truth, and only what's verified counts.

PyPI Python CI Coverage OpenSSF Scorecard MIT Stars

Build with Ona

AI is confident and often wrong: it invents an API, a struct field, an offset, or what a function does, and says it like fact. Reverify makes a deterministic tool the judge — the model proposes a claim, the tool checks it against the actual artifact, and it comes back VERIFIED / REFUTED with evidence. The model never gets to assert a fact on its own.

Two things it does today:

The hardest place to prove the first point is binary reverse engineering, where hallucination is worst — so that's where the numbers come from. On 71 real Windows system files the AI's textbook answer was wrong 97% of the time; reverify caught every one and never accepted a wrong claim (0 of 71; the same gate runs in CI on Linux and macOS every push, and an independent aarch64 run found the same) (EXAMPLE.md, BENCHMARK.md; python benchmarks/prologue_prior.py).

Reverify catches the model's hallucinated prologue on kernel32.dll, then verifies the corrected claim

The problem

Language models are great at reading code and unreliable at reverse engineering. Ask a model to reconstruct a struct or an algorithm from a binary and it will confidently invent offsets, sizes, and behavior. In binary analysis this hallucination problem is far worse than in source code, and "did the model just make that up?" is the single biggest blocker to using AI for real RE.

What Reverify does

Reverify pairs a language model with a deterministic, pure-Python RE toolkit and makes the toolkit the judge. The model proposes; the tools verify. A hypothesis about a structure or an algorithm is only reported once it has been checked against the actual bytes — disassembled, pattern-matched, or executed in the emulator — so the output is grounded in the binary instead of the model's imagination.

Reverify is for authorized reverse engineering — malware analysis, CTF, interoperability research, and software you own or are permitted to analyze. See SECURITY.md.

Quick start

# Install the CLI + MCP server from PyPI:
pip install reverify        # pure-Python core; or "reverify[full]" for capstone+unicorn+lief
reverify auto sample.bin --json

# Or run straight from a checkout — pure standard library, nothing to install:
python reverify/cli.py auto sample.bin --json
python reverify/cli.py parse-pe sample.exe --json
python reverify/cli.py disasm 90505831C0C3 --arch x86_64

The verification loop

This is what the name is about. A claim is any hypothesis about the binary; the deterministic tools are the judge and hand back VERIFIED, REFUTED, or INCONCLUSIVE together with the bytes they actually observed:

reverify verify sample.bin --claim '{
  "kind": "instructions", "offset": 4096,
  "mnemonics": ["push", "mov", "sub"], "note": "function prologue"
}'
# Check a reconstructed routine actually computes what the model claimed:
reverify verify - --claim '{
  "kind": "emulate_result", "code": "b805000000b90300000001c8c3",
  "arch": "x86", "expect_registers": {"eax": 8}
}'

Claims can be batched from a JSON file (--claims-file claims.json); the CLI exits non-zero if anything is refuted, so an agent or CI job can gate on a grounded reconstruction. Claim kinds: bytes_at, u16_at / u32_at / u64_at (typed reads, no endianness math), pattern_present, string_present, instructions (mnemonics and optionally operands), emulate_result, behavior_equiv, prove_equiv, protobuf_field, import_present, export_present, section_present, and the semantic kinds function_at, calls, references, reachable_from_entry (see The semantic layer). Offsets are file offsets unless a claim says "space": "rva" or "va"; the verifier translates through the section table and echoes all three addresses in the evidence, and a refuted bytes_at reports where the expected bytes actually are. Set "observe": true (or omit expected) to have the tools read a value instead of asserting one, and "depends_on": [...] so a refuted root invalidates the claims built on it.

Grounded means informative, not just "nothing refuted"

"Every claim verified" is trivially reachable: assert that the file starts with MZ and that .text exists. So Reverify also weighs how much a verified set actually says. Each result carries a weight — zero for claims that merely restate the fact sheet the model was shown, for duplicates, for inline code/data that does not occur in the binary (self-referential), and for echoes of the tools' own previous output; otherwise it is measured from the binary itself — how often the expected content occurs in this file and how much entropy it has — so zero padding, a ubiquitous prologue, or a pattern that matches everywhere weigh almost nothing even though they verify, and emulation must actually execute non-degenerate code. A reconstruction is grounded only when nothing is refuted and the verified weight reaches --min-information (default 1.0). This follows the CORE refinement of FActScore: credit only claims that are factual, informative and non-repetitive. reverify reconstruct --samples N draws several proposals per round and lets the verifier — not the model's confidence — select among them.

EXAMPLE.md walks through one run on kernel32.dll — the model proposes the textbook prologue from prior, the verifier refutes it with the real bytes, and the model corrects to grounded, with no API key and no specific model. BENCHMARK.md is the reproducible measurement behind the numbers above.

Evidence, not claims

Everything above is checkable without trusting the author:

The ledger: state that survives a context reset

Every agent harness handles a full context window the same way — a model summarizes the transcript, the rest is dropped, and the docs warn that repeated compactions degrade accuracy. That loss is unavoidable for free-form conversation, because nothing in a transcript says which parts were state and which were chatter.

Reverify's loop can do better for itself, because it already draws that line: the only things that matter are what the tools verified, observed, proved — and refuted. Everything else (the model's prose, its unverified guesses) was never trusted, so dropping it loses nothing. Since v0.8.0 exactly that state is written to disk as it happens:

reverify reconstruct target.exe --goal "..."   # resumes from .reverify/ automatically
reverify ledger target.exe                     # what is established, what is known false
reverify ledger --hook                         # Claude Code SessionStart hook (compact|clear|resume)

Over MCP the same happens with no setup: re_verify_claim records every grounded result, and re_ledger hands them back after the host compacts or clears its context (the server's instructions tell the agent to do so). Nothing unverified is ever stored — claim notes are excluded on purpose.

The loop that never fills up: fresh sessions with a verified hand-off

For a long task the ledger is not enough on its own — something has to decide when to drop the transcript and what the next context starts with. reverify orchestrate runs a goal as a sequence of fresh-context sessions and keeps the model in charge of the timing:

reverify orchestrate target.exe --goal "map the loader: entry, imports it really uses, exports" \
  --driver claude           # Claude Agent SDK on your Claude Code login; or openai (OPENAI_* env), or mock

A real run with the Claude Agent SDK driver on msimg32.dll (2 sessions × 4 turns, no API key): 15 grounded facts across the rollover — the real entry-point instructions, the machine type, header pointers read through typed observes — 2 guessed call-stub patterns refuted, 0 false accepts, and the second session started from the ledger, not from a summary (benchmarks/results/orchestrate-claude-msimg32-2026-09-04.json).

Any agent CLI without compaction: reverify rollover

The same rule applied to an interactive session — Claude Code, Codex CLI, Gemini CLI or OpenCode. Built-in compaction is turned off; the model hands off to files, and instead of a model-written summary the session is replaced wherever the CLI lets a hook do that (Gemini CLI, OpenCode) or a launcher owns the process. Where it does not (a plain claude or codex), reverify keeps the context lean rather than pretending to clear it: bulky tool output goes to files that stay re-readable, edits stay local, exploration goes to subagents, and the hand-off is always current. We are asking those vendors for the missing primitive.

pip install reverify
reverify rollover install          # every CLI found on PATH (or --harness claude,codex,gemini,opencode); backups kept
reverify rollover doctor           # what is wired, whether the hook commands still resolve, recent events

Then use your CLI exactly as before. The hooks do the hand-off; Gemini CLI and OpenCode also open the fresh session themselves. For Claude Code and Codex, or whenever you want the fresh session to open automatically, start the CLI through the launcher instead:

reverify rollover claude                    # same arguments as the CLI itself, e.g.
reverify rollover codex --full-auto
reverify rollover instructions --write AGENTS.md   # optional: the protocol paragraph for the model

Compare with a compactio

reverify (2akouwu/reverify)

Searching Database…

Что это?Reverify — инструмент, который не даёт ИИ-агентам галлюцинировать факты: детерминированный набор инструментов проверяет каждое утверждение модели по эталонной истине, а главным полигоном служит обратная разработка.
Это отдельное приложение или то, что подключается к моему агенту?Он поставляется и как MCP-сервер, который агенты вроде Claude Code, Cursor, Codex и Gemini CLI могут вызывать напрямую, и как обычный CLI (reverify verify, reverify reconstruct и т.д.), который можно запускать самому.
Как это запустить?Установите его как Python-пакет; ядро на чистом Python работает из коробки без дополнительной настройки, и можно запустить reverify verify или подключить его как MCP-сервер к своему агенту.
Нужно ли сначала ставить Ghidra или другие инструменты для реверс-инжиниринга?Нет — детерминированное ядро (разбор PE/ELF/Mach-O, дизассемблирование, поиск по паттернам, эмуляция) написано на чистом Python и не требует Ghidra; опциональные дополнения (pip install reverify[full] или reverify[angr]) добавляют capstone, unicorn, lief, Z3 и angr для более продвинутого анализа.
Он правда ловит неверные ответы или просто для галочки?Да — на 71 реальном системном файле Windows непроверенные «учебниковые» ответы ИИ ошибались в 97% случаев, и Reverify поймал каждый такой случай, ни разу не приняв неверное утверждение. Он ещё и взвешивает, насколько информативно проверенное утверждение, чтобы тривиальные всегда-истинные утверждения не засчитывались.
Что происходит с сессией реверс-инжиниринга, когда контекст ИИ заполняется?Вместо автоматического пересказа с потерями reverify rollover передаёт сессию в файл и начинает свежий контекст, а постоянный журнал хранит проверенные факты, так что следующая сессия продолжается с той же обоснованной позиции без потери доказанного состояния.
Может ли он проверять что-то помимо бинарников?Да — reverify equiv прогоняет кандидатную и эталонную реализации на общих входных данных на Python или C и проверяет, что результаты совпадают, применяя ту же строгость проверки к обычным переписываниям или рефакторингам исходного кода.
Он откажется просто сказать, что всё хорошо?Он различает исходы VERIFIED, REFUTED и INCONCLUSIVE и требует минимальный «информационный вес», чтобы тривиально истинные утверждения (вроде файла, начинающегося с MZ) не считались осмысленной обоснованной реконструкцией.
С какими кодинг-агентами работает Reverify?Он работает в Claude Code, Codex, Gemini CLI и OpenCode и предоставляет себя как MCP-сервер, так что любой MCP-совместимый агент может вызывать его инструменты.
Creator
2akouwu
Size
0.6 MB
Stars
1.3K
Age
1mo
Commits · 90 Days