Any binary,
read.

Pseudocode, names and behaviour, in seconds per file. The program never runs on a host.

48Instruction sets decompiled
1.84MFunction signatures

Source is a claim.
The binary is what ships.

Machine code, names stripped, types gone, one of dozens of instruction sets. Reading it took a desktop suite, a specialist and days per file. Most binaries are never read.

openbinary reads it by itself, in seconds. Each instruction set is translated into one common form first. Out come named functions, pseudocode and what it does on the system and the network.

The decompiler. Side by side with Ghidra.

-[SPSamplingTasking encodeWithCoder:] · SYSPOLICYD · 0x1000025cfPICKED BY RULE · FROM THE PUBLISHED BENCHMARK
OPENBINARY 26.10.8
struct self_s { uint64_t field_8; … field_28; };
void -[SPSamplingTasking encodeWithCoder:](struct self_s * self, id a1)
{
uint64_t r12_1;
uint64_t r13_1;
uint64_t r14_1;
uint64_t rax_7;
r12_1 = self->uuid;
r14_1 = *(uint64_t *)0x1001204e8;
(*(uint64_t *)0x1000fef68)(a1);
r13_1 = *(uint64_t *)0x1000fef20;
(r13_1)(a1, r14_1, r12_1, 0x1001037c8);
(r13_1)(a1, r14_1, self->name, 0x1001037e8);
(r13_1)(a1, r14_1, self->expiration, 0x100103808);
(r13_1)(a1, r14_1, self->samplingRate, 0x100103828);
(r13_1)(a1, r14_1, self->publicKey, 0x100103848);
rax_7 = (*(uint64_t *)0x1000fef60)(a1);
return;
}
GHIDRA 12.1.4
/* Function Stack Size: 0x18 bytes */
void SPSamplingTasking::encodeWithCoder_(ID param_1,SEL param_2,ID param_3)
{
undefined8 uVar1;
undefined *puVar2;
undefined *puVar3;
puVar3 = PTR_s_encodeObject_forKey__1001204e8;
uVar1 = *(undefined8 *)(param_1 + 8);
(*(code *)PTR__objc_retain_1000fef68)(param_3);
puVar2 = PTR__objc_msgSend_1000fef20;
(*(code *)PTR__objc_msgSend_1000fef20)(param_3,puVar3,uVar1,&cf__uuid);
(*(code *)puVar2)(param_3,puVar3,*(undefined8 *)(param_1 + 0x10),&cf__name);
(*(code *)puVar2)(param_3,puVar3,*(undefined8 *)(param_1 + 0x18),&cf__expiration);
(*(code *)puVar2)(param_3,puVar3,*(undefined8 *)(param_1 + 0x20),&cf__samplingRate);
(*(code *)puVar2)(param_3,puVar3,*(undefined8 *)(param_1 + 0x28),&cf__publicKey);
(*(code *)PTR__objc_release_1000fef60)(param_3);
return;
}

Same five encode calls, same order. openbinary keeps the method's real name and reads fields by name; the struct above the body still says field_8, a bug on our side.

Ghidra keeps the helper names, objc_msgSend among them, and the text keys, where openbinary shows addresses.

Does it find the functions?100%of symbol-table functions on three stripped Linux files, against each file's unstripped build; ten false positives in 62,687. A third with unwind tables stripped too.
Do the types hold up?DWARFtypes as written. Go interface calls resolve to the concrete type, stack buffers come back as arrays, a switch tests the value the source tested.
What does it not claim?4,658errors reported on the Rust skeleton of a 1,593-method daemon. Unsupported says so, with the reason. Unnamed stays unnamed.

One binary, read eight ways.

usr/libexec/syspolicyd, #094e625d, the macOS 26 daemon that decides whether software may run. Every figure below is what the engine wrote down, unedited.

Identity. File hashes, and the structural hashes that survive a rebuild.

syspolicyd · #094e625d · FILE IDENTITY
SHA-256094e625d7476a3071f52502a0614220969acbe97cc36a899920af6ad285db1a3
SHA-138185796e7e3b36f40b412809591f20c0e5dc830
MD52d8368ec1d8e774542c109e942edc7bf
SSDEEP49152:Us1hfSv0lDvSWqwVUE7PI4QvzRbsBBYvz:UQuk1ssBB
CDHASH216ea0861cfe3bf12284f95a530c52ba7f724075
UUID419E0E58-2B21-33D9-BDF4-EEF0AC9BDAFA
SIGHTINGSfirst seen 2026-10-05
syspolicyd · #094e625d · STRUCTURAL HASHES
CODEa00c97a6a35da92529e8bb88a8b178460e995d0decefc1a234e2999c2642dd75
SYMBOLS697aa3d0b6f857f6a33a34a77f6e1db59cf432b2ead9d889ae64d353f3b7abb6
FRAMEWORKSe5cfc12565945622caa0667694267e61134f4769f9364a9697c3ef4b27b1ef1f
CLASSES2a049217e26f7022ff18f19cf5b47f02408064e18d8d38156469147eef2f4cb6
ENTITLEMENTS9e71e81d107969dd3fbf5843010ebedc3276f8c06e6e12afe62a04e4f2c0b5f2
HARDENINGb7235999e3cc4ce8f4a3920590d1945af80e6889eef3c3aee9a2344dffdb7617

Each moves only when its part of the program moves, so a rebuild with the same code and new metadata still matches on Code and Symbols.

Structure. Segments, sections, entropy, load commands. The map a packer cannot hide in.

syspolicyd · #094e625d · 5 SEGMENTS · 44 SECTIONS
__TEXT r-x 0x100000000–0x1000f8000 · __DATA_CONST rw- · __DATA rw- · __LINKEDIT r-- · __PAGEZERO zero-fill
SectionSizeShareEntropy
__text771.0 KB30%6.28
__cstring71.1 KB3%5.51
__objc_const72.7 KB3%3.47
__objc_methname49.6 KB2%5.04
__oslogstring44.9 KB2%4.57
__cfstring34.4 KB1%2.61
__unwind_info8.4 KB<1%6.29
__got7.6 KB<1%3.05

36 MORE SECTIONS · 76 LOAD COMMANDS: LC_SEGMENT_64 ×5, LC_LOAD_DYLIB ×59, LC_CODE_SIGNATURE, LC_MAIN …

Strings. Sectioned by what they are, with the function that uses each.

In the fileEvery string with the function that uses it. The full table one click away.
Built on the stackStrings assembled byte by byte at runtime are rebuilt from the code that assembles them.
Decrypted by the binaryIts decoder runs in a bounded emulator; what it produces comes back with the call site, parsed into host, port, scheme, keys and mutexes. A value it cannot prove stays unknown.
syspolicyd · #094e625d · INTERESTING STRINGS · 505
IDENTIFIERS190
SQL STRINGS180
FILE PATHS66
TELEMETRY61
CONFIG PATHS3

/dev/null · /tmp/file.XXXXXX · /usr/share/file/magic

URLS & ENDPOINTS2

https://api.apple-cloudkit.com/database/1/%@/%@/public/records/lookup

COMMAND INVOCATIONS1
CRYPTO CONSTANTS1
FORMAT TEMPLATES1

Code. Names on stripped functions, the call graph, the nearest binaries.

Function namesLibrary code is matched against 1.84M signatures. What the corpus has already named, by the same fingerprint, is named here too. A near-match must be confirmed by what it calls and what calls it, and gets no name when candidates disagree.1,835,557 signatures93.8% with a versionnamed by the corpus10.9% of 12.68M functionsno matchstays unnamed
Call graphWho calls what, with calls through pointers, callbacks and object dispatch resolved, and what is reachable from an entry point before any login check.syspolicyd · 4,111 functionsmain → sinkpath or a trustworthy nohub functionsfan-in, fan-out
SimilarityNearest neighbours across the corpus: repacks, recompiles, family siblings, from one DNA vector and set overlap per binary.syspolicyd · nearest#7b760b60 · 100%vector106 dimensionssets40 feature families

Behaviour. What it does, by category, with every call site.

Read from the IL, not the import table, so a row opens the function that does it, at the call site.

What is fetched from outside about the hash is labelled enrichment, never a fact about the binary.

syspolicyd · #094e625d · 25 BEHAVIOURS
Packing & loading1
IPC12
Defense Evasion6T1027 T1027.007
Discovery1T1082
Command and Control1T1071.001
Collection indicators1T1555.003
Network1
Connects out4 sites

sub_10003df8d +0x4b · sub_10003e0ba +0x108 · sub_10003e46b +0x1e1 · sub_10003edfc +0x48d

Files1
Data1

Attack surface. Every way in, who can send to it, and the findings behind it.

syspolicyd · #094e625d · 305 CODE FINDINGS
XPC methodAny local process57
XPC connectionAny local process24
Mach message serverAny local process10
Dispatch sourceKernel1
File changesFile writer1
Mach serviceAny local process—
SignalSame user—
System notificationAny local process, no data—

Components. The libraries it links and the code compiled in, with versions.

syspolicyd · #094e625d · 59 COMPONENTS · CYCLONEDX · SPDX
NameVersion
CoreFoundation4040.1.255
Foundation4040.1.255
Security61901.1.1
libc++2000.63.0
libSystem1356.0.0
libobjc228.0.0
sqlite377.0.0 (Apple build)
zlib1.2.12
liblzma6.3.0 (Apple build)
libbz21.0.8
libxar1.3.0
libswiftCore—
yara—

Posture. Hardening flags, signing, entitlements, provenance.

syspolicyd · #094e625d · 14 HARDENING FLAGS
ONpie · stack_canaries · fortify · data_const · signed · min_os_modern
OFFhardened_runtime · library_validation · nx_heap · restrict · adhoc_signed · fairplay_encrypted · rwx_segment
N/Apac
SIGNINGApple-signed · Software Signing · x86_64 and arm64, 41 entitlements each
ENTITLEMENTS · 5 OF 41com.apple.application-identifier · com.apple.developer.icloud-services · com.apple.keystore.filevault · com.apple.private.CoreAuthentication.SPI · com.apple.private.IASInstallerAuthAgent
PROVENANCEmin OS 26.0.0 · SDK 26.0.0 · source version 726.0.11.0.0 · com.apple.syspolicyd

The emulator. The program's own code, run over the IL, never on a host.

Runs the same on every instruction set the engine lifts. Hard limits on steps, memory, call depth and wall clock. No file, socket, process or system call ever happens.

memcpy, allocators, loaders, RC4 and base64 are modelled, not invoked, so the run continues. A value it cannot prove stays unknown.

Decrypted strings and configsThe decryptor loop runs; what it produces comes back with the call site, parsed into host, port, scheme, keys and mutexes where the layout is known.
UnpackingA packed entry stub runs until it hands over, and what it wrote is kept. Constructors run first, as the loader would. A run that stops names where, and which environment values it was missing.
One function, your argumentsRun any function with chosen registers, arguments and memory. Back come the registers it bound, the bytes it wrote, and why it stopped.
FuzzingEach way in is run on generated inputs, coverage-guided, up to 20,000 runs or ten minutes a target. A crash comes back with the input, and it replays.

Fuzzing · paid add-on · measured 2026-10-14: 65K runs a second on one lane, 132K on eight

Instruction sets. 48 decompiled, against the three desktop tools.

Instruction setGhidra 37Binary Ninja 14IDA 12openbinary 48
Desktop and server
x86-64, x86, ARM64, ARM64e, ARM, PowerPC, MIPS32, MIPS64, RISC-V✓✓✓✓
SPARC✓––✓
s390x–––✓
LoongArch✓––✓
PA-RISC✓––✓
m68k✓––✓
Hexagon✓✓–✓
Kernel and bytecode
eBPF✓––✓
Dalvik✓––✓
JVM✓––✓
WASM–––✓
CIL (.NET)–––✓
EBC (UEFI)–––✓
Lua bytecode–––✓
Python bytecode–––✓
BPF, cBPF✓––✓
Embedded and microcontrollers
Xtensa✓––✓
AVR✓––✓
MSP430✓✓–✓
H8/300–––✓
SuperH✓––✓
SH-4✓––✓
V850, RH850✓–✓✓
Z80✓––✓
SM83–––✓
C166–––✓
V810–––✓
TriCore✓✓–✓
NDS32✓––✓
LM32–––✓
OpenRISC–––✓
8051✓––✓
6502✓✓–✓
8085✓––✓
8048✓––✓
MC6800∼––✓
PIC✓––✓
HCS08✓––✓
CR16✓––✓
24 more: instructions and functions, no pseudocode yet.Alpha, AMD 29k, H8/500, HCS12, M16C, M8C, MCORE, MCS-96, Propeller, RL78, RX, RSP, TMS320, XAP, XCore, CP1600, LH5801, 4004, SPC700, 65C816, and four toy sets. Ghidra decompiles five of them: CP1600, HCS12, M16C, M8C, MCS-96.

Name matches against Ghidra's 37 processor directories and the IDA and Binary Ninja decompiler lists, read 2026-09-18 · ∼ no matching spec found

Chips. Chip, load address and RTOS from a bare image, no file system to lean on.

On 195 vendor images the chip is known on 92%, a load address on 88%.

62 bare-metal images, curated 2026-10-15

Maker boardsRP2040, RP2350, SAMD21, nRF52840, STM32F405, ESP32, ESP32-C3, ESP8266MicroPython, CircuitPython, WLED, Tasmota
DronesSTM32 F4, F7, H7, RP2350ArduPilot, PX4, Betaflight, INAV
Boot loaders and probesRaspberry Pi debugprobe, Black Magic Probe, nRF52 boot loader, optiboot, stk500v2, Caterina, chipKIT, U-Boot
Mask ROMsESP32, ESP32-C3, ESP8266
IndustrialSiemens SCALANCE, Hirschmann, Rockwell NetLinx, Schneider Modicon NOEVxWorks · the 44,780-function Siemens image in 13 s
AutomotiveInfineon AURIX TC334, TC375, Renesas RH850, RX63N, NXP S32K144
8051Cypress FX2, WCH CH552, CH554
RTOSCortex-R4, Cortex-R5 big-endian, Cortex-M4, STM32F407, NXP MPC5554, Renesas SH7216Zephyr 4.4, NuttX 13.1, FreeRTOS 11, ThreadX, uC/OS-II, uC/OS-III
Safety controllersTI Hercules TMS570, ARM and Thumb mixed, big-endianFreeRTOS 11.3.1
Renesas SuperHSH-2A, SH-4, big- and little-endian
FormatsMach-O · ELF · PE · DEX · WASMFat binaries, the dyld shared cache and kernel collections are sliced into their members.
Language runtimesGo · Rust · Swift · Objective-C · C++ · .NET
Labelleddaemon · agent · kext · CLI · appEvery binary, from the file.
Benchmark

Decompile.
25x faster than Ghidra.

locationd, all 25,406 functions: 12.0 seconds against 302.73, same file, same Mac, fastest of three runs each. Functions found agree within 2%.

locationd25x
syspolicyd78x
Flutter engine*37x
searchpartyd*311x
dsymutil*18x
*Ghidra ran once, on a busy machine · dsymutil 8.9 GB against Ghidra's 6.4

The engine, asked plainly.

  1. 01

    Is this a Ghidra or IDA replacement?

    Not at the desk; they are interactive tools for one file. In a pipeline, yes: it reads every binary by itself and serves the result over an API.

  2. 02

    Can I take the result back into Ghidra or IDA?

    Not as a plugin yet. Names, pseudocode, call graph and strings come out as JSON and text, findings as SARIF, components as CycloneDX and SPDX.

  3. 03

    How does a file get in?

    Drop a file, call the API or let an agent upload it. Up to 1,000 hashes verified in one call.

  4. 04

    Where does it run, and who sees my binaries?

    Cloud, on-prem or air-gapped. Public uploads are free and visible to everyone, private uploads need Pro and stay inside your workspace.

  5. 05

    What about packed or obfuscated binaries?

    UPX is the one packer it unpacks outright. For the rest, the entry stub and decryptor loops run in the bounded emulator; what they produce is kept with the call site.

  6. 06

    Can I run it from a script?

    Yes. The CLI runs the analysis; the API and 72 MCP tools serve the same stored facts to a script or an agent.

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.