The analysis engine for agents

Reverse engineering,
built for agents.

What a binary or firmware does, what's inside, what's wrong, what changed. 48 architectures decompiled, nothing executed. Made in Rust.

Works with
  • Claude Code
  • Cursor
  • Codex
  • Gemini CLI
  • VS Code
  • OpenCode
  • Claude Desktop

Engine. A decompiler stops at C. We keep going.

Disassemble72architectures disassembled
Decompile48architectures decompiled
Function names1.8Msignatures, matched on upload
FormatsMach-O, ELF, PE, UEFI, DEX, WASM, Java, Python, Lua bytecode
RuntimesGo, Rust, Swift, C++, .NET, Objective‑C, Dart, Nim
TypesDWARF, PDB, Objective‑C, Swift, C++, Go, .NET, DEX
Call graphPaths, reachability, god nodes
EmulateDecrypted strings, configs, unpacked payloads
StringsPlain, stack-built, decrypted
SimilarityNear variants across 370K binaries
BehavioursConnects out, hosts XPC, encrypts, loads code. Each with its sites.

Agents. Your agent, on the binary.

What the engine reads first.Byte map · syspolicyd · 2.5 MB · 4,111 functions
claudecursorCodexGemini CLI
Which XPC handlers in syspolicyd reach a privileged call without an entitlement check?
graph_attack_surface(094e625d…)
41 XPC receivers · 4 reach IOConnectCallMethod with no entitlement check.
All four on ExecManagerService. Fifth handler gated by valueForEntitlement:.
decompile_function(-[ExecManagerService isBlockedSoftware:withReply:])
dispatch_async(self->_completionQueue, ^sub_10003c5a2)
Handler body is the block. Reading sub_10003c5a2.
annotate_function(0x10003c5a2, "isBlockedSoftware_handler")
Written. Visible to the team on this binary.
Four handlers, all on ExecManagerService, reach IOConnectCallMethod with no entitlement check. canInstallPackage:…, isBlockedSoftware:, showGatekeeperPreflightError:…, urlHasGatekeeperException:.
Benchmark

Decompile. 78x faster than Ghidra.

Every function of syspolicyd decompiled, 4,174 of them, on one Mac. Default settings for every tool, median of three runs. Binary Ninja 20x, radare2 19x.

openbinary78x
Binary Ninja20x
radare219x
Ghidra1x

Read it. Disassembly in, decompiled pseudocode out. One method from airportd.

Open the function
FIG.5 DISASSEMBLY → DECOMPILED PSEUDOCODE · -[CWFaceTimeMonitor invalidate] · AIRPORTD · X86_64
-[CWFaceTimeMonitor invalidate]airportd · x86_64 · 0x100096b77 · 91 bytes
Disassembly
10x100096b77 push rbp
20x100096b78 mov rbp,rsp
30x100096b7b push r15
40x100096b7d push r14
50x100096b7f push rbx
60x100096b80 push rax
70x100096b81 mov rbx,rdi
80x100096b84 mov rsi,[0x10016efd8]
90x100096b8b mov r15,[0x10014f388]
100x100096b92 xor edx,edx
110x100096b94 call r15
120x100096b97 mov r14,[rbx+8]
130x100096b9b mov rsi,[0x10016f0e8]
140x100096ba2 mov rdi,rbx
150x100096ba5 call r15 // selector interfaceName
160x100096ba8 mov rsi,[0x100171a88]
170x100096baf mov rdi,r14
180x100096bb2 mov rdx,rax
190x100096bb5 call r15
200x100096bb8 mov rdi,[rbx+8]
210x100096bbc mov rsi,[0x100171a90]
220x100096bc3 mov rax,r15
230x100096bc6 add rsp,8
240x100096bca pop rbx
250x100096bcb pop r14
260x100096bcd pop r15
270x100096bcf pop rbp
280x100096bd0 jmp rax
Decompiled pseudocode
1id -[CWFaceTimeMonitor invalidate](CWFaceTimeMonitor * self)
2{
3 id result;
4 uint64_t v1;
5
6 objc_msgSend(/* args unrecovered */);
7 v1 = self->_registration;
8 result = objc_msgSend(self, "interfaceName");
9 objc_msgSend(v1, "removeNetworkAgentFromInterfaceNamed:", result);
10 result = objc_msgSend(self->_registration, "unregisterNetworkAgent");
11 return result;
12}

Teams. Names, comments and labels live on the binary.

Annotations

Rename, retype or comment a function at its address. The next reader sees your name, not sub_10003f606.

sub_10003f606gatekeeper_policy_check
16 v6 = 1;
17 if (a1->field_30 == 2) {
18 result = objc_msgSend(*(uint64_t *)(a1->field_20 + 72), "getCurrentGatekeeperPolicy");
19 v7 = (result == 2) ? 1 : 0; // which policy value is 2?
20 v8 = objc_msgSend(*(uint64_t *)(a1->field_20 + 80), "getLastAllowAnywhere");
21 result = v8;
22 v9 = objc_msgSend(result, "isWithinTimeIntervalBeforeNow:");
23 v10 = (v9 != 0) ? 1 : 0;

Activity

Every change on a binary, newest first: a state moved, a note with a mention, a rename, an analysis finished.

ID
Ida23m
Line 18, is that the Gatekeeper policy read?
NO
Noah15m
Yes, getCurrentGatekeeperPolicy over objc_msgSend. Renamed the function.
ID
Ida2m
Flagged for review.
Reply

Triage

New, in review, cleared or flagged, with owner and labels. Private to your workspace, on public binaries too.

Flagged
Change status…
New
In review
Cleared
Flagged

Inbox

Assigned to you, mentioned, an upload finished or failed, a change on something you follow. Your own changes never land.

Contacts.app.zipUploading99%
syspolicydNoah mentioned you · line 18
15m
openwrt-24.10.2Analysed · 161 binaries
2h
AppsIda assigned you
1h

Team files

One inventory per team. Private uploads stay with the team, public ones join the corpus.

FilesAllTeam
Contacts2.7 MB
Apps98.5 KB
syspolicyd2.6 MB
airportd4.1 MB

Questions. The five people ask first.

  1. 01

    Is it Ghidra underneath?

    No. Decoders, lifters, decompiler and emulator are ours, written in Rust since April 2026. Nothing from Ghidra, IDA or Binary Ninja runs anywhere in the pipeline.

  2. 02

    Does it run my binary?

    No. Everything on the report comes from the bytes. The emulator runs the binary's own code over the analysis IL under step, memory and wall-clock limits, never on a host.

  3. 03

    Who can see what I upload?

    Anonymous and free uploads are public and join the corpus. Uploads with a workspace key stay private to that workspace.

  4. 04

    What happens when the engine cannot lift something?

    It says so. A function with unknown instructions is marked, a value the decompiler cannot recover is commented in the C, and a value the emulator cannot prove stays unknown rather than guessed.

  5. 05

    Which editors does the agent setup cover?

    Claude Code, Codex, Cursor, Gemini CLI, VS Code and OpenCode, with one command. Claude Desktop gets the snippet to paste.

Drop a binary.

Mach-O, ELF, PE, DEX, WASM, firmware, container and archive images. Up to 2 GB. The report is public unless you sign in.

Set up an agent