For the complete documentation index, see llms.txt. This page is also available as Markdown.

Solving a multi-binary challenge with IDA MCP

This brief tutorial demonstrates the capability of the Hex-Rays IDA MCP Server in action, especially the multi-binary coordination.

To demonstrate the IDA MCP, we prepared a simple challenge that involves multiple files called ParcelDesk. The idea of the challenge is that you need to enter a parcel identifier and the corresponding collection code to open the door. In our case, we need to obtain the collection code for parcel ZX-4815.

If you're new to IDA MCP, see the Overview and Getting Started first.

Prerequisites

1. Get started and extract the files

To get started, extract the challenge files into a new folder and open a coding agent there (we used Claude Code with Sonnet 5 for this demonstration). Then ask with an example prompt:

Can you obtain the collection code for parcel ZX-4815 in ParcelDesk.exe?

2. Review the agent's findings

The agent will work for a few minutes, independently calling open_database and execute_python on the relevant binaries. It should come back with an answer like this:

Collection code for parcel ZX-4815: NORTH-7F29

How it was derived (small crackme in /tmp/parcel-desk):

  1. ParcelDesk.exe hashes the parcel ID with DeriveRouteSeed (route_math.dll) — an FNV-1a-style hash over the UTF-16LE bytes, then rol(x^0x6D3A91E7, 7) + 0x13579BDF → seed 0x894a8a98 for "ZX-4815".

  2. Since the parcel ID doesn't start with OLD-, it loads manifest_codec.dll and reads its embedded RCDATA resource (ID 201/0xC9), a 46-byte encrypted blob.

  3. DecodeManifest XORs that blob with an xorshift32 keystream seeded by seed ^ 0xC0DEC0DE (plus an incrementing counter starting at 71, step 29).

  4. Decoding yields the plaintext manifest: PDM1|parcel=ZX-4815|locker=17|code=NORTH-7F29|.

  5. Verified live against the actual binary via Wine — it printed ACCESS GRANTED.

In this scenario, none of the binaries have been opened in the IDA GUI, but this makes no difference from the agent's perspective. Calling open_database on a file that is already open in IDA will reuse that instance instead of spawning a headless idalib worker.

What's next?

See Multiplexing to understand how it made this multi-binary coordination possible.

Last updated

Was this helpful?