Back in the ‘good old days’ (2010-2012) when people were constantly writing cheats and anticheats - trying to beat each other for fun; it was a thing.
Up until 2009/10, people were using concommand and hook blacklists. This made bypassing anticheats trivial. In 2010, hook whitelists became a thing. Generally how you would do it was to override the hook.Add function, allow whitelisted hooks, deny and log serverside non-whitelisted hooks. This allowed you to log them in the same format as the whitelist, so a human could easily add to whitelists.
Then, people got around that by overriding hook.Call. Who needs to use hook.Add if you have total control over the hook system, right? Anticheat developers then retaliated by deleting hook from _G and forcing the game to use their version.
This started the ‘cat and mouse’ game of who loads first by naming files creatively (enum/!.lua , etc) and moving on to injection via dll in menustate. The natural progression was for anticheat developers to detect code running that shouldn’t be. Mine did this by running a checksum on lua’s memory usage on load and call stack count and uploading it to the server and comparing to other player’s with automatic kicking and manual banning. The only false positive of note, was when Garry joined my (non-beta) server with an unreleased development version of GMod.
And finally, garry enabled VAC on baconbot and sethhack; banned most known cheat developers with his anticheat ‘GAC’ and Seth got arrested for denial of service attacks. FIN. I’m not sure what people are up anticheat/cheat wise since the end of 2011.