relumea
.text0x0040100098,304 BRXcode. Every function on this page.412 functions · 93.0% byte-identical

Agent-assisted reverse engineering, verified byte for byte.

relumea puts an agent on a stripped executable. Read-only calls run at once; the 143 that write pause the run for you. Recovered C is recompiled with the original toolchain and diffed against your binary.

124read-only tools, called without asking
143destructive tools that pause the run
267tools in the registry, shared by SPA, CLI and MCP

Agent run sample workspace

illustrative · not a customer binary
Intent

Triage updater_svc.exe. Name the persistence path and the C2 send. Prove the decoder.

one line from the analyst · 8 tool calls · the model never touches the binary itself
01get_pe_inforead-onlyok
02get_imports · get_capabilities · get_protocols_scanread-onlyok
03get_function_triageread-onlyok
04get_decompilationread-onlyok
05rename_functiondestructivegated
06get_matchesread-onlyok
07rebrew testread-onlyok
08get_remediationread-onlyok
Step 05 is the one call that waits. You approve or refuse it.The paused call

.functions412 entries1,648 bytesRX

The sample, one screen

412 functions in address order. Filled means the recovered C recompiled to the same bytes; empty means not attempted yet.

Section table: each section's name, virtual address, virtual size, characteristics, byte coverage and what it holds
.text0x0040100098,304RX93.0%code. Every function on this page.
.rdata0x0041900032,768Rread-only data. Scanner output, digests, technique tables.
.data0x0042100024,576RWwritable state. Names, types and signatures you decide.
.reloc0x004270008,192Rbase relocations, resolved at link time.
91.3% coveredEXACT 198RELOC 141PROVEN 12NEAR 2STUB 3not attempted 56
Tool call 01get_pe_inforead-onlyPE · x86_32 · 4 sections · entry 0x00401a20

Identity

PE header updater_svc.exe

mingw-14.2.0-win32
Format / archPE · x86_32
Image base0x00400000
Size196,608 B
Sections.text .rdata .data .reloc
Functions412
Source files94
sha256a7ed6974787de73373b3ca48d32faaf6611b6745ed362e85599282d68c1489d4
Tool call 02get_imports · get_capabilities · get_protocols_scanread-only106 imports · networking, persistence, process-injection

Capabilities, protocols, hardening

Import table and strings only. Every finding names the import or string that fired it.

Imports

106 entries
KERNEL32.dll64
ADVAPI32.dll18
WS2_32.dll12
WINHTTP.dll9
USER32.dll3
fingerprintpe-infofiletypecapabilitiesprotocolsbehaviorhardeningsecretssecurity-scanthreatremediationcrypto-scanstructsunstripmatchlineagerelatedcompositionbenchmark

Findings

import evidence: high · string only: medium
Sample triage findings: scan, finding, firing evidence and confidence
ScanFindingEvidenceConf.
capabilitiesnetworkingWinHttpSendRequesthigh
capabilitiespersistenceRegSetValueExAhigh
capabilitiesprocess-injectionCreateRemoteThreadhigh
hardeninganti-debug-apiIsDebuggerPresenthigh
protocolshttpWinHttpOpenhigh
threatT1071 Application Layer ProtocolWinHttp* + WS2_32high
threatT1547 Boot or Logon AutostartRegSetValueExA on Run key pathmedium
threatT1055 Process InjectionCreateRemoteThreadhigh
Tool call 03get_function_triageread-only5 ATT&CK techniques · software type · threat score

ATT&CK mapping

Matched against a curated technique table. Software type and threat score are computed from the stored scans.

Techniques

threat.classify_binary
T1071Application Layer Protocol WINHTTP + WS2_32 socket family high
T1547Boot or Logon Autostart RegSetValueExA on a Run key path medium
T1055Process Injection VirtualAllocEx, WriteProcessMemory, CreateRemoteThread high
T1027Obfuscated Files or Information high-entropy executable section, decoder present medium
T1140Deobfuscate / Decode Files decode_config, XOR key schedule in .rdata high
Tool call 04get_decompilationread-onlydecode_config · 54 B · C

Decompiled C

Decompiler output, stored before the agent reads it.

Recovered source cfg/decode.c

{ "function_id": 412 }
unsigned int decode_config(unsigned char *buf, unsigned int len, unsigned int key)
{
    unsigned int i, sum = 0;
    for (i = 0; i < len; i++) {
        buf[i] ^= (unsigned char)(key >> ((i & 3) * 8));
        sum += buf[i];
    }
    return sum ^ 0x5A5A;
}
Tool call 05rename_functiondestructivejournal_action 31 · name_history row written

The paused write

Renaming writes to the function table, so the run stops with the exact call it wants to make. Approve it and the rename lands, journaled, with the previous name recorded. Refuse it and the refusal goes back to the model as the tool result; the run continues. Nothing is written while it waits.

Run paused

destructiveHint · confirm_conversation_run
the exact call it wants to make{ "function_id": 412, "name": "decode_config", "source": "ai" } → rename_function
approve or reject — the run continues either way
  • rename_function → awaiting_approval
  • nothing is written until you answer
  • a refusal is fed back to the model, not raised as an error
Tool call 06get_matchesread-only47 candidate rows · 12 EXACT

Corpus matches

Ranked against every binary already in the workspace. Stub rows stay visible.

Coverage rebrew status

last verify 231/236
93.0%of .text recompiled byte-identical · 351 / 412 functions
sample workspace · mingw-14.2.0-win32
EXACT 198RELOC 141PROVEN 12NEAR 2STUB 3not yet attempted 56

Functions sample rows

illustrative
Sample function ledger: address, name, size, match status and source file
VANameSizeStatusSource
0x00401020svc_Main1842STUBsvc/main.c
0x00401840cfg_LoadEncrypted412RELOCcfg/load.c
0x00401a20decode_config54EXACTcfg/decode.c
0x00401c80net_OpenSession288RELOCnet/session.c
0x00402210http_SendBeacon640NEARnet/beacon.c
0x00402a90reg_PersistRunKey196EXACTpersist/runkey.c
0x00403100inj_WriteRemote720PROVENinj/remote.c
0x004038c0anti_IsDebugged48EXACTanti/debug.c
0x00403b40str_WideToUtf892EXACTutil/wide.c
0x00404100buf_Grow128RELOCutil/buf.c
0x00404880crc32_update176EXACTutil/crc32.c
0x00405120svc_Install384RELOCsvc/install.c
Tool call 07rebrew testread-only54 / 54 bytes identical · EXACT

Byte comparison

The original toolchain recompiles the recovered C. Bytes are diffed instruction by instruction: EXACT, RELOC or PROVEN.

decode_config 0x00401a20

mingw-14.2.0-win32 · 0x00401a20
source · C9 lines
unsigned int decode_config(unsigned char *buf, unsigned int len, unsigned int key)
{
    unsigned int i, sum = 0;
    for (i = 0; i < len; i++) {
        buf[i] ^= (unsigned char)(key >> ((i & 3) * 8));
        sum += buf[i];
    }
    return sum ^ 0x5A5A;
}
original bytes · rebrew asm23 instructions
00401a2056push esi00401a2131c0xor eax, eax00401a2331d2xor edx, edx00401a2553push ebx00401a268b5c240cmov ebx, dword ptr [esp + 0xc]00401a2a3b542410cmp edx, dword ptr [esp + 0x10]00401a2e741eje 0x00401a4e00401a3089d1mov ecx, edx00401a328b742414mov esi, dword ptr [esp + 0x14]00401a3683e103and ecx, 300401a39c1e103shl ecx, 300401a3cd3eeshr esi, cl00401a3e89f1mov ecx, esi00401a40320c13xor cl, byte ptr [ebx + edx]00401a43880c13mov byte ptr [ebx + edx], cl00401a460fb6c9movzx ecx, cl00401a4942inc edx00401a4a01c8add eax, ecx00401a4cebdcjmp 0x00401a2a00401a4e355a5a0000xor eax, 0x5a5a00401a535bpop ebx00401a545epop esi00401a55c3ret
EXACT54 / 54 bytes identical
Tool call 08get_remediationread-onlyYARA rule · Snort 2 set · STIX 2.1 bundle

Remediation artifacts

Artifacts

built from the stored scans
YARA ruleanchored on pe.imphash(), filesize bounded, literals clamped
Snort 2 setone rule per URL, domain and IPv4 indicator in the threat scan
STIX 2.1 bundlean indicator per IOC, uuid5 ids, deterministic dates
.rdata0x0041900032,768 BRread-only data. Scanner output, digests, technique tables.

Why relumea

Legacy tools analyze one binary at a time and hand you a similarity score. relumea runs the analysis for you, stops when a write is involved, and proves the result against the compiler that produced the target.

No source. No symbols. No debug info.

A stripped PE is the normal input. Headers, imports and strings are the evidence, and the scans and the model work on the bytes as shipped.

The agent asks before it writes.

124 tools are read-only and run on request. The other 143 carry MCP's destructiveHint, so the run pauses on the call itself and waits for a person.

A match is decided by a compiler.

Recovered C goes back through the original toolchain and the bytes are compared. Similarity scores are a starting point; this is the verdict.

One workbench, four capabilities

From a single uploaded artifact to a signed-off rename. Each capability names the engine or tool call behind it.

Agentic analysisIdentity, imports, capabilities and ATT&CK findings, run in order, then a written summary. run_conversation_agent · 267 MCP tools
DecompilationEngine decompilers produce the C. An optional model proposes names, inline comments and types, all editable and revertible. rebrew decompile · ai_artifacts
Function matchingMatch against your corpus, diff candidates side by side, transfer names and signatures, then verify the result byte for byte. resembl · rebrew test
Automated remediationA YARA rule, Snort rules per indicator, a STIX 2.1 bundle, an SBOM and a PDF report. remediation · export_sbom · report-pdf
272 containerized compilers5,779 tests44 example targetsMIT engine

Fits the toolchain you already run

Renames and signatures leave as runnable scripts for the disassembler you have open. Agents reach the same store over MCP; everything else over the REST API or the CLI.

Ghidrarenames and signatures exported as a runnable Python script
IDA Prothe same export as an IDA script
Binary Ninjathe same export as a rename document
MCP server267 tools for agent clients, 124 read-only
REST APIthe HTTP surface the web UI runs on
CLIreportal, full parity with both
SBOMCycloneDX, SPDX or CSV per artifact
DetectionYARA, Snort 2 and STIX 2.1 exports

Where it gets used

Malware triage

capabilities, ATT&CK mapping, threat score, family detection from your own reference samples

Vulnerability research

security findings ranked by reachability, attack surface mapped from stored scans

Third-party assurance

library identification and an SBOM for software you did not build

Supply chain

CycloneDX or SPDX per artifact, repeated across a fleet

Legacy modernisation

recompile an old binary and byte-match it to prove the source is the original

Firmware

carve and scan device firmware images

Questions

Is this just an LLM?

No. Capabilities, protocols, hardening, secrets, ATT&CK mapping, matching and the byte comparison are deterministic scans and a compiler. The model is optional and reads decompilation already stored.

Where do my binaries go?

Into your workspace, content-addressed and scoped to you. AI features are opt-in; the model sees stored artifacts, not the raw sample.

How do you handle packed malware?

Filetype detection names the packer from section names, entry-point bytes, constants and entropy, and reportal unpacks LZEXE and UPX itself. A packer that rewrites its own stub is reported as unidentified rather than guessed at.

Do you support firmware?

Yes. Firmware extraction and scanning is a separate path from PE analysis.

Can you match across architectures and file formats?

The platform and architecture scope is a coarse filter derived from the stored fingerprint, not a guarantee. Every payload says so.

What can I export?

YARA, Snort 2, STIX 2.1, an SBOM as CycloneDX, SPDX or CSV, a PDF report, C headers for recovered types and signatures, and rename scripts for Ghidra, IDA Pro and Binary Ninja.

Do you integrate with Ghidra, IDA and Binary Ninja?

As exports rather than plugins: renames and signatures leave as runnable scripts for those three tools. Agents reach the same store over MCP, and everything else over the REST API or the CLI.

Can I undo what the agent wrote?

Yes. Every mutating call returns a journal action, so revert_journal_entry undoes it later, from another process.

.data0x0042100024,576 BRWwritable state. Names, types and signatures you decide.

Verdicts

rebrew test writes the status. Neither an operator nor the model assigns it.

EXACTRecompiled bytes identical to the original.
RELOCIdentical except linker-filled addresses.
PROVENNot byte-identical; semantic equivalence proven with angr + Z3.
NEARClose. The diff names the register, flag or reorder that is left.
STUBControl flow still diverges. Work remains.

One registry, three surfaces

The same 267 tools back the web UI, the CLI and the MCP registry. An agent run calls the same handlers, under the same journal, with the same revert.

AgentMCP · confirmation gate
// it asked for these; reads ran at once
get_pe_info(binary_id=1)
get_imports(binary_id=1)
get_capabilities(binary_id=1)
get_decompilation(function_id=412)
// this one paused the run
rename_function(function_id=412)
// and the write came back revertible
journal_action: 31
CLIreportal
$ reportal add-binary updater_svc.exe
Registered 1 binary, queued scans
$ reportal conversation-run 4 "triage this"
paused: rename_function wants approval
$ reportal conversation-confirm 4
$ reportal match 1 --min-similarity 70
$ reportal journal revert 31
WebReact SPA
  • Conversations, with Approve call and Reject call on a paused run
  • Binary details, hashes, sections, security mitigations
  • Functions, matches, side-by-side diff
  • Types, signatures, rename history
  • Journal with per-row revert

Run control

Approval comes from the tool, not the prompt

Read-only tools run the moment the agent asks. The other 143 carry MCP's destructiveHint, so the pause happens on the call. A prompt cannot override the annotation.

A refused call returns as a tool result

A rejected call comes back to the model as the tool result. The run continues; the next call is usually read-only.

Bounded and cancellable

A run stops at agent.MAX_TOOL_CALLS and streams its state as server-sent events. cancel_conversation_run halts it at the next step boundary.

Every write is revertible

The rename at step 05 returns a journal_action. revert_journal_entry undoes it later, from another process; the descriptor is stored on disk.

272 compilers, containerized

MSVC 1.0 through 11, Borland, Watcom, Delphi, MinGW, GCC, Clang, IDO, PSY-Q, MWCC, ProDG and more. The original compiler decides a match.

Stripped binaries

Scans and model work on the bytes as shipped. A miss is reported as a miss.

Waitlist

hosted · no install

Stop scoring it. Start proving it.

One email when the hosted workspace opens. Bring a stripped binary and a corpus; the engine behind this page already runs.

The waitlist is not open yet. It starts collecting at the first release announcement.