For Steal a Brainrot by BRAZILIAN SPYDER
steal-a-brainrot diagnostic recorder
--!nonstrict
--[[=========================================================================
Steal a Brainrot -- passive runtime recorder (NO HOOKS)
-------------------------------------------------------------------------
This game detects metatable hooks (__namecall) and SILENTLY disables its
own remotes if it sees one -- so anything that logs remote calls trips it.
So this logs NOTHING via hooks. It only READS state the game changes and
connects to ordinary instance signals -- attributes, Humanoid properties,
prompt triggers, leaderstats, position. That is indistinguishable from the
game's own UI code and cannot be detected.
We don't need remote arguments -- the place dump already gave us those.
What we're missing is TIMING and EFFECTS, which this captures fully:
* the real steal hold time (Stealing true -> false, and what moves between)
* the anticheat's speed tolerance (per-frame position delta, live)
* what a tripmine actually does to you (attribute + ragdoll timeline)
* RagdollEndTime / SpeedAllowance as the SERVER sets them
HOW TO USE
1. Run this.
2. Do ONE normal steal by hand -- walk up, hold the prompt, collect.
3. If you can, walk onto a tripmine once.
4. Send me the file it names (workspace / nmhub_capture/…).
Auto-saves every 5s and survives a kick.
=========================================================================]]
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local LocalPlayer = Players.LocalPlayer
local canWrite = type(writefile) == "function"
local mkfolder = makefolder or make_folder
local isfolderF = isfolder
local START = os.clock()
local FOLDER = "nmhub_capture"
local FILE = FOLDER .. "/sab_" .. tostring(math.floor(tick())) .. ".log"
local log = {}
local save -- forward decl: used by handlers above its def
local function stamp() return string.format("%8.3f", os.clock() - START) end
local function line(s)
log[#log + 1] = stamp() .. " " .. s
if #log > 30000 then table.remove(log, 1) end
end
local function short(v)
local t = typeof and typeof(v) or type(v)
if t == "string" then return (#v > 50 and v:sub(1,50).."..." or v) end
if t == "Vector3" then return string.format("v3(%.1f,%.1f,%.1f)", v.X, v.Y, v.Z) end
if t == "Instance" then return "<"..v.ClassName..":"..v.Name..">" end
return tostring(v)
end
--=========================================================================
-- 1. attribute timeline -- the goldmine (Stealing, SpeedAllowance, RagdollEndTime)
-- Pure reads + AttributeChanged on normal instances. Undetectable.
--=========================================================================
local function watchAttributes(inst, tag)
local ok, attrs = pcall(function() return inst:GetAttributes() end)
if ok and attrs then
for k, v in pairs(attrs) do
line(string.format("ATTR %s.%s = %s (initial)", tag, k, short(v)))
end
end
pcall(function()
inst.AttributeChanged:Connect(function(name)
line(string.format("ATTR %s.%s -> %s",
tag, name, short(inst:GetAttribute(name))))
end)
end)
end
watchAttributes(LocalPlayer, "Player")
--=========================================================================
-- 2. character + humanoid state
--=========================================================================
local curRoot, curHum
local function onChar(char)
line("CHAR respawn")
watchAttributes(char, "Char")
curRoot = char:FindFirstChild("HumanoidRootPart")
or char:WaitForChild("HumanoidRootPart", 5)
curHum = char:FindFirstChildOfClass("Humanoid")
or char:WaitForChild("Humanoid", 5)
if curHum then
line(string.format("HUM WalkSpeed=%.1f JumpPower=%.1f HipHeight=%.2f",
curHum.WalkSpeed, curHum.JumpPower, curHum.HipHeight))
for _, prop in ipairs({"WalkSpeed", "JumpPower", "PlatformStand", "Sit"}) do
pcall(function()
curHum:GetPropertyChangedSignal(prop):Connect(function()
line("HUM " .. prop .. " -> " .. tostring(curHum[prop]))
end)
end)
end
curHum:GetPropertyChangedSignal("Health"):Connect(function()
if curHum.Health <= 0 then line("HUM DIED") end
end)
end
-- watch tools coming/going (carpet, cloner, brainrot-in-hand)
pcall(function()
char.ChildAdded:Connect(function(c)
if c:IsA("Tool") then line("TOOL equipped " .. c.Name) end
end)
char.ChildRemoved:Connect(function(c)
if c:IsA("Tool") then line("TOOL unequipped " .. c.Name) end
end)
end)
end
if LocalPlayer.Character then onChar(LocalPlayer.Character) end
LocalPlayer.CharacterAdded:Connect(onChar)
--=========================================================================
-- 3. steal window + anticheat tolerance -- per-frame position sampling
-- (reading root.Position/Velocity is what the game itself does; no hook)
--=========================================================================
local lastPos, maxStep, sampleN = nil, 0, 0
local wasStealing = false
RunService.Heartbeat:Connect(function(dt)
local root = curRoot
if not (root and root.Parent) then return end
local pos = root.Position
-- horizontal studs/sec this frame -- the number the anticheat watches
if lastPos and dt > 0 then
local dx, dz = pos.X - lastPos.X, pos.Z - lastPos.Z
local step = math.sqrt(dx*dx + dz*dz) / dt
if step > maxStep then maxStep = step end
sampleN = sampleN + 1
-- log any frame that spikes past normal run speed (~16-50)
if step > 80 then
line(string.format("MOVE! %.0f studs/s spike vel=%s",
step, short(root.AssemblyLinearVelocity)))
end
end
lastPos = pos
-- steal edges, from the Stealing attribute the server sets
local stealing = LocalPlayer:GetAttribute("Stealing") == true
if stealing ~= wasStealing then
line(string.format("STEAL Stealing -> %s (pos %s)",
tostring(stealing), short(pos)))
wasStealing = stealing
end
end)
-- periodic max-speed readout so the file shows the tolerance ceiling
task.spawn(function()
while true do
task.wait(3)
if sampleN > 0 then
line(string.format("SPEED peak %.0f studs/s over last window", maxStep))
maxStep, sampleN = 0, 0
end
end
end)
--=========================================================================
-- 4. tripmines -- does walking near one change an attribute / ragdoll you?
--=========================================================================
pcall(function()
local tools = workspace:FindFirstChild("ToolsAdds")
if tools then
local function watchMine(m)
if m:IsA("BasePart") and m.Name:match("SubspaceTripmine") then
line("MINE present: " .. m.Name)
end
end
for _, m in ipairs(tools:GetChildren()) do watchMine(m) end
tools.ChildAdded:Connect(watchMine)
end
end)
--=========================================================================
-- 5. leaderstats / money -- effect confirmation
--=========================================================================
pcall(function()
local ls = LocalPlayer:FindFirstChild("leaderstats")
or LocalPlayer:WaitForChild("leaderstats", 5)
if ls then
for _, stat in ipairs(ls:GetChildren()) do
line("STAT " .. stat.Name .. " = " .. tostring(stat.Value))
pcall(function()
stat:GetPropertyChangedSignal("Value"):Connect(function()
line("STAT " .. stat.Name .. " -> " .. tostring(stat.Value))
end)
end)
end
end
end)
--=========================================================================
-- 6. prompt triggers -- the legit steal timeline
--=========================================================================
pcall(function()
for _, inst in ipairs(workspace:GetDescendants()) do
if inst:IsA("ProximityPrompt") and inst:FindFirstAncestor("AnimalPodiums") then
inst.Triggered:Connect(function()
line("PROMPT Triggered " .. short(inst))
end)
inst.PromptButtonHoldBegan:Connect(function()
line("PROMPT HoldBegan " .. short(inst))
end)
inst.TriggerEnded:Connect(function()
line("PROMPT TriggerEnded " .. short(inst))
end)
end
end
end)
--=========================================================================
-- 7. kicks / teleports -- so a capture ending in a kick says why
--=========================================================================
LocalPlayer.OnTeleport:Connect(function(state)
line("TELEPORT state=" .. tostring(state)); save("teleport")
end)
pcall(function()
local cg = (gethui and gethui()) or game:GetService("CoreGui")
cg.DescendantAdded:Connect(function(d)
if d:IsA("TextLabel") or d:IsA("TextButton") then
local low = tostring(d.Text or ""):lower()
if low:find("kick") or low:find("ban") or low:find("cheat")
or low:find("disconnect") or low:find("suspicious") then
line("GUI! " .. short(d.Text)); save("kicktext")
end
end
end)
end)
--=========================================================================
-- flush
--=========================================================================
function save(reason) -- assigns the forward-declared local
if not canWrite then return end
pcall(function()
if mkfolder and isfolderF and not isfolderF(FOLDER) then mkfolder(FOLDER) end
end)
local header = table.concat({
"Steal a Brainrot PASSIVE capture (no hooks)",
"writefile: " .. tostring(canWrite),
"lines: " .. #log,
"reason: " .. reason,
string.rep("-", 60),
}, "\n")
pcall(function() writefile(FILE, header .. "\n" .. table.concat(log, "\n")) end)
end
task.spawn(function()
while true do task.wait(5); save("auto") end
end)
if type(getgenv) == "function" then
getgenv().NMHUB_SAVE_CAPTURE = function() save("manual") end
end
--=========================================================================
-- on-screen readout
--=========================================================================
local gui = Instance.new("ScreenGui")
gui.Name = "SabRecorder"; gui.ResetOnSpawn = false; gui.IgnoreGuiInset = true
pcall(function() gui.Parent = (gethui and gethui()) or game:GetService("CoreGui") end)
if not gui.Parent then gui.Parent = LocalPlayer:WaitForChild("PlayerGui") end
local lbl = Instance.new("TextLabel")
lbl.Size = UDim2.new(0, 470, 0, 54)
lbl.Position = UDim2.new(0, 12, 0, 12)
lbl.BackgroundColor3 = Color3.fromRGB(16, 16, 22)
lbl.BackgroundTransparency = 0.1
lbl.TextColor3 = Color3.fromRGB(120, 255, 150)
lbl.Font = Enum.Font.Code
lbl.TextSize = 13
lbl.TextXAlignment = Enum.TextXAlignment.Left
lbl.TextYAlignment = Enum.TextYAlignment.Top
lbl.TextWrapped = true
lbl.Text = "recording (passive, no hooks)..."
lbl.Parent = gui
task.spawn(function()
while true do
task.wait(0.5)
lbl.Text = string.format(
"REC (passive) %ss | %d events\nfile: %s\ndo ONE steal by hand, then send me the file",
(stamp():gsub("%s","")), #log,
canWrite and FILE or "NO writefile -- console fallback")
if not canWrite and #log % 50 == 0 then print(table.concat(log, "\n")) end
end
end)
line("passive recorder started -- no metatable hooks, nothing to detect")
save("start")
print("[recorder] passive. Do one steal by hand, then send me: " .. FILE)