Hello everyone,
TL;DR (in short): Celery is a brand-new exploit, and here’s the script to detect it with an in-game LocalScript.
Scandal has put Celery Incorporated, our subsidiary, into disarray. Our users’ faith is at a critical turning point since Static, our CEO, was discovered trying to bypass Hyperion. Even if this misbehavior alone were cause for grave punishment, Static has allied himself with an unhealthy individual named Jordan, “a prominent opponent of anticheats” according to himself. It’s obvious even to people like you that this is not good for us. Thankfully, the LSA’s objectives coincide with ours, giving us the power to manage Static however we see fit.
As a member of society with limitless drive, natural affinity for Roblox development, you have been effortlessly guided by the divine. Destiny opens its gates once more, leaving you standing on uncertain ground, facing a soul-wrenching dilemma.
--// Müsli (@qtorrent)
local ContentProvider = game:GetService("ContentProvider")
local CoreGui = game:GetService("CoreGui")
local Players = game:GetService("Players")
local BLACKLISTED_CONTENT = {
"rbxassetid://1204397029",
"rbxassetid://3523243755",
"rbxassetid://4911962991",
"rbxassetid://129697930",
"rbxassetid://5147488658",
"rbxassetid://5147488592",
"rbxassetid://5147695474",
"rbxassetid://5054663650",
"rbxassetid://6234691350",
"rbxassetid://1352543873",
"rbxassetid://4113050383",
"rbxassetid://2406617031",
}
local SERVICE_NAMES = {
"Players",
"ScriptContext",
"Workspace",
"ContentProvider",
"Debris",
"StarterPack",
}
for _, serviceName in SERVICE_NAMES do
local service = game:GetService(serviceName)
service.Name = ""
task.delay(0, function()
service:GetPropertyChangedSignal("Name"):Connect(function()
-- warn("Unexpected service's name change!")
service.Name = ""
end)
end)
end
-- Players.Name = ""
game.Name = ""
task.delay(0, function()
if (not game:IsLoaded()) then
game.Loaded:Wait()
end
local LocalPlayer = Players.LocalPlayer or Players.PlayerAdded:Wait()
local ChildAdded
ChildAdded = LocalPlayer.ChildAdded:Connect(function(child)
if (child.ClassName ~= "PlayerScripts") then return end
child.Name = ""
child:GetPropertyChangedSignal("Name"):Connect(function()
-- warn("Unexpected child's name change!")
child.Name = ""
end)
ChildAdded:Disconnect()
end)
local PlayerScripts = LocalPlayer:WaitForChild("PlayerScripts", 30)
if (PlayerScripts) then
PlayerScripts.Name = ""
PlayerScripts:GetPropertyChangedSignal("Name"):Connect(function()
-- warn("Unexpected PlayerScripts' name change!")
PlayerScripts.Name = ""
end)
end
end)
local DecoyPart = Instance.new("Part")
while true do
if (_G.IY_DEBUG) then -- Since new Celery's binary auto-executes IY, I assume
warn("IY detected!")
end
ContentProvider:PreloadAsync({DecoyPart, CoreGui}, function(content, assetFetchStatus)
content = string.gsub(string.lower(content), "rbxassetid://", "")
if (table.find(BLACKLISTED_CONTENT, content)) then
warn("IY detected!")
end
end)
task.wait(5)
end
Text written only, and solely by Acedia!