Chrollo is a script hook for Garry's Mod 13 that lets you edit, blacklist and copy scripts before they're run by the game client.
A common use for Chrollo is to bypass anti-cheats on servers which rely entirely on Lua code execution on the clientside. You can see every script your client runs.
Chrollo also serves as a script enforcer bypass as well.
Currently with Chrollo you can
- Dump all loaded clientside scripts to disk
- Replace/edit loaded scripts
- Blacklist scripts
- Download the latest release from the releases page
- Open Garry's Mod
- Inject the
.dll
file into your game. - Load a multiplayer server.
- All downloaded scripts can be found in the
steamapps/common/GarrysMod/chrollo/<server name>/
directory in yourGarry's Mod
folder.
Upon each game version change the only information that needs to be updated is the server_name
pointer. I'll try to keep each version updated, but it's easy to find the server name pointer with something like CheatEngine (search for the server name as a string in the binary--it's always a static offset).
In chrollo/replace
save your edited script with the same name (delimited by _
) as the script you want to edit. That's it, and when you inject Chrollo your script will be replaced.
In chrollo/blacklist.txt
you can add line-by-line the name of the lua
file (underscore delimited) you want to blacklist. Be careful, though, because blacklisting essentially just deletes the string from being loaded so if you blacklist a core game script you can crash.
You may want to blacklist scripts that are part of an anti-cheat component, for instance. Blacklisted scripts do not run.
Sample blacklist.txt
file to bypass most TTT anti-cheats
addons_moat_addons_lua_plugins_moat_modules_snap_utils.lua
addons_moat_addons_lua_plugins_moat_modules_snap_init.lua
addons_moat_addons_lua_plugins_moat_modules_snap_client_menu.lua
addons_moat_addons_lua_plugins_moat_modules_snap_client_client.lua
addons_1_sgm_lua_gcap_client_gcap_client.lua
gamemodes_sandbox_entities_effects_propspawn.lua
addons_leyscreencap_lua_autorun_client_cl_leyscreencap.lua
addons_swiftac_lua_swiftac.lua
addons_ulx_lua_ulx_modules_sh_cc_virus.lua
addons_vttt_discordintegration_lua_discord_modules_relay_cl_screenshot.lua
addons_pac3-master_lua_pac3_core_client_parts_censor.lua
addons_snapper_lua_screensnapper_client.lua
addons_crescent_lua_crescent_modules_snap_cl_snap.lua
You can find a lot of cool stuff with this. I was able to bypass all of moat.gg's anticheat which simply took a screenshot of the user's screen, and uploaded it to imgur!
...
net.Receive("Snapper Victim", function(length, server)
local ply = net.ReadEntity()
if IsValid(ply) and ply:IsPlayer() then
snapper.victim = ply
end
end)
net.Receive("Snapper Notify", function(length, server)
local contents = net.ReadTable()
if not contents then
return
end
chat.AddText(Material("icon16/information.png"), unpack(contents))
end)
local function mupload()
local a = math.Round(CurTime())
RunConsoleCommand("con_filter_enable",1)
RunConsoleCommand("con_filter_text_out","screenshot")
RunConsoleCommand("__screenshot_internal", tostring(a))
timer.Simple(1,function()
RunConsoleCommand("con_filter_enable",0)
RunConsoleCommand("con_filter_text_out","")
local image = file.Read("screenshots/" .. tostring(a) .. ".jpg","GAME")
HTTP({
url = "https://api.imgur.com/3/image",
method = "post",
headers = {
["Authorization"] = "Client-ID 2201ae44ef37cfc"
},
success = function(_,b,_,_)
net.Start("moat-ab")
net.WriteBool(true)
net.WriteString(b)
net.SendToServer()
end,
failed = function(b)
net.Start("moat-ab")
net.WriteBool(false)
net.WriteString(b)
net.SendToServer()
end,
parameters = {
image = util.Base64Encode(image)
},
})
end)
end
net.Receive("moat-ab",mupload)
...