Reverse engineering · x86 assembly · 7 years

The Esoteric Path

A seven-year reverse-engineering project that reworked a 25-year-old, closed-source game from the inside out — by hand, in x86 assembly, with no source.

The Esoteric Path — the reworked Diablo II UI: a re-lit gothic hall with custom orbs and interface.
The reworked interface and custom Act 4 town map, running live on the Diablo II 1.13c engine — every layout and lighting change written by hand into the binary.
7yr
of reverse-engineering
86
asm patches, mine + community
835
bytes rewritten in D2Client
36
custom maps, all 5 acts
59,040
sprite frames recolored
0
source files · closed binary

Whose work this is

principal author, and an honest division of labor

What it is

The map pipeline

a second body of work — authoring 36 custom levels at scale

Alongside the binary work, the mod ships 36 hand-built custom maps across all five acts — new levels in their own tile namespace, not reskins of existing ones. Building that many by hand only stayed tractable because it was turned into a repeatable pipeline:

Same instinct as the reverse-engineering: turn a hard, error-prone task into a documented, repeatable process.

A few of the 36 — rendered straight from their .ds1 source (floor / wall / object layers), no in-game screenshots:
Sequestered Chapel
Sequestered ChapelACT I
Dreadful Spire
Dreadful SpireACT V
Alcarnus
AlcarnusACT II
Foundry of the Damned
Foundry of the DamnedACT IV
Maddening Halls
Maddening HallsACT V
The Reliquary
The ReliquaryACT V

The art pipeline

entirely custom — recoloring the game's own sprites, frame by frame

The new look isn't a shader pass over the old art — it's the actual character sprites, rebuilt. Because Diablo II composites characters in layers, changing one attribute touches an enormous number of frames:

The game stores characters as compiled DCC sprites, so the workflow was: decompile each to its thousands of raw frames (pixel offsets preserved so they re-align exactly), recolour them with a custom Adobe batch script I built, then recompile. Sixty thousand frames by hand isn't feasible — the batch tooling is what made it possible, and the result blends seamlessly with the untouched art.

The feat, milestone by milestone

The discipline

the actual differentiator on a black-box target

Consulting a panel of experts — as an experiment, not an oracle

At one knowledge boundary — which function clips the ground tiles at the panel edge, and where — the fastest static traces had already been wrong twice. So the question went to a purpose-built multi-model consultation harness: one structured RE prompt, relayed to four frontier models in parallel, one JSON payload per wave each way, iterated over three waves.

The discipline is the point. No model's claim was taken on authority; every specific was checked against the binary, and the whole consultation was logged — who claimed what, in which wave, and whether it survived verification.

The failure ledger

the honest record — what was tried, and why it failed

Fight the shift directly — NOP the offset math, freeze the layout mode
Floor un-shifted but walls didn't; freezing the mode killed occlusion culling ("black diamonds") and broke click-to-move.
Occluded geometry is never drawn, not merely shifted — the mode is load-bearing.
A parallel second render pass
Cascaded through wrong-context reads → a heap use-after-free → drawing after the frame was already presented (invisible) → a collision with another mod that patched the same site in memory though it was pristine on disk.
On-disk-clean ≠ safe to hook — you must scan the live process.
"Just widen the one base value"
The patch fired correctly (960 → 1280 logged) and the region stayed black.
A firing patch that changes nothing falsifies the lever itself.
A high-confidence static trace, adversarially verified
Named the wrong draw function entirely; killed only by an in-game probe that fired zero times on the address everyone trusted.
Verification against reasoning isn't verification against the machine.

Every one is a version number burned. Laid side by side, they stop looking like separate bugs and start looking like one wrong mental model of the engine — which is exactly what the ledger is for.

Status

kept honest

Done
Foundation

Seven years of hand assembly RE; the mod built and shipped. Toolchain, framework scaffold, and full modification inventory verified.

Mapped
Pipeline & shift

Render dispatch chain and the panel-shift globals located and documented, address by address.

In progress
World-behind-panels

Walls and units correctly un-shift; the tile layer's shift traced into the downstream D3D11 layer. Not yet shipped.

What it demonstrates