PHP with a hand-rolled router
Local file inclusion and path traversal
Hand-rolled routing means paths get built from user input somewhere, and the include is usually one function away from that string.
Then I build the thing that catches me. Kernel cheats, anti-cheat, Lua deobfuscation and web security.
in production, sold privately
No binary. No driver. No kernel view of the machine. It runs inside the same sandbox as the game it protects, and it still bans almost everyone who tries, the moment they try.
Roblox studios buy it from me privately and run it on their own experiences. There is no product page, no name and no launcher, which is part of why it keeps working: there is nothing public to study, diff or fingerprint.
of cheaters banned instantly
Not queued for a ban wave. The decision is made in the same session, usually inside the first minutes of the attempt.
false positives, lifetime
Across the entire existence of the service. That number is the reason instant enforcement is safe to ship at all.
Lua, no native component
Nothing to sign, nothing to load, nothing for an attacker to dump. It ships as game code and updates like game code.
Both figures are my own measurements across live deployments, not a third-party benchmark.
A kernel anti-cheat can look at the whole machine. This one sees only what the runtime and the game are willing to say. Every detection has to be built out of legitimate, observable behaviour.
Delayed ban waves exist to protect the publisher from its own false positives. Removing the delay only works if the false-positive rate is small enough to defend one player at a time.
Studios buying it are targeted by the exact tooling I used to write. The rules are shaped by having been on the other end of them for years.
No name, no marketing, no public build. Nothing for the people it is aimed at to collect, compare across versions, or trade.
Kernel and user mode. Vanguard, BattlEye, EAC, VAC, Warden, Byfron. Ten titles, one pattern. Kernel anti-cheats and behavioural detection built by whole teams, and cheats that lived inside them for 6 to 24 months undetected, several past a year. This is where I learned adversarial engineering, from the side that has to keep winning.
Written from scratch, against anti-cheats that also live in the kernel.
Building at ring zero removes every convenience and every excuse. There is no library to hide behind, the failure mode is a bugcheck rather than an exception, and the thing hunting you has the same privileges you do. Most of the work is not the capability, it is staying uninteresting while you have it.
Kernel anti-cheat defeated with facilities Windows ships and has to trust.
The strongest bypasses were never exotic. They used documented operating-system behaviour that protection software cannot simply forbid, because the platform itself depends on it. That asymmetry is the most valuable thing I know about defending a machine: your detections cannot outlaw the operating system.
Surviving models, not just scanners.
Once detection moved server side, signatures stopped mattering and distributions started. Reaction times, overshoot and correction, imperfect tracking, session-to-session variance. Looking human in aggregate is a statistics problem, and it is the same problem in reverse when you are the one scoring players.
The anti-cheat studios now pay for, built out of everything above.
Years spent making something invisible are exactly what let me build the thing that catches it. The detection rules I ship are the ones I could never get around, written by the person who spent a decade trying.
10 targets. Concepts and constraints only, no offsets, signatures or working evasion.
The highest bar in the industry, which is exactly why it was worth clearing.
Vanguard loads a kernel driver at boot, before the game and before most of userland. It polices driver signing, enforces code integrity, watches for unsigned or hollowed modules, and can refuse to start the game at all if the machine looks wrong. Always on, not launch-time.
Vanguard is where you learn that detection is not a list of signatures, it is a model of what a normal machine looks like. Beating a model is a different problem from beating a scanner, and it is the one that matters when you later sit on the defending side.
Private research, described at the level of concepts and constraints. No source, offsets, signatures, driver internals or working evasion steps are published here. The value was the capability and the discipline, not the payload.
Lua's most-used commercial obfuscator, every generation of it, taken apart manually into readable code with an explanation of what each stage was hiding.
MoonSec compiles your script into a custom virtual machine: constants encrypted, instructions shuffled into an opaque dispatch loop, control flow rebuilt so nothing maps back to the source. v3 hardened all of it and added anti-tamper. There was no tool for the last one, so it was done by reading the interpreter until the interpreter explained itself.
Strip the outer packer to reach the bytecode blob and the VM that consumes it.
Watch the dispatch loop long enough to name every opcode by what it does to the stack.
Strings and numbers are keyed per build, so the pool comes back only once the VM's own decoder is understood.
Turn the flattened dispatch back into loops and branches, then into Lua a person can read and reason about.
local v0=("\120\112\99\97\108\108"):sub(1,6)
local v1={[0]=0x4C,0x75,0x61,0x51,0x00,0x01,0x04}
local v2=function(a,b) return(a+b)%256 end
local v3,v4=1,{}
while true do
local op=v1[v3]
if op==nil then break end
if op==0x4C then v4[#v4+1]=v2(op,v3)
elseif op==0x75 then v3=v3+1
elseif op==0x61 then v4[#v4]=v4[#v4] ~ 0x37
else v3=v3+1 end
v3=v3+1
end
return (loadstring or load)(string.char(unpack(v4)))()waiting. every opcode above becomes one statement here.
Illustrative sketch written for this page, in the shape of what the protection produces. Real client work is not published, and neither is a deobfuscator.
Most vulnerabilities are implied by the technology choices before anyone writes a line. A request crosses the same boundaries in every application, and the same boundary keeps being the one nobody owns.
PHP with a hand-rolled router
Hand-rolled routing means paths get built from user input somewhere, and the include is usually one function away from that string.
Server-rendered templates, no escaping helper
If escaping is a habit rather than a default, every new template is a new chance to forget.
Reverse proxy plus its own redirect handler
Two layers each think the other validated the URL. Headers are string concatenation on at least one of them.
ORM plus a few raw queries for reports
The safe path is the framework's. The raw queries are always the ones written under deadline for an internal dashboard.
JWT in localStorage, no rotation
Any script on the page can read it, nothing can revoke it, and the expiry was set for convenience.
Client-side role checks on an admin route
The route gate is in the bundle the visitor downloaded. The API is what actually decides, and it often does not.
Authorised testing only. The scanner below automates the boring half of this so the thinking half gets the time.
Shroud. Correctness-first source transformation.
Obfuscation is a pipeline of semantics-preserving passes, and the hard part is not breaking the program. Shroud renames only what it can prove is safe — locals, never globals, object properties or exported names — using a real AST for Python and hand-written parsers for JavaScript and Lua, then runs the original and transformed programs and compares their output.
const knowledgeBase = {
hello: "Hi there! How can I help you today?",
bye: "Goodbye! Have a great day!",
help: "You can say hello, bye, or ask me anything.",
default: "Sorry, I don't understand that yet.",
};
function chatbotResponse(input) {
input = input.toLowerCase().trim();
for (const key in knowledgeBase) {
if (input.includes(key)) {
return knowledgeBase[key];
}
}
return knowledgeBase.default;
}var Nc21D0=["2DsADvBJ3Pga+ssBC+nkSP5yaVrwScLtG6PsG1y96E3xKx8=","1z1PHvpVy7wbkuIYGenmCfcgRRvsDMr8Qvs=","yT1VWvtNwL1Iu/pOFKzrRf9+ABjhSYK9VKijDw+ip0T1ckEU4VjG9FW9rQ==","wz1SCOEAjtQbvuwAW72nXP42RQjrWM/zX/r3Bh29p1D1Jg4="];var Nc21D0K=[144,82,32,122,152,44,174,157,59,218,131,110,124,201,135,41];function PJWGSF(i){var s=atob(Nc21D0[i]);var u=new Uint8Array(s.length);for(var k=0;k<s.length;k++){u[k]=s.charCodeAt(k)^Nc21D0K[k%Nc21D0K.length];}return new TextDecoder().decode(u);}
const knowledgeBase = {
hello: PJWGSF(0),
bye: PJWGSF(1),
help: PJWGSF(2),
default: PJWGSF(3),
};
function chatbotResponse(eO7eURvRhO) {
eO7eURvRhO = eO7eURvRhO.toLowerCase().trim();
for (const ZsHX03Z in knowledgeBase) {
if (eO7eURvRhO.includes(ZsHX03Z)) {
return knowledgeBase[ZsHX03Z];
}
}
return knowledgeBase.default;
}Drag to reveal the transformed output. Both sides come from the repository's own JavaScript example.
Everything here is public on GitHub. The private work is the work that pays, so it stays described rather than shipped.
The opening of this site is the case study. Three tiers of exposure, each with a completely different consent model, and only one of them ever asks you anything.
The full method is written up on the privacy page.

Your connection gives up a coarse location and the network routing your traffic. Nothing is asked of you, because making the request is what reveals it.
Viewport, platform, thread count, GPU string, language, timezone. Everything a normal page reads from standard Web APIs. No fingerprint is computed here.
Metres, not kilometres, and only after you grant the browser's geolocation permission. Held in memory, never sent anywhere, deleted when you ask.
I started at fourteen because I was losing. Every skill on this page is downstream of that one afternoon, including the ones I now get paid for.
That is the whole origin story. The part that kept me was not winning, it was realising a game is just software, and software can be read. Once you have read one, you cannot go back to treating any of them as magic.
Minecraft was where I learned that a live game leaks. Unpatched flaws in the game's own code gave up information the server never intended to send, including where other players were standing. Server plugins, written quickly and then trusted completely, could be talked into handing over administrative control. Economies could be made to produce value that was never earned.
There was a market for rare usernames, and a working bug was worth more in it than money was. That is where I earned a name of my own in that scene, before I was old enough to drive. It also taught me the uncomfortable half of security: a flaw has a price, and someone is always paying it.
The interesting object was never the game, it was the binary. Reverse engineering became the actual hobby: disassembly, memory, protocol, protection. Games were simply the most instrumented targets available to a teenager with time.
Vanguard, BattlEye, EAC, VAC, Warden, Byfron. Kernel drivers, code integrity, behavioural models, and cheats of my own that lived inside them for months at a time. This is the decade of work the rest of this site details, and the reason the detection I write now is any good.
Web targets were next, and they were easy. Too easy to stay interesting, which is exactly when it stopped being a technical question and became a choice about what to do with the ability.
So I switched sides and stayed there. Everything since has been defensive: anti-cheat for FiveM, then the Lua anti-cheat Roblox studios now buy, a forensics tool that can tell whether a cheat has ever run on a machine, and web-security software that finds the class of flaw I used to look for.
Kernel-level development, detection engineering, machine learning, and the whole front of the stack: software, frontend, interface and motion design. The offensive years gave me the instinct. The rest is deliberate practice at everything needed to ship the defensive side properly.
Written entirely in Lua, sold privately to studios, banning almost everyone who tries in the same session. The section at the top of this page is about this one.
The first thing I built for the defending side. Hundreds of servers make the same handful of trust mistakes, so the rules encode the mistakes rather than chasing individual cheats.
A checker that inspects a machine and reports whether a cheat has been run or injected into any game on it, not just whichever game is open. Built for the moment when someone says they were never cheating.
Scanners and checks for the vulnerability classes I used to walk through. Authorised targets only, which is the entire difference between this and the earlier chapters.
The early chapters are teenage work against systems that have long since been fixed, described at the level of what was learned. No targets, no techniques and no tooling from that period are published here, and everything since the turn is authorised work.
I have always liked systemsmore after seeing them break.
Nineteen, with five of those years spent inside other people’s software. The offensive half is documented on this page because it is where the instinct came from, not because it is the part I sell.
The work now is anti-cheat and detection engineering, kernel-level development, machine learning, and the whole front of the stack: software, frontend, interface and motion design. Breadth on purpose, because shipping the defensive side properly needs all of it.
Anti-cheat for a game with a real cheating problem, a stack you want read before someone else reads it, or something protected that needs understanding.