REA - Reverse Engineer Anything - rea-agents-6.9.0

REA, short for Reverse Engineer Anything, is an open-source toolkit that helps AI coding agents investigate how software works, even when its original source code is unavailable. Hosted on GitHub, the project connects agents to analysis tools for native binaries, JavaScript applications, Electron apps, and other software.

Rather than attempting to recover an application's exact original source code, REA collects evidence from decompilers, disassemblers, strings, symbols, function references, and other analysis techniques. An AI agent can use that evidence to explain a feature, document an implementation, or build a compatible alternative for another project.

REA provides a command-line interface (CLI), a Model Context Protocol (MCP) server, and guided workflows for compatible AI coding tools. It is particularly useful for developers who need to understand undocumented behavior, investigate legacy software, or reproduce a feature without access to its implementation.

Features

AI-Assisted Reverse Engineering

REA is designed to let developers investigate software by describing what they want to understand in natural language.

For example, you could ask an AI agent to investigate how an application's offline search works, trace the relevant functions, explain the evidence, and implement similar functionality in your own project.

REA supplies the investigation tools and findings, while the AI agent performs the reasoning and writes the new implementation. This division makes it easier to investigate unfamiliar software without manually navigating every analysis tool.

The workflow generally follows three stages: decompile or inspect the target, trace the relevant behavior through the available evidence, and recreate the desired functionality in a separate implementation.

Native Binary Analysis

REA connects AI agents to tools that inspect compiled native applications. Depending on the configured analysis provider, developers can examine functions, strings, symbols, assembly instructions, pseudocode, references, and call relationships.

These capabilities help investigate how a binary implements a particular feature or interacts with other components.

For native analysis, REA supports integration with Hopper and Ghidra. The project also documents IDA-related support in its broader development direction, although provider availability and individual capabilities depend on the installed version and platform.

Hopper is a separate product with its own licensing requirements. Ghidra must be installed independently and configured before REA can use it.

Importantly, decompilation produces an approximation of the original program logic, not the original source code with all its comments, names, and design decisions intact.

JavaScript and Electron Application Inspection

REA can analyze JavaScript applications and Electron packages without executing the target application.

It can inspect application directories and ASAR archives to identify modules, imports, dependencies, and relationships between components. This is useful for understanding how a desktop application's frontend communicates with its underlying services.

For example, developers can investigate how an Electron application handles authentication, storage, updates, or networking by examining the available code and tracing the relevant modules.

Static analysis is especially convenient because it does not require a native decompiler for supported JavaScript targets. It also reduces the risks associated with running unfamiliar applications during an initial investigation.

Command-Line Interface

REA provides a CLI for running analysis tasks directly from a terminal or through automation scripts.

Install the command-line package globally with npm:

npm install --global rea-agents

Then start the guided setup:

rea setup

To check the environment and configured analysis tools:

rea doctor --json

For a JavaScript application or Electron package, you can run an analysis directly:

npx -y rea-agents@latest analyze-javascript-application \
  /absolute/path/to/app --json

The JSON output makes it easier to process analysis results programmatically or pass structured findings to another tool.

Native binary analysis requires an appropriate provider to be installed and configured. The CLI therefore serves as a common entry point rather than replacing the underlying analysis engines.

MCP Integration for AI Coding Agents

One of REA's strongest features is its MCP server, which exposes analysis operations to compatible AI assistants.

The setup utility can configure supported clients, including Claude Code, Claude Desktop, Codex, Cursor, Gemini CLI, and Windsurf. Additional clients can connect through manual MCP configuration if they support local MCP servers.

After setup, an agent can call REA's tools to inspect a target, search for strings, examine functions, trace references, and collect evidence without requiring the user to execute each analysis command manually.

This integration is valuable for AI-assisted software development because it allows reverse engineering to become part of the same workflow used to modify and test code.

Guided Workflows and Evidence-Based Results

REA provides structured investigation workflows intended to guide an agent from an initial question toward a supported explanation.

Instead of returning only a conclusion, the tools can provide evidence and identify unresolved questions or limitations. Developers can then distinguish observed behavior from assumptions that require further testing.

The project also supports reusable analysis results and snapshots in relevant workflows, reducing the need to repeat expensive analysis operations unnecessarily.

This evidence-oriented approach is particularly useful when examining unfamiliar or poorly documented software, where an unsupported conclusion could lead to an incorrect implementation.

Local Analysis and Privacy

REA is designed to analyze target applications locally rather than uploading them to a hosted REA analysis service.

This is beneficial when investigating internal tools, proprietary software, or applications that cannot easily be shared with an external service.

However, the privacy boundary also depends on the AI agent and model provider being used. Analysis results returned to an agent may be sent to its configured model service, so developers should review that provider's data-handling policy before investigating confidential software.

Guided Installation and Diagnostics

REA includes a setup utility that configures the CLI, MCP server, and matching agent instructions. It can connect existing analysis tools and offer to install Hopper when needed.

The setup process presents proposed changes for review and approval and backs up existing agent configuration before applying changes.

Its diagnostic command checks dependencies, host compatibility, analysis tools, and agent configuration:

npx -y rea-agents@latest doctor

This helps developers identify missing dependencies or configuration problems before attempting a more involved investigation.

Performance and Compatibility

REA is distributed as a Node.js application and supports the command line and local MCP workflows. Its documented runtime requirements include Node.js 22.19 or newer in the 22.x line, Node.js 24.11 or newer in the 24.x line, or Node.js 26 and later.

Native analysis depends on the configured provider and supported host environment. The project documents support for macOS and selected Linux distributions, while Windows support varies by analysis provider and workflow.

Static JavaScript and Electron analysis has fewer dependencies because it does not require a native analysis engine. This makes it a convenient starting point for developers who want to try REA without installing a separate disassembler.

Actual analysis speed depends on the target application's size, the chosen provider, and the complexity of the behavior being investigated. Large native binaries may require more time and resources than a small JavaScript application.

REA is an analysis framework rather than a universal decompiler. Its capabilities depend on the tools available for the target platform, and the accuracy of conclusions depends on the evidence that can be recovered. It cannot guarantee recovery of original source code or perfectly reproduce every behavior of an application.

System Requirements

  • Runtime: Node.js 22.19 or newer in the 22.x line, 24.11 or newer in the 24.x line, or 26 and later.

  • Package manager: npm.

  • Operating systems: Supported macOS and Linux environments, with Windows support depending on the selected workflow and provider.

  • Native analysis: Hopper or Ghidra for the corresponding supported workflows.

  • AI integration: An MCP-compatible agent for interactive, agent-driven investigations.

  • JavaScript analysis: A local application directory or ASAR archive; no native decompiler is required for this workflow.

Ghidra integration has additional requirements, including a compatible Ghidra installation and Java Development Kit. Consult the current installation documentation for exact versions and platform-specific instructions.

Pros and Cons

Pros

  • Free and open-source under the MIT license.

  • Connects AI coding agents to reverse engineering tools through MCP.

  • Supports native binary investigation using decompilation and disassembly.

  • Analyzes JavaScript applications and Electron archives without executing them.

  • Provides CLI access for scripting and automation.

  • Collects evidence to support explanations of application behavior.

  • Offers structured workflows for investigating and recreating software features.

  • Designed for local analysis without a hosted REA analysis service.

  • Guided setup and diagnostic tools simplify configuration.

  • Can help developers understand legacy software and undocumented implementations.

Cons

  • Native analysis depends on external tools such as Hopper or Ghidra.

  • Some analysis providers have platform-specific limitations.

  • Decompilation cannot reliably recover the original source code.

  • Investigation quality depends on the available evidence and analysis engine.

  • Requires an AI agent for the full natural-language investigation workflow.

  • Additional setup may be necessary for native binaries.

  • Model-provider privacy policies still matter when sending analysis results to an AI service.

  • Reverse engineering complex applications can require substantial technical knowledge and time.

Download REA - Reverse Engineer Anything - rea-agents-6.9.0 - Software Mirrors

REA - Reverse Engineer Anything - rea-agents-6.9.0 Source Code

REA - Reverse Engineer Anything - rea-agents-6.9.0 Source code (zip)

REA - Reverse Engineer Anything - rea-agents-6.9.0 Source code (tar.gz)

REA - Reverse Engineer Anything - rea-agents-6.9.0 Release Notes:

6.9.0 (2026-11-11)

Highlights

  • Build and test desktop tasks from recorded application state, including downloaded Linux apps, reusable build computers and multiple tasks per capture.
  • Inspect more shipped artifacts offline: standalone application bundles, embedded firmware, NTFS acquisitions, API contracts and V8 code-cache containers.
  • Keep native and runtime investigations grounded in retained Evidence, with paged results, explicit coverage and recoverable resource limits.

Changes

  • Analyze targets and create private runtimes on fixed local ReFS volumes as well as NTFS, preserving persistent ACL, file identity, snapshot and cleanup checks. #10086. Thanks @QianNangong.
  • Capture, export and witness desktop tasks inside a build computer; keep an agentenv computer available through MCP and prepare a build host from one command. #8954, #9041, #9045, #9049, #9199. Thanks @earakely-scale.
  • Install desktop apps from SHA-256-pinned AppImages or upstream archives, retain selected package dependencies, and isolate explicitly declared build secrets. #9215, #9112, #9225. Thanks @earakely-scale.
  • Choose seed/end checkpoints, open seed documents at launch, build several tasks from one capture, and evaluate unreadable app state through headless checks or a screen judge. #9037, #9054, #9216, #9217, issue morluto/rea#9676. Thanks @earakely-scale.
  • Read gzip and XML desktop documents and draft assertions for nested fields, attribute text, child text and member counts. #9050, #9111, #9114, #9132, #9185. Thanks @earakely-scale.
  • Read UnityFS bundles, Godot 3 PCK archives, WeChat mini-program packages, Zstandard ZIP members and classic iNES regions. #7699, #7781, #8148, #7780, #2816. Thanks @blankym, @gensokyo-dev, @ShuaixinHuang, @XiaoBinGan, @Zhong-fan.
  • Inspect and extract Intel HEX, Motorola S-record, U-Boot uImage/FIT, ESP flash, UF2 and DfuSe firmware regions while retaining their container declarations. #7136, #7234, #7771, #7498, #8228, #8230. Thanks @555aaditya, @Entrpi, @gensokyo-dev, @iamcipherdev.
  • Inventory offline NTFS MFT records and paired USN journal acquisitions; retain source names, journal-version coverage and verified extension-attribute ownership. #9911, #9914, #9957, #10006, issue morluto/rea#9867. Thanks @2SinceJuly, @gensokyo-dev, @jayykernel, @N0zoM1z0.
  • Inspect V8 code-cache headers and retained byte patterns without executing the cache; report Electron cachedData boundaries and custom URL protocol registrations. #8993, #9501, #2978. Thanks @2SinceJuly, @gensokyo-dev, @UnknownHacker1, @XiaoBinGan.
  • Inventory local OpenAPI operations and GraphQL SDL fields/references; compare static JavaScript endpoints with HAR observations. #9104, #9140, #9090, issue morluto/rea#3591. Thanks @gensokyo-dev, @Y0UW1SH.
  • Import saved Playwright v10 trace Evidence, page scenario summaries, reuse saved response values across steps, and validate browser scenarios offline. #9127, #7120, #7267, #7343, issue morluto/rea#5488, issue morluto/rea#6167. Thanks @debavelaerel, @earakely-scale, @gensokyo-dev, @jayykernel, @kaoru0822-kitauji, @z2Ace0107.
  • Replay captured environment writes, including variable member sets, sorted creates, references, toggles and subsequent reads that explain the resulting state. #7260, #7274, #7332, #7539, #7600. Thanks @earakely-scale.
  • Expose managed field defaults, project retained member views, suggest Unity managed members and retain IL2CPP v108 header/string Evidence. #8015, #7968, #5511, #9925, issue morluto/rea#7282. Thanks @379061296, @8rulerstar, @dhruvac29, @Entrpi, @gensokyo-dev, @Henglie, @kaoru0822-kitauji, @ShuaixinHuang, @XiaoBinGan, @xu91102.
  • Report ELF/PE/Mach-O hardening, per-slice Mach-O encryption, initializer/finalizer functions and ELF function ranges recovered from unwind tables. #8524, #5359, #9574, #9585, issue morluto/rea#4306. Thanks @chordpli, @coygeek, @gensokyo-dev, @mvanhorn.
  • Read Linux core-dump process/mapping notes, kernel version/configuration data and Android ELF identity notes; join Apple IPS images to admitted Mach-O slices. #8830, #9573, #9502, #9570. Thanks @2SinceJuly, @mvanhorn, @rishikeshgowdakk, @saariuslystoned.
  • Open native extension/framework/XPC/plugin bundles, retain LLDB source coordinates and recover bounded Go string literals from pointer/length headers. #8117, #2800, #9206. Thanks @kaoru0822-kitauji, @matbrgz, @saariuslystoned.
  • Reuse Ghidra projects through verified copies and checkpoint owned Programs across sessions; add Windows P0 DOS MZ and RISC-V ilp32 admission. #7236, #9236, #7144, #8229, issue morluto/rea#1048. Thanks @akushonkamen, @corysutyak, @dark13b, @Entrpi, @gensokyo-dev.
  • Retry failed Kuna or directory decompiles independently and preserve stored pointer references and decompile-export source facts. #8793, #8811, #8851, #8805.
  • Ship self-contained Claude Code/Codex plugin installs and a Cursor Marketplace plugin; add CodeBuddy and LM Studio setup registration. #7514, #9878, #2492, #8611, issue morluto/rea#2490. Thanks @cainiao1992, @cpruijsen, @GamerDubz, @gensokyo-dev.
  • Inspect Windows Shell Link files and qualify recognized Python 3.14/3.15 pyc headers; choose Rizin decoder and map address for one-shot commands. #7859, #8927, #8991, issue morluto/rea#8206. Thanks @Entrpi, @mvanhorn, @XiaoBinGan, @xuanhieu.

Fixes

  • Keep UnityFS directory and payload reads within the declared bundle, reject undersized declarations, and prevent appended bytes from replacing the inventory or increasing its work budget. 58a0511660.
  • Validate runtime configuration before doctor reports readiness or registration writes files; preserve the source of malformed stored settings and proposed overrides. #10102.
  • Retry owned inspection descriptors before fresh process queries, preserve physical failures alongside cancellation, and retain cleanup authority until release succeeds. #10113, #10141, #10109.
  • Keep distinct linker-map occurrences when source-map declarations overlap, including path spellings that normalize to the same location. aa017c61ff, f668c86271.
  • Preserve remote OpenCode registrations and Hermes YAML anchor consumers instead of treating REA-like text as proof of local ownership. #5152, issue morluto/rea#3325. Thanks @coygeek, @gensokyo-dev, @xu91102.
  • Reject malformed UTF-8 CDP discovery replies, preserve partial Playwright-import Evidence, and retain initial child scope when replaying WebMCP scripts. #4524, #9543. Thanks @Afloat16, @Plastic-time.
  • Report unsupported filesystem paths and host-capacity failures at the responsible adb input boundary; retain local filesystem error provenance. #6188. Thanks @chordpli.
  • Resolve relative ESM backslash paths and exported/computed initializers; reject TLS versions and child-process literals Node itself refuses. #4323, #5387, #9557, #9594, issue morluto/rea#4269. Thanks @6eanut, @ahmed-husssain, @coygeek, @XiaoBinGan.
  • Retain actionable debugger/provider failures: reconnect stale JEB MCP sessions, preserve GDB inferior-TTY checks, and report invalid IDA regex syntax. #3754, #5539, #9544, issue morluto/rea#5099. Thanks @akushonkamen, @coygeek, @flitzrrr, @Plastic-time.
  • Preserve admitted EVM and pwntools replies and completed SQLite member facts through acquisition/finalization failures. d77cf61, e813c4c, 669e617.
  • Scope Hopper recovery to the caller lifetime and preserve Mach-O host-slice, Godot digest, browser-resource and selected-slice distinctions. #9905, #10016.
  • Retain partial OpenAPI Evidence, reject unrepresentable adb activity arguments, and preserve worker, Frida and owned-command failure/cancellation facts through cleanup. #9908, #9918, #10055, #9963, #9964.
  • Decode escaped HAR, qlog and Playwright JSON strings without retaining the fragmented strings that inflated decoder heap usage. #10139, issue morluto/rea#10132. Thanks @fcumaoglu, @mecrimino.
  • Preserve physical web-worker launch failures as the primary error when cancellation overlaps; retain cancellation separately from the exact launcher observation. #10145.
  • Classify adb wireless-debugging mDNS serials as TCP while preserving USB precedence and unknown device kind. #10134. Thanks @rudycelekli.
  • Normalize lipo’s i386 CPU spelling before Mach-O slice selection and recognize the __chk_fail FORTIFY handler import. #10136, #10036, issue morluto/rea#10025. Thanks @2SinceJuly, @coygeek, @rudycelekli.
  • Retain process CLI cleanup owners until delivery, preserve known local retry leases alongside unknown prior cleanup, and align lifecycle boundaries with tagged cancellation facts. #10147. Thanks @wunianze666-netizen.
  • Count only syntactically valid CSP nonce/hash sources when reporting browser policy. #10135. Thanks @rudycelekli.
  • Reject ELF tables inside the declared header and unmatched NT_FILE mapping pathnames; keep PE imports within their declared directory bounds. #10133, #10138, #10044. Thanks @rudycelekli, @ShuaixinHuang, @wunianze666-netizen.
  • Classify private nested Swift types by their own kind rather than their enclosing declaration. #10085, issue morluto/rea#7501. Thanks @BeqaKs, @Rinkia.

⚠ BREAKING CHANGES

  • Settings clients must replace effect, rea_restart_required, restart_required and restartRequired with update_mode (runtime, restart, parameter) and pending_restart. Parameter-supplied limits cannot be changed by the runtime setter; restart-mode values retain their startup value until restart. #9885, be20bdfb26f7, aee1178839dd. Thanks @gensokyo-dev, @N0zoM1z0.
  • Process and desktop callers must inspect details.secondary_failures/secondaryFailures: mixed batches keep physical/provider failures primary and retain typed cancellation with its original cause. Retained descriptors can produce cleanup_incomplete; follow the returned recovery instead of treating it as ordinary cancellation. Custom adapters must consume owner-issued inspection/sampling facts and retain their cleanup scopes until release succeeds. #10141, #10113, #10109.
  • rea mcp add --command now accepts a local stdio launcher only: HTTP(S) executable URLs are rejected before settings writes, and package acquisition is removed. Configure remote transports in each client’s native settings and install/select the local launcher before registration. #10102.
  • Runtime-instance graph identities now require identity.capture_evidence_id in addition to the capture digest and runtime key. Node IDs digest that identity, so regenerate reconciliation Evidence and rebuild node-keyed lookups even when the digest and runtime key are unchanged. #10063.
  • Retained process symlinks require their stored target bytes; recapture legacy observations that only described a link without retaining its target. #10082.
  • Function dossiers must record Swift literal inventory and its omissions together. Regenerate one-sided observations through a canonical provider; both-absent unsupported observations remain valid. #10068.
  • Conformance manifest schema v2 separates exact string markers from fragments and rejects the old ambiguous strings field. Regenerate unversioned fixtures with npm run build:fixtures. #9977.
  • Desktop witnessing requires the current generated verifier: re-export old bundles using their original Evidence/task inputs. Pre-6.9 captures missing required state.baseline_non_files are rejected before state inspection, drafting or export; capture the application again to obtain contemporaneous SQLite member facts. #9898, #9470.
  • Selected SQLite rows require row_offset and next_row_offset; rows.order is rowid, primary_key or unspecified. A null next offset means either no continuation or no stated order: an unordered sample can still have truncated: true. Inspect both order and truncated before concluding the sample is complete. #9331, issue morluto/rea#8234. Thanks @2SinceJuly, @555aaditya.
  • Windows entropy Evidence now uses the admitted filesystem path spelling, so fresh analysis of a differently cased caller path can change evidence_id. Invalidate or re-key cached associations against the fresh Evidence, retaining old IDs only for their original observations. #9393. Thanks @HusnainMaroof.
  • caller_input_paths values may be ordered arrays of strings as well as strings. Update strict consumers to preserve repeated selections. #9626, #9624.
  • observe_javascript_runtime adds required execution_context_id fields to scripts and contexts. context_key is an opaque capture-local lifetime identity, not a reusable protocol ID, and Evidence identities change. Refresh schemas and recapture when new lifetime associations are needed. #9471, issue morluto/rea#3382. Thanks @coygeek.
  • Refresh cached inspect_address_context schemas: unavailable facets may carry typed input or resource-constraint errors while successful sibling facets remain available. #8444, #8424, #8419.
  • analyze_function/trace_native_values require native_value_flow.limitations on available and unavailable variants. Ghidra memory effects cover explicit high-p-code LOAD/STORE operations only; empty effects do not prove no memory access. The value_flow_effect_scope profile commitment invalidates older snapshots: retain embedded historical Evidence, reopen without the snapshot and save a fresh one. #8651.
  • compare_functions adds function_match.method: "same-evidence" when both inputs authenticate to one Evidence ID and entry comparison is unavailable. Accept the new matched variant, retain unknown dimensions and do not infer complete equivalence; one observation cannot have contradictory changed dimensions or hashes. #8442, issue morluto/rea#8367.
  • Kuna analyze_function can return native_value_flow: {available: false, reason, limitations} instead of null. Check available and preserve the provider reason; null means procedure-scoped unrecorded unknown, not confirmed absence. The workflow-profile digest changes: older trace Evidence remains history but must be rerun to satisfy current replay. #8785, issue morluto/rea#8783.
  • The opt-in hot/cold MCP catalog no longer preloads inspect_analysis_view. Discover it before use or batch it with its producer; the default full catalog remains available. #9151. Thanks @gensokyo-dev.
  • import_evidence_bundle/CLI evidence-import now reject snapshot-shaped JSON with invalid_request instead of evidence_integrity_mismatch. Restore it with open_binary.snapshot_path or a compatible CLI --snapshot; bundle imports require a canonical bundle from export_evidence_bundle. #8867.
  • REA-launched Chromium keeps its sandbox. If launch fails on root/container hosts, first enable host sandbox support, such as a suitable non-root user or namespace/setuid facilities. The explicit REA_BROWSER_NO_SANDBOX=true fallback disables Chromium’s sandbox and does not establish an REA isolation boundary. #8738, issue morluto/rea#8722. Thanks @chordpli, @hkeysai.
  • Fresh objdump Evidence changes provider identity from gnu.objdump/GNU objdump to {id: "objdump.command", name: "objdump command", version: null}; launch errors use the same ID and architecture-list subjects may be null. Update provider-keyed caches/readers and retain the selected executable parameters without assuming GNU semantics; historical Evidence stays readable. #8824, issue morluto/rea#8823.
  • Kuna verification policy is separate from analysis identity. Earlier snapshots and resumable directory exports are incompatible even with the same executable. Preserve old files, reopen without the snapshot and save a fresh one or choose a new export directory; the Kuna guide explains extracting/importing embedded Evidence as history. #8699.
  • inspect_analysis_view rejects mismatched native parent predicates with invalid_request at source.predicate_type: function/inventory/observation views require rea.analysis, and matching views require rea.native-function-matching. Select the original correctly typed Evidence or rerun its producer; patching an existing predicate invalidates its identity. #8451.
  • close_binary retains investigation records; use reset_investigation to clear them. Cross-process recovery requires an explicitly acknowledged Evidence-bundle checkpoint. #8361, issue morluto/rea#8347. Thanks @gensokyo-dev.
  • compare_functions adds the matched function_match.method: "same-entry" variant with required entry_address when authenticated artifact, architecture, mapping, slice and entry commitments agree despite a rename. Refresh schemas and keep name/identity changes separate from entry correspondence. #8263, issue morluto/rea#8213. Thanks @gensokyo-dev.
  • inspect_native_load_image NativeAOT metadata_recovery uses a status-discriminated union: complete reports require reason: null; partial/not-applicable reports carry {code, ...} instead of prose reasons. Branch on codes and their fields while preserving historical/optional-extension strings. Invalid budgets now produce typed input/resource errors. #8053.
  • trace_javascript_semantics adds influences edges and moves direct literal-argument seeds from call-site to expression nodes. Relevant unknown dependencies can change found to partial: handle that status and inspect unknowns. Reanalyze retained application graphs to obtain the new edges; old graphs stay readable. #7939, issue morluto/rea#7500. Thanks @Rinkia.
  • inspect_managed_members changes signature_resolution from type-names-v1 to type-names-v2 and appends readable names to signature operands, such as class:4 (Fixture.Program). Branch on the resolution version, accept annotated v2 strings and preserve historical v1/null displays. Signature digests are unchanged; InternalCall methods remain runtime-provided boundaries. #5309, #9547, issue morluto/rea#5149. Thanks @elricfd, @gensokyo-dev, @ln-bodicherla, @Plastic-time.
  • MCP calls default to 1,024 combined array elements/object members; excess input is rejected before dispatch with nonretryable resource_constraint, resource: "transport" and reported_limits.max_input_elements. For larger inline calls, set REA_MCP_MAX_INPUT_ELEMENTS to a digit-only positive decimal safe integer (1–9007199254740991) and restart, or select retained/file inputs. Fractional/exponent spellings are invalid; inputs are never truncated. #7905, issue morluto/rea#7882. Thanks @gensokyo-dev.
  • inspect_macho text names/paths can be null for non-UTF-8 bytes, with name_bytes_hex, segment_bytes_hex and path_bytes_hex alternatives; unsafe numeric sizes/offsets/alignments can be null with exact companion fields, and delayed-init options are numeric. Refresh schemas and preserve these facts; absent byte fields in older Evidence remain unrecorded. #7952, issue morluto/rea#7391. Thanks @coygeek.
  • Environment file-source errors move from the generic evidence issue path to capture for environment-build and source.path for environment bundle build/export. Missing/non-file/invalid UTF-8/JSON sources return invalid_request with invalid_value/invalid_format issues and inspect_input_contract recovery; repair the selected file. #7900, issue morluto/rea#7523. Thanks @coygeek.
  • Selected unpaired UTF-16 surrogates now make TOON, Markdown, CSV and TSV output fail with invalid_request and a nonzero exit even after a successful operation; Markdown also refuses NUL. Use --format json or --format yaml to preserve these values rather than accepting substituted text. #7852, issue morluto/rea#7592, issue morluto/rea#7593. Thanks @coygeek.
  • Reconstruction evidence_bundle inputs reject authenticated standalone records as invalid_request with field-level issues instead of accepting/misclassifying them as damaged bundles. Bundle-file import/export/comparison reports invalid_request/invalid_input with details.reason: "wrong-kind". Supply a canonical bundle from export_evidence_bundle; tampered data remains an integrity failure. #7895, issue morluto/rea#7562. Thanks @coygeek.
  • Environment coverage can use method-replay for non-GET safe reads. Clock-generating write plans without a global clock anchor now return served: false, reason: "unknown-clock" instead of being served. Extend reason handling and recapture usable start times/completed durations before replaying those writes. #7834, 63220edcc3b4, issue morluto/rea#7387. Thanks @coygeek.
  • Ghidra returns not-in-listing for in-memory addresses lacking listed instructions or defined data, replacing the former undecodable interpretation. Accept the new status and recreate snapshots after the raw-profile change; retain old embedded Evidence as history. #7823, issue morluto/rea#7490. Thanks @Entrpi.
  • capture_process_scenario/CLI process capture rejects columns: 1 before target launch; update both initial terminal widths and every resize to at least 2. Sensitive interaction data is empty with sensitive/input_bytes, and raw echoes are redacted. Recapture both sides before comparing older private-input Evidence. #7848, #7804, issue morluto/rea#7582, issue morluto/rea#7782. Thanks @coygeek, @gensokyo-dev.
  • Managed setup registrations bind the selected absolute runtime and REA entry script, including package-runner cache paths. Keep that installation available; unknown registrations need confirmed manual repair. Setup no longer returns prewarm or emits its progress events. c77735fa83a6. Thanks @gensokyo-dev.
  • macOS Hopper launch paths/arguments reject double quotes, backslashes and line breaks before handoff. Select literal-safe prepared paths/loader arguments or a compatible provider. #7732, issue morluto/rea#7727. Thanks @gensokyo-dev.
  • New JavaScript application graphs omit the derived package renderer property. Use renderer_declarations for source fields and package-load edges for the selected candidate; historical Evidence remains readable. 5cf7133f823b.
  • Replace Cutter --json=true/false with --json-output=true/false; bare --json still selects CLI result formatting. Replace rea compare-bundles with rea compare; MCP compare_bundles is unchanged. 567ea4b1e8bb, 3515b262218f.
  • JEB engine refusals report execution_failure rather than unsupported_target; inspect retained upstream diagnostics for recovery. c4cdb7658b0e.
  • ASAR file occurrences may contain unpacked: false. Accept an optional boolean; absent historical fields remain unknown. 60834e391c3f.
  • Non-loopback MCP HTTP binds require MCP_ALLOWED_HOSTS or rea mcp --http --allowed-hosts. Bundle names must be unchanged HTTP hostnames within the 63-octet DNS-label limit. #7172. Thanks @DeryFerd, @gensokyo-dev.
  • binary_session {} is compact by default and omits provider availability diagnostics/remediation, target-support diagnostics/capabilities and tool-group surface/effects/annotations. Request {"detail":"complete"} for these facts and recovery guidance. #7127, issue morluto/rea#7109. Thanks @kaoru0822-kitauji.
  • Native input errors now include details.operation and field-level details.issues. Supply a nonempty trace_native_values.procedure; CLI trace-native-values rejects an empty procedure before opening the target as VALIDATION_ERROR with fieldErrors, while MCP reports invalid_request at procedure. #7889, issue morluto/rea#7572. Thanks @coygeek.
  • Readable JavaScript members that normalize to one logical path now stop analyze_javascript_application with artifact_operation_failed, details.reason: "path" and a partial inventory instead of selecting one occurrence. Inspect the inventory and analyze a copy without collisions; all-unavailable colliding sources remain unknown. #7864, issue morluto/rea#7626. Thanks @coygeek.
  • trace_web_module_imports with an empty/relative REA_BROWSER_EXECUTABLE now reports capability_unavailable with invalid_browser_executable instead of missing_browser_executable, retaining details.diagnostics.executable. Set an absolute Chromium path; an unset selection still means missing. #7903, issue morluto/rea#7639. Thanks @coygeek.
  • Unresolvable import-reference-source roots, capture scenario files and web-network capture/Protobuf descriptor paths (ELOOP/ENAMETOOLONG) now report invalid_request/invalid_input with responsible field/host-code issues rather than generic execution/unreadable-output failures. Repair the symlink chain or choose a shorter path. #7847, #7814, issue morluto/rea#7607, issue morluto/rea#7636. Thanks @Abelo9996, @coygeek.
  • close_binary with snapshot_path on a profileless/archive target now returns nonretryable capability_unavailable instead of evidence_integrity_mismatch, writes no snapshot and leaves the session open. Export needed Evidence, then close again without snapshot_path. #7837, issue morluto/rea#7311. Thanks @coygeek.
  • adb local-file refusals occur before device commands: missing/non-file/uninspectable local_path/apk_path and file-blocked output_directory return invalid_request with field issues/host codes; output-producing calls formerly used unreadable_output. Supply regular source files and a directory path whose parents are directories. #7885, issue morluto/rea#7549, issue morluto/rea#7550. Thanks @coygeek.
  • Evidence writes failing with EFBIG, ENOSPC or EDQUOT now report nonretryable resource_constraint, details.reason: "storage-limit", path and optional system_code instead of execution_failure/io. Raise file-size allowance or free space/quota before retrying; a failed staged-file cleanup remains cleanup_incomplete. #7887, issue morluto/rea#7573. Thanks @coygeek.
  • PE signers add optional nullable unsigned_attribute_oids: fresh null means absent, an OID array means present, and omission in old Evidence is unrecorded. Unsigned attributes produce coverage.status: "partial" because nested signatures/timestamp contents remain undecoded; accept the new field and limitations. #7920, issue morluto/rea#7767. Thanks @Rinkia.
  • Valid ASN.1 exceeding certificate nesting/OID allowances now returns nonretryable resource_constraint rather than invalid_request/invalid_input, with max_asn1_depth/max_oid_bytes. These format/resource bounds have no runtime override; retain the diagnostics and use an independently suitable parser when necessary. #9932.
  • trace_call_path/build_call_path require discovery and observed-result fields in search_scope. An exhausted observed graph can still yield goal_status: "unknown" when provider discovery is incomplete. Refresh result schemas and workflow-profile expectations instead of equating graph exhaustion with complete discovery. #8443.
  • inspect_native_instruction adds containing_instruction for not-instruction-boundary and containing_data for data, with address/extent/identity/provenance. Accept these facts; omission in old Evidence is unrecorded. The Ghidra profile changes: reopen and save a fresh snapshot. #8777.
  • trace_native_values adds required page_truncated and tagged traversal coverage. truncated combines page omission with traversal truncation; exactly filling a budget alone no longer proves truncation. Inspect page coverage before fetching another page and traversal reason before raising budgets. #8309, issue morluto/rea#8283. Thanks @kaoru0822-kitauji.
  • batch_decompile.addresses has a separate hard ceiling of 20,000 entries. Split larger batches into calls of at most that size; increasing the configurable MCP transport allowance cannot remove this operation limit. #5937, issue morluto/rea#5930. Thanks @dakjdakd.
  • close_binary can retire the target while retaining cleanup owners: cleanup_incomplete may have recovery.kind: "retry_cleanup" despite retryable: false. Keep the same connection open and call close_binary again without snapshot_path to retry owned cleanup. #8329, issue morluto/rea#8211. Thanks @kaoru0822-kitauji.
  • Unconfirmed cleanup in inspect_address_context, get_call_graph or trace_call_path now produces tool-level cleanup_incomplete rather than a successful partial result or cancellation. Keep admitted partial Evidence and follow the returned same-session cleanup recovery. #8417, #8516, issue morluto/rea#8369, issue morluto/rea#8416. Thanks @kaoru0822-kitauji.
  • inspect_ntfs_journal omits detailed mftMetadata.record_headers by default and leaves continuation at the first omitted record. Select mft_record_limit from 1 to 32 when those details are needed; inventory counts and explicit coverage remain inline. 1a8a9b749a. Thanks @gensokyo-dev, @N0zoM1z0.
Full contribution record: 1848 commits and 1073 merged PRs.

How to Install

The recommended approach is to install REA through its guided setup utility.

First, ensure that a supported Node.js runtime and npm are installed. Then run:

npx rea-agents@latest setup

Choose the AI agents you want to configure, review the proposed changes, and approve them. Setup configures the MCP connection and installs the corresponding workflow instructions.

Restart the configured AI client after setup so it can load the new MCP server.

To use REA as a regular command-line application, install it globally:

npm install --global rea-agents

Then verify the installation:

rea doctor --json

For native binary analysis, configure Hopper or an existing Ghidra installation according to the official documentation. Static JavaScript and Electron analysis can be used without installing either tool.

To update an existing installation, follow the update instructions for the installation method you used. If you use the npx workflow, refresh the agent configuration with:

npx rea-agents@latest setup

Review the proposed changes and restart the relevant client when its MCP registration changes.

Final Verdict

REA is a compelling open-source toolkit for developers who want to combine reverse engineering with AI-assisted software development. Its biggest advantage is the way it connects analysis tools, structured evidence, and MCP-compatible agents into a single investigation workflow.

Support for native binaries, JavaScript applications, and Electron packages gives it a broad range of uses, from understanding undocumented features to investigating legacy software and building compatible implementations. The CLI and evidence-oriented results also make it useful beyond interactive AI sessions.

Its main limitation is that REA depends on external analysis engines for many native workflows, and its capabilities vary by operating system and provider. It also cannot recover original source code automatically or guarantee that an implementation recreated from analysis will behave identically to the original.

For developers working with unfamiliar applications, REA is worth exploring, particularly if they already use an MCP-compatible coding agent. It is best viewed as a bridge between reverse engineering tools and AI development workflows rather than a replacement for established disassemblers or the expertise required to interpret their results.

REA - Reverse Engineer Anything - rea-agents-6.9.0
Free
Software Informations:
Developer:

Operating System:
All Platforms
Date Added:
2026-11-12T12:07:25.502Z
Categories:

Post a Comment/Report Broken Link: