Story June 15, 2026 · 8 min read

From a fuzzer experiment to a security platform: the Trilocore story

Trilocore did not start as a product. It started as a question: could you run an offensive fuzzer fast enough to attack contracts that are already live on mainnet — from bytecode alone, with no source? This is how that question turned into BEVM and Janus.

The premise: defenders read Etherscan by hand

Smart-contract exploits drain billions every year. The defenders' toolchain, though, is mostly static and source-leaning: linters that flag patterns, symbolic engines that are slow, and fuzzers that need the source plus hand-written properties. Attackers, meanwhile, operate on deployed bytecode and automate everything. We wanted to flip the asymmetry — give defenders an offensive tool that works on the same artifact attackers do: the bytecode on chain.

Chapter 1 — the GPU fuzzer

The first real component was an EVM fuzzer built to run on the GPU, inspired by the IEEE S&P 2024 work on smart-contract fuzzing on GPUs. Instead of a few thousand executions per second on a CPU, a SIMD EVM interpreter with a register-based IR lets us push 1024 parallel threads and reach order-of-magnitude higher throughput. Speed is not a vanity metric: more executions per second means deeper coverage in the same time budget, which means reaching the weird, rarely-taken branches where the exploitable bugs hide.

Around the fuzzer we grew an arsenal — a register IR, a control-flow lifter, taint and reentrancy oracles, owner-gate-bypass analysis, flash-loan profit modeling, proxy-collision and multi-actor modules, and a static detector suite. That arsenal became scslib, the shared core every Trilocore tool is built on.

Chapter 2 — confirmation, not warnings

A fuzzer that flags a "maybe" is just another source of noise. The thing that makes a finding worth a human's time is proof. So the pipeline doesn't stop at a hit: it re-runs the candidate transaction on an Anvil mainnet fork and applies a multi-layer verdict — did it revert, did it reach the target PC, did the attacker's balance actually go up? Only a strictly positive, replay-verified outcome is reported. The unit of truth became a measurable on-chain delta, not a string a tool printed.

The differentiator we kept coming back to: run offensive fuzz on already-deployed mainnet contracts, and confirm exploitability with fork replay — not just static warnings.

Chapter 3 — BEVM, a Burp Suite for the EVM

The engine was powerful but lived behind a terminal. Auditing a contract meant a CLI and a stack of scripts — fine for us, useless for everyone else. So we put it in the browser. BEVM is a visual security workbench: attach by address or paste bytecode, and within a second you see the contract's selectors, its control-flow graph, and its storage laid out in front of you.

If you've used Burp Suite for web apps, the layout will feel familiar: a Repeater to hand-craft and replay a transaction with any sender, an Intruder that drives the GPU fuzzer at marked payload positions, a Scanner that validates issues by execution rather than heuristics, a CFG Graph, and Storage and Decoder tabs to set up the exact state an exploit needs. The point is to make deep, replay-verified analysis something any builder can run — not a $250K, multi-week engagement.

Chapter 4 — Janus, an attacker-minded analyst

Raw scanner output still needs interpretation. Janus is our EVM-specialized AI analyst: give it a contract, a finding, or an attached source file and it explains the vulnerability, walks the attack chain, and turns machine output into an audit-ready write-up in plain language.

Under the hood, Janus is two things wearing one name. There's the model you chat with in the console. And there's the agent — an autonomous, attacker-minded loop that reasons, reaches for tools, composes multi-step attacks, and verifies them on a fork. The agent recently grew a more disciplined control loop: it keeps an explicit plan of attack hypotheses, refuses to declare a contract safe until it has genuinely tried the untried surface, and fans out focused sub-investigations per selector. It also draws directly on scslib's research detector library and a corpus of distilled, real-world exploit patterns — so it attacks with prior knowledge instead of guessing.

Chapter 5 — from monorepo to platform

For a long time everything lived in one giant monorepo. That was great for moving fast and terrible for shipping. In 2026 we split it into a clean set of independent repositories around the shared scslib core: the BEVM backend and frontend, the Janus console and agent, a single sign-on app, and an API gateway that meters access by key. The principle is plug-and-play — clone the piece you need, declare scslib as a dependency, and it builds and runs on its own. That's what turned a research project into a platform.

Where we are now

What this blog is for

This is where we'll publish what the tools find: retrospectives on public hacks walked through our pipeline, methodology deep-dives on vulnerability classes most tools miss, and field notes from building offensive security infrastructure for the on-chain world. First up: the exploit hiding in dead code, and a retrospective on the Euler attack.

Throughput and coverage figures in this post are order-of-magnitude and depend on target, hardware, and configuration. Trilocore builds security tooling; nothing here is an endorsement to attack systems you do not own or have explicit permission to test.

← All posts