liablelua / Utility

For Celery/Solara, a Utility to help with Exploiting! 🛠️
8 stars 2 forks source link

Partly rewritten #2

Closed 78n closed 1 month ago

78n commented 1 month ago

I dont care enough to fork it and I didnt test any of it 🤑

local startgetTime = os.clock()

assert(identifyexecutor, "Executor name not found!")
assert(executorName, "Executor not found!")
assert(getidentity, "Missing getidentity function!")
assert(rconsoleprint, "Missing rconsoleprint!")

local executorName = identifyexecutor() :: string

assert(not executorName:find("Wave") or getidentity() <= 6, "Utility has been blocked for Wave and Level 6 and under executors.")

local getgenv = getgenv or shared or _G --I've seen some things not even have shared

local function dbgprint(...)
    rconsoleprint("(Utility) [PRINT]: ".. ...)
end

local function dbgwarn(...)
    rconsoleprint("(Utility) [WARNING]: ".. ...)
end

-- You could localize the env/getgenv() but im not going to because im lazyyyy
local printEnabled = true
local supportedRobloxVersion = "0.636.1.6360627"
local CurrentVersion = version() :: string
local Players = game:GetService("Players") :: Players
local LocalPlayer = Players.LocalPlayer :: Player
local CoreGui = (gethui and gethui() or game:GetService("CoreGui") or Players.LocalPlayer:WaitForChild("PlayerGui")) :: BasePlayerGui -- this typing isnt technically true if gethui exists
local Character : Model? = LocalPlayer.Character
local Humanoid : Humanoid? = Character and Character:FindFirstChildWhichIsA("Humanoid")

LocalPlayer.CharacterAdded:Connect(function(char : Model) : ()
    Character = char
    Humanoid = char:WaitForChild("Humanoid", 5)
end)

do -- Print Utility Information
    local Contributors = {
        "Trax (traxxy123)",
        "RazAPIx64.dll (razzoni)",
        "xyzkade (xyzkade)",
        "Sashaa169 (centerepic)"
    }

    local UtilityVersion = "v3.0.0"

    local changeLog = {
        ["v3.0.0"] = {

        },
        ["v2.2.0"] = {
            "Cleaned up and refactored code.",
            "Increased integrity of utility, should be less error prone now."
        },
        ["v2.1.1"] = {
            "Optimizations and more stuff by xyzkade!",
            "Character functions! (swim, speed, jump, sit)",
            "UNC test! (unc)"
        }
    }

    local changeLogString = ""
    for version, changes in changeLog do -- you dont need an iteration function just use nothing
        changeLogString ..= "Changelog for " .. version .. ":\n - "..table.concat(changes, "\n - ")
    end

    dbgprint(
        "Utility Stable " .. UtilityVersion .. "\n",
        "Contact liablelua for any bugs or issues\n",
        "Contributors:\n",
        table.concat(Contributors, "\n"), -- you knew about the function so why didnt you use it ^^^
        "\n" .. changeLogString
    )
end

do -- Load executor-specific patches
    local executorPatches = {
        ["Celery"] = function()
            loadstring(game:HttpGet("https://raw.githubusercontent.com/liablelua/Utility/main/getCeleryVersion.lua"))() -- would be so much better just to do the versuib http request inside this script instead of having 2 http requests
            local CeleryVersion = getCeleryVersion()

            if CeleryVersion == "2.0.9" or CurrentVersion == "0.636.1.6360627" then
                dbgwarn("⚠️ You are using an Unstable Celery Version (v2.0.9)")
                dbgprint("✅ Applying cloneref patch to environment.")
                cloneref = function(e) return e end
            end

            dbgprint("👽 Running Celery v" .. CeleryVersion)
        end
    }

    if executorPatches[executorName] then
        task.defer(executorPatches[executorName]) -- no point in yielding for the http request ^^^
    else
        dbgwarn("⚠️ No patches available for your executor, script may not work as intended.")
    end
end

if saveinstance == nil then
    saveinstance = function(Options : {[any] : any})
        saveinstance = loadstring(game:HttpGet("https://raw.githubusercontent.com/luau/SynSaveInstance/main/saveinstance.luau"))() -- now your init's faster because you dont have to have an http request yield
        saveinstance(Options)
    end
end

dbgprint("🛠️ Running Roblox Version: v" .. version())

if CurrentVersion ~= supportedRobloxVersion then
    dbgwarn("⚠️ Utility may be patched for this Roblox Update, wait for an update on Utility's end.") -- did you forget about dbgwarn? why did you use warn?
end

NukeUtility = function()    
    getgenv().UtilityLoaded = nil
    getgenv().UtilityStorage = nil
    getgenv().Hooks = nil
    table.clear(getgenv().Remotes)
    getTime = nil
    hook = nil
    unhook = nil
    remotescan = nil
    key = nil
    prompt = nil
    notification = nil
    uload = nil
    headshot = nil
    logs = nil
    test = nil
end

getTime = function()
    local CurgetTime = os.date("!*t")
    return "["..CurgetTime.hour..":"..CurgetTime.min..":"..CurgetTime.sec.."]"
end

-- Don't mind "getTime" it's used for logging certain things and whatnot.
-- NukeUtility() -- Uncomment if your testing Utility Source

local utilityVersion = "stable-dc772e43300b07754f4739b746938a15"
local update = game:HttpGet("https://raw.githubusercontent.com/liablelua/Utility/main/version_update.txt"):gsub("^%s*(.-)%s*$", "%1") -- so pointless but whatever floats your boat

if update ~= utilityVersion then
    table.insert(getgenv().UtilityStorage, getTime() .. ": Utility has a new update (" .. update .. ") and needs to be downloaded soon.")
end

if getgenv().UtilityLoaded ~= nil then
    table.insert(getgenv().UtilityStorage, getTime()..(type(getgenv().UtilityLoaded) == "boolean" and (getgenv().UtilityLoaded and ": Utility has already been loaded, don't execute again." or ": Utility is loading, don't execute again.")) or ": Utility has failed to load.")
else
    -- im not touching this area this is a mess in of itself
    local AntiTamper = {}
    getgenv().UtilityLoaded = false
    getgenv().UtilityStorage = {}
    getgenv().Hooks = {}
    getgenv().Remotes = {}

    table.insert(getgenv().UtilityStorage, getTime()..": Utility started.")

    hook = function(rem, func)
        if getgenv().Hooks[rem.Name] == nil then
            table.insert(getgenv().UtilityStorage, getTime()..": Used hook on "..rem.Name..".")
            getgenv().Hooks[rem.Name] = rem.OnClientEvent:Connect(func)
        end
    end

    unhook = function(rem)
        if getgenv().Hooks[rem.Name] then
            table.insert(getgenv().UtilityStorage, getTime()..": Removed hook on "..rem.Name..".")
            getgenv().Hook[rem.Name] = nil
        end
    end

    remotescan = function(scan : Instance, deep : boolean)
        table.insert(getgenv().UtilityStorage, getTime()..": Used Remote Scan on "..scan.Name..".")
        local Children = scan:GetChildren()

        for _, b : Instance in next, Children do
            table.insert(getgenv().UtilityStorage, getTime() .. ": Scanned: " ..b.Name.. ".")
            dbgprint(b.Name .. " | " .. b.ClassName)
            if deep ~= nil then
                if typeof(deep) == "boolean" then
                    for _, d in b:GetChildren() do
                        table.insert(getgenv().UtilityStorage, getTime()..": Scanned: "..d.Name..".")
                        dbgprint(d.Name .. " | " .. d.ClassName)
                    end
                else
                    break
                end
            end
        end
    end

    scanall = function(f : Instance)
        table.insert(getgenv().UtilityStorage, getTime()..": Scanning, "..f.Name..".")

        for _, v : Instance in next, f:GetDescendants() do
            if v:IsA("RemoteEvent") and v.Parent:IsA("Folder") then
                table.insert(getgenv().Remotes, v)
            end
        end

    end

    key = function(keyInput, keyWeb)
        table.insert(getgenv().UtilityStorage, getTime()..": Key system loaded.")

        local theKey = string.gsub(game:HttpGet(keyWeb), "^%s*(.-)%s*$", "%1")

        if theKey == keyInput then
            return true
        else
            return false
        end
    end

    prompt = function(promptText : string, cancelText : string, acceptText : string, cancelFunction : any, acceptFunction : any)
        table.insert(getgenv().UtilityStorage, getTime()..": Prompt loaded.")

        local CancelButton = Instance.new("TextButton")
        local AcceptButton = Instance.new("TextButton")

        do -- UI Initialization

            local prompt = Instance.new("ScreenGui")
            local Frame = Instance.new("Frame")
            local UICorner = Instance.new("UICorner")
            local Frame_2 = Instance.new("Frame")
            local TextLabel = Instance.new("TextLabel")
            local TextLabel2 = Instance.new("TextLabel")

            local UICorner_2 = Instance.new("UICorner")

            local UICorner_3 = Instance.new("UICorner")
            local UISizeConstraint = Instance.new("UISizeConstraint")

            prompt.ZIndexBehavior = Enum.ZIndexBehavior.Sibling

            Frame.AnchorPoint = Vector2.new(0.5, 0.5)
            Frame.BackgroundColor3 = Color3.new(0.227451, 0.227451, 0.227451)
            Frame.BackgroundTransparency = 0.5
            Frame.BorderSizePixel = 0
            Frame.Position = UDim2.new(0.5, 0, 0.5, 0)
            Frame.Size = UDim2.new(0.300000012, 0, 0.300000012, 0)

            Frame_2.BackgroundColor3 = Color3.new(0.513726, 0.513726, 0.513726)
            Frame_2.BackgroundTransparency = 0.5
            Frame_2.BorderSizePixel = 0
            Frame_2.Position = UDim2.new(0, 0, 0.200000003, 0)
            Frame_2.Size = UDim2.new(1, 0, 0, 2)
            Frame_2.ZIndex = 2

            TextLabel.BackgroundTransparency = 1
            TextLabel.Position = UDim2.new(0, 0, 8.70190391e-08, 0)
            TextLabel.Size = UDim2.new(0, 350, 0, 35)
            TextLabel.Font = Enum.Font.BuilderSans
            TextLabel.Text = "Prompt"
            TextLabel.TextColor3 = Color3.new(1, 1, 1)
            TextLabel.TextScaled = true
            TextLabel.TextSize = 14
            TextLabel.TextWrapped = true

            TextLabel2.BackgroundTransparency = 1
            TextLabel2.Position = UDim2.new(8.70190391e-08, 0, 0.24522391, 0)
            TextLabel2.Size = UDim2.new(0, 350, 0, 74)
            TextLabel2.Font = Enum.Font.BuilderSans
            TextLabel2.Text = promptText
            TextLabel2.TextColor3 = Color3.new(1, 1, 1)
            TextLabel2.TextSize = 14
            TextLabel2.TextWrapped = true

            CancelButton.BackgroundColor3 = Color3.new(0.141176, 0.141176, 0.141176)
            CancelButton.BackgroundTransparency = 0.5
            CancelButton.BorderSizePixel = 0
            CancelButton.Position = UDim2.new(0.0251197852, 0, 0.666999996, 0)
            CancelButton.Size = UDim2.new(0.449999988, 0, 0.300000012, 0)
            CancelButton.Font = Enum.Font.BuilderSansExtraBold
            CancelButton.Text = cancelText
            CancelButton.TextColor3 = Color3.new(1, 1, 1)
            CancelButton.TextSize = 14

            AcceptButton.BackgroundColor3 = Color3.new(0.141176, 0.141176, 0.141176)
            AcceptButton.BackgroundTransparency = 0.5
            AcceptButton.BorderSizePixel = 0
            AcceptButton.Position = UDim2.new(0.520727217, 0, 0.666999996, 0)
            AcceptButton.Size = UDim2.new(0.449999988, 0, 0.300000012, 0)
            AcceptButton.Font = Enum.Font.BuilderSansExtraBold
            AcceptButton.Text = acceptText
            AcceptButton.TextColor3 = Color3.new(1, 1, 1)
            AcceptButton.TextSize = 14

            UISizeConstraint.MaxSize = Vector2.new(350, 175)
            UISizeConstraint.MinSize = Vector2.new(350, 175)

            UICorner_2.Parent = AcceptButton
            UISizeConstraint.Parent = Frame
            UICorner_3.Parent = AcceptButton
            AcceptButton.Parent = Frame
            AcceptButton.Parent = Frame
            TextLabel2.Parent = Frame
            TextLabel.Parent = Frame
            Frame_2.Parent = Frame
            UICorner.Parent = Frame
            Frame.Parent = prompt
            prompt.Parent = CoreGui

        end

        CancelButton.MouseButton1Down:Once(function()
            prompt:Destroy()
            cancelFunction()
        end)

        AcceptButton.MouseButton1Down:Connect(function()
            prompt:Destroy()
            acceptFunction()
        end)
    end

    notification = function(text : string, notificationTime : number)
        table.insert(getgenv().UtilityStorage, getTime() .. ": Notification loaded.")

        local Notification = Instance.new("ScreenGui")

        do -- UI Initialization
            local Frame2 = Instance.new("Frame")
            local UICorner = Instance.new("UICorner")
            local Frame = Instance.new("Frame")
            local TextLabel = Instance.new("TextLabel")
            local TextLabel2 = Instance.new("TextLabel")
            local UISizeConstraint = Instance.new("UISizeConstraint")

            Notification.ZIndexBehavior = Enum.ZIndexBehavior.Sibling

            Frame2.Parent = Notification
            Frame2.AnchorPoint = Vector2.new(0.5, 0.5)
            Frame2.BackgroundColor3 = Color3.new(0.227451, 0.227451, 0.227451)
            Frame2.BackgroundTransparency = 0.5
            Frame2.BorderSizePixel = 0
            Frame2.Position = UDim2.new(0.5, 0, 0.150000006, 0)
            Frame2.Size = UDim2.new(0.300000012, 0, 0.185211286, 0)

            Frame.BackgroundColor3 = Color3.new(0.513726, 0.513726, 0.513726)
            Frame.BackgroundTransparency = 0.5
            Frame.BorderSizePixel = 0
            Frame.Position = UDim2.new(0, 0, 0.200000003, 0)
            Frame.Size = UDim2.new(1, 0, 0, 1)

            TextLabel.BackgroundTransparency = 1
            TextLabel.BorderSizePixel = 0
            TextLabel.Position = UDim2.new(8.70190391e-08, 0, 9.78964181e-08, 0)
            TextLabel.Size = UDim2.new(0, 350, 0, 24)
            TextLabel.Font = Enum.Font.BuilderSans
            TextLabel.Text = "Notification"
            TextLabel.TextColor3 = Color3.new(1, 1, 1)
            TextLabel.TextScaled = true
            TextLabel.TextSize = 14
            TextLabel.TextWrapped = true

            TextLabel2.BackgroundTransparency = 1
            TextLabel2.Position = UDim2.new(8.70190391e-08, 0, 0.24522391, 0)
            TextLabel2.Size = UDim2.new(0, 350, 0, 74)
            TextLabel2.Font = Enum.Font.BuilderSans
            TextLabel2.Text = text
            TextLabel2.TextColor3 = Color3.new(1, 1, 1)
            TextLabel2.TextSize = 14
            TextLabel2.TextWrapped = true

            UISizeConstraint.MaxSize = Vector2.new(350, 116)
            UISizeConstraint.MinSize = Vector2.new(350, 116)

            UISizeConstraint.Parent = Frame2
            TextLabel2.Parent = Frame2
            TextLabel.Parent = Frame2
            UICorner.Parent = Frame2
            Frame.Parent = Frame2
            Notification.Parent = CoreGui
        end

        task.delay(notificationTime, function()
            Notification:Destroy()
        end)
    end

    registerTampers = function(variables)
        table.insert(getgenv().UtilityStorage, getTime()..": Registered tamper variables.")
        for i, v in variables do
            AntiTamper[i] = v
        end
    end

    updateTamper = function(var,upd)
        table.insert(getgenv().UtilityStorage, getTime()..": Updated tamper variables.")
        AntiTamper[var] = upd
    end

    checkTamper = function(vars)
        table.insert(getgenv().UtilityStorage, getTime()..": Tamper check started.")
        local Tampered = false
        for i, v in vars do
            if not (AntiTamper[i] == v and v == vars[i]) then
                table.insert(getgenv().UtilityStorage, getTime()..": The variables were tampered with.")
                Tampered = true
            end
        end
        return Tampered
    end

    uload =  function(x) -- legit has a function called loadfile but i mean whateverrrr
        table.insert(getgenv().UtilityStorage, getTime()..": uload used for link: "..x..".")
        return loadstring(readfile(x))
    end

    headshot = function(id) 
        table.insert(getgenv().UtilityStorage, getTime()..": Headshot used for UID: "..tostring(id)..".")
        local HeadShot = Players:GetUserThumbnailAsync(id, Enum.ThumbnailType.HeadShot, Enum.ThumbnailSize.Size420x420)
        return HeadShot
    end

    logs = function(ret)

        if ret then
            -- unnessasary check because you legit check ^^^
            return getgenv().UtilityStorage
        end

        for i,v in getgenv().UtilityStorage do
            dbgprint(v)
        end
    end

    antiskid = function(scOwner,scValue) -- dumbest stuff i've ever seen/ so pointless a skid will JUST REMOVE IT IF THEY CARE WHICH THEY DONT
        table.insert(getgenv().UtilityStorage, getTime()..": Anti-Skid Protection Ran.")

        if scValue ~= scOwner then

            task.spawn(function()
                while task.wait() do
                    NukeUtility()
                end
            end)

            task.wait(2)

            LocalPlayer:Kick("❎ THE OWNER OF THIS SCRIPT IS A SKID ❎ [Kicked by Utility Anti-Skid]") -- dumb
            string.rep("you're welcome", 1/0)
        end
    end

    speed = function(val : number)
        if Humanoid then
            Humanoid.WalkSpeed = val
        end
    end

    jump = function(val : number)
        if Humanoid then
            Humanoid.JumpPower = val
        end
    end

    sit = function()
        if Humanoid then
            Humanoid.Sit = not Humanoid.Sit
        end
    end

    swim = function()
        if Humanoid then
            if Humanoid:GetState() ~= Enum.HumanoidStateType.Swimming then
                Humanoid:SetStateEnabled("GettingUp", false) -- personally would use the nums but whatever
                Humanoid:ChangeState("Swimming")
            else
                Humanoid:SetStateEnabled("GettingUp", true)
            end
        end

    end

    unc = function()
        loadstring(game:HttpGet("https://raw.githubusercontent.com/unified-naming-convention/NamingStandard/main/UNCCheckEnv.lua"))() -- i hate unc
    end

    iy = function()
        -- the one time you use task.spawn in the WRONG PLACE
        loadstring(game:HttpGet("https://raw.githubusercontent.com/EdgeIY/infiniteyield/master/source"))()
    end

    fromhex = Color3.fromHex -- man making a function just for it to already exist. I can relate

    tohex = function(str : string)
        return str:gsub('.', function(c) return string.format('%02X', string.byte(c)) end)
    end

    runtests = function()
        dbgprint("")
        table.insert(getgenv().UtilityStorage, getTime()..": Started compatibility test.")

        local testfuncs = {
            {hook, "Local Hooking"},
            {unhook, "Local Unhooking"},
            {remotescan, "Remote Scanner"},
            {key, "Key System"},
            {prompt, "Prompt Library"},
            {notification, "Notification Library"},
            {headshot, "Player Headshots"},
            {logs, "Utility Logger"},
            {speed, "Humanoid Properties"},
            {unc, "UNC Tests"},
            {iy, "Infinite Yield"},
            {fromhex, "Hex Conversions"}
        }

        for _, v in testfuncs do
            if v[1] == nil then
                dbgprint("❎ "..v[2].." not found.")
            else
                dbgprint("✅ "..v[2].." found.")
            end
        end

        if antiskid ~= nil then dbgprint("✅ antiskid function") else dbgprint("❎ antiskid function") -- soooo pointlesssss
            task.spawn(function()
                while task.wait(1) do
                    NukeUtility()
                end
            end)
            task.wait(2)
            LocalPlayer:Kick("⚠️ THIS SKID THOUGHT HE COULD BYPASS ANTISKID? ⚠️")
        end

        if NukeUtility ~= nil then dbgprint("✅ NukeUtility function") else dbgprint("❎ NukeUtility function") -- legit does NOT MATTER
            task.spawn(function()  
                while task.wait(1) do
                    NukeUtility()
                end
            end)
            task.wait(2)
            LocalPlayer:Kick("⚠️ THIS SKID THOUGHT HE COULD BYPASS ANTISKID? ⚠️")
        end

        if checkTamper ~= nil and updateTamper ~= nil and registerTampers ~= nil then dbgprint("✅ Tamper functions") else dbgprint("❎ Tamper functions") 
            task.spawn(function()  
                while task.wait(1) do
                    NukeUtility()
                end
            end)
            task.wait(2)
            LocalPlayer:Kick("⚠️ THIS SKID THOUGHT HE COULD BYPASS ANTISKID? ⚠️")
        end

        table.insert(getgenv().UtilityStorage, getTime() .. ": Finished compatibility test.")
    end

    -- Final Anti-Skid measures (unbypassable? [all it takes is a little backspacing to remove the code :money_mouth:])

    task.spawn(function()
        while task.wait(10) do
            if antiskid == nil or NukeUtility == nil or test == nil or checkTamper == nil or updateTamper == nil or registerTampers == nil then
                getgenv().UtilityLoaded = nil
                getgenv().UtilityStorage = nil
                getgenv().Hooks = nil
                getgenv().Remotes = {}
                getTime = nil
                hook = nil
                unhook = nil
                remotescan = nil
                key = nil
                prompt = nil
                notification = nil
                uload = nil
                headshot = nil
                logs = nil
                test = nil
                task.wait(2)
                LocalPlayer:Kick("⚠️ THIS SKID THOUGHT HE COULD BYPASS ANTISKID? ⚠️")
            end
        end
    end)

    table.insert(getgenv().UtilityStorage, getTime()..": Utility loaded.")

    runtests()
    getgenv().UtilityLoaded = true
end

--final note wouldn't it make more sense to yield the thread instead of spawning a new thread if they're "skidding"
liablelua commented 1 month ago

I don't see any reason to accept this, other than me making my own Patch update later. Thanks for trying, though.