diff --git a/.gitignore b/.gitignore index 80087609..1566227a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,42 @@ -debug.lua -selene.toml -roblox.toml -.vscode -/user \ No newline at end of file +``` +# Compiled files +*.pyc +*.class +*.o +*.obj +*.out + +# Dependencies +node_modules/ +venv/ +.venv/ +__pycache__/ +.mypy_cache/ +.pytest_cache/ +target/ +.gradle/ + +# Build artifacts +dist/ +build/ +coverage/ +htmlcov/ +.coverage + +# Editor/IDE files +.vscode/ +.idea/ +*.swp +*.swo +*.tmp + +# System files +.DS_Store +Thumbs.db +.env +.env.local +*.env.* + +# Logs +*.log +``` \ No newline at end of file diff --git a/Hydroxide b/Hydroxide new file mode 160000 index 00000000..15db25e4 --- /dev/null +++ b/Hydroxide @@ -0,0 +1 @@ +Subproject commit 15db25e48b2ae2924033ebada1436c7253626781 diff --git a/Screenshot_2026-04-29-15-05-59-285_com.roblox.client.jpg b/Screenshot_2026-04-29-15-05-59-285_com.roblox.client.jpg new file mode 100644 index 00000000..58ffc2b2 Binary files /dev/null and b/Screenshot_2026-04-29-15-05-59-285_com.roblox.client.jpg differ diff --git a/Screenshot_2026-04-29-15-06-08-074_com.roblox.client.jpg b/Screenshot_2026-04-29-15-06-08-074_com.roblox.client.jpg new file mode 100644 index 00000000..fc653769 Binary files /dev/null and b/Screenshot_2026-04-29-15-06-08-074_com.roblox.client.jpg differ diff --git a/init.lua b/init.lua index 3e319356..85492381 100644 --- a/init.lua +++ b/init.lua @@ -5,10 +5,17 @@ if oh then end local web = true -local user = "Upbolt" -- change if you're using a fork +local user = "Upbolt" local branch = "revision" local importCache = {} +local pairs = pairs +local type = type +local unpack = unpack +local getfenv = getfenv +local rawget = rawget +local pcall = pcall + local function hasMethods(methods) for name in pairs(methods) do if not environment[name] then diff --git a/loader.lua b/loader.lua new file mode 100644 index 00000000..4d6797f4 --- /dev/null +++ b/loader.lua @@ -0,0 +1,51 @@ +local owner = "Yuki-1224-nazz" +local branch = "revision" + +-- Cache frequently used functions for performance +local pairs = pairs +local type = type +local unpack = unpack or table.unpack +local pcall = pcall +local loadstring = loadstring +local game = game + +-- Optimized web import with caching and error handling +local importCache = {} + +local function webImport(file) + -- Return cached result if available + if importCache[file] then + return unpack(importCache[file]) + end + + local success, result = pcall(function() + local url = ("https://raw.githubusercontent.com/%s/Hydroxide/%s/%s.lua"):format(owner, branch, file) + local content = game:HttpGetAsync(url) + + if not content or content == "" then + return nil + end + + local func = loadstring(content, file .. '.lua') + if func then + return func() + end + + return nil + end) + + if success and result ~= nil then + importCache[file] = {result} + return result + end + + return nil +end + +-- Load main module first (initializes oh environment) +local initResult = webImport("init") + +-- Load UI module +if initResult then + webImport("ui/main") +end diff --git a/modules/ClosureSpy.lua b/modules/ClosureSpy.lua index 616872f0..ac3692d5 100644 --- a/modules/ClosureSpy.lua +++ b/modules/ClosureSpy.lua @@ -1,5 +1,26 @@ local ClosureSpy = {} +local hookFunction = hookFunction +local newCClosure = newcclosure +local isLClosure = islclosure +local getProtos = getprotos +local getUpvalues = getupvalues +local getUpvalue = getupvalue +local getContext = getthreadcontext +local setContext = setthreadcontext +local setUpvalue = setupvalue +local getConstants = getconstants +local getConstant = getconstant +local setConstant = setconstant +local getCallingScript = getcallingscript +local pairs = pairs +local type = type +local table_insert = table.insert +local table_remove = table.remove +local table_find = table.find +local typeof = typeof +local getInfo = debug.getinfo or getinfo + local requiredMethods = { ["hookFunction"] = true, ["newCClosure"] = true, @@ -38,7 +59,7 @@ end local Hook = {} local hookMap = {} -hookCache = {} +local hookCache = {} function Hook.new(closure) local hook = {} @@ -175,14 +196,14 @@ end function Hook.incrementCalls(hook, vargs) hook.Calls = hook.Calls + 1 - table.insert(hook.Logs, vargs) + table_insert(hook.Logs, vargs) end function Hook.decrementCalls(hook, vargs) local logs = hook.Logs hook.Calls = hook.Calls - 1 - table.remove(logs, table.find(logs, vargs)) + table_remove(logs, table_find(logs, vargs)) end ClosureSpy.Hook = Hook diff --git a/modules/ConstantScanner.lua b/modules/ConstantScanner.lua index 9b924d30..2fa00994 100644 --- a/modules/ConstantScanner.lua +++ b/modules/ConstantScanner.lua @@ -2,6 +2,17 @@ local ConstantScanner = {} local Closure = import("objects/Closure") local Constant = import("objects/Constant") +local getGc = getGc or get_gc_objects +local getInfo = debug.getinfo or getinfo +local isXClosure = isXClosure +local isLClosure = islclosure +local getConstant = getconstant +local setConstant = setconstant +local getConstants = getconstants +local type = type +local pairs = pairs +local toString = toString + local requiredMethods = { ["getGc"] = true, ["getInfo"] = true, diff --git a/modules/ModuleScanner.lua b/modules/ModuleScanner.lua index 1ec05f3c..f7d6033a 100644 --- a/modules/ModuleScanner.lua +++ b/modules/ModuleScanner.lua @@ -1,6 +1,13 @@ local ModuleScanner = {} local ModuleScript = import("objects/ModuleScript") +local getMenv = getmenv or getsenv +local getProtos = getprotos +local getConstants = getconstants +local getScriptClosure = getscriptclosure +local getLoadedModules = getloadedmodules +local pairs = pairs + local requiredMethods = { ["getMenv"] = true, ["getProtos"] = true, diff --git a/modules/RemoteSpy.lua b/modules/RemoteSpy.lua index 0cbb0df9..02ff0cf3 100644 --- a/modules/RemoteSpy.lua +++ b/modules/RemoteSpy.lua @@ -1,6 +1,23 @@ local RemoteSpy = {} local Remote = import("objects/Remote") +local checkCaller = checkcaller +local newCClosure = newcclosure +local hookFunction = hookFunction +local isReadOnly = isreadonly +local setReadOnly = setreadonly +local getInfo = debug.getinfo or getinfo +local getMetatable = getrawmetatable or debug.getmetatable +local setClipboard = setclipboard +local getNamecallMethod = getnamecallmethod +local getCallingScript = getcallingscript +local pairs = pairs +local type = type +local select = select +local typeof = typeof +local pcall = pcall +local Instance_new = Instance.new + local requiredMethods = { ["checkCaller"] = true, ["newCClosure"] = true, @@ -29,15 +46,15 @@ local remotesViewing = { } local methodHooks = { - RemoteEvent = Instance.new("RemoteEvent").FireServer, - RemoteFunction = Instance.new("RemoteFunction").InvokeServer, - BindableEvent = Instance.new("BindableEvent").Fire, - BindableFunction = Instance.new("BindableFunction").Invoke + RemoteEvent = Instance_new("RemoteEvent").FireServer, + RemoteFunction = Instance_new("RemoteFunction").InvokeServer, + BindableEvent = Instance_new("BindableEvent").Fire, + BindableFunction = Instance_new("BindableFunction").Invoke } local currentRemotes = {} -local remoteDataEvent = Instance.new("BindableEvent") +local remoteDataEvent = Instance_new("BindableEvent") local eventSet = false local function connectEvent(callback) @@ -99,8 +116,6 @@ end) -- vuln fix -local pcall = pcall - local function checkPermission(instance) if (instance.ClassName) then end end diff --git a/modules/ScriptScanner.lua b/modules/ScriptScanner.lua index 8594ab11..ca011fc3 100644 --- a/modules/ScriptScanner.lua +++ b/modules/ScriptScanner.lua @@ -1,6 +1,18 @@ local ScriptScanner = {} local LocalScript = import("objects/LocalScript") +local getGc = getGc or get_gc_objects +local getSenv = getsenv +local getProtos = getprotos +local getConstants = getconstants +local getScriptClosure = getscriptclosure +local isXClosure = isXClosure +local getfenv = getfenv +local rawget = rawget +local type = type +local pairs = pairs +local typeof = typeof + local requiredMethods = { ["getGc"] = true, ["getSenv"] = true, diff --git a/modules/UpvalueScanner.lua b/modules/UpvalueScanner.lua index e2489d95..9f866300 100644 --- a/modules/UpvalueScanner.lua +++ b/modules/UpvalueScanner.lua @@ -2,6 +2,17 @@ local UpvalueScanner = {} local Closure = import("objects/Closure") local Upvalue = import("objects/Upvalue") +local getGc = getGc or get_gc_objects +local isXClosure = isXClosure +local getUpvalue = getUpvalue or getupvalue +local setUpvalue = setUpvalue or setupvalue +local getUpvalues = getUpvalues or getupvalues +local type = type +local pairs = pairs +local typeof = typeof +local getInfo = getInfo or debug.getinfo +local toString = toString + local requiredMethods = { ["getGc"] = true, ["getInfo"] = true, @@ -18,7 +29,7 @@ local function compareUpvalue(query, upvalue, ignore) local numberCheck = not ignore and upvalueType == "number" and not isTableIndex and (tonumber(query) == upvalue or ("%.2f"):format(upvalue) == query) if upvalueType == "userdata" then - if typeof(upvalueType) == "Instance" then + if typeof(upvalue) == "Instance" then local instanceName = upvalue.Name return (instanceName == query or instanceName:find(query)) end @@ -29,7 +40,7 @@ local function compareUpvalue(query, upvalue, ignore) return query == closureName or closureName:lower():find(query:lower()) end - return stringCheck or numberCheck or userDataCheck + return stringCheck or numberCheck end local function scan(query, deepSearch) diff --git a/objects/Constant.lua b/objects/Constant.lua index 1889e68b..22cd0106 100644 --- a/objects/Constant.lua +++ b/objects/Constant.lua @@ -13,12 +13,12 @@ function Constant.new(closure, index, value) end function Constant.set(constant, value) - setConstant(constant.Closure, constant.Index, value) + oh.Methods.setConstant(constant.Closure, constant.Index, value) constant.Value = value end function Constant.update(constant) - constant.Value = getConstant(constant.Closure, constant.Index) + constant.Value = oh.Methods.getConstant(constant.Closure, constant.Index) end return Constant \ No newline at end of file diff --git a/objects/LocalScript.lua b/objects/LocalScript.lua index ea988733..cc81ff22 100644 --- a/objects/LocalScript.lua +++ b/objects/LocalScript.lua @@ -6,7 +6,7 @@ function LocalScript.new(instance) localScript.Instance = instance localScript.Environment = getSenv(instance) - localScript.Constants = getConstants(closure) + localScript.Constants = oh.Methods.getConstants(closure) localScript.Protos = getProtos(closure) return localScript diff --git a/objects/ModuleScript.lua b/objects/ModuleScript.lua index 9cca856c..97958c9b 100644 --- a/objects/ModuleScript.lua +++ b/objects/ModuleScript.lua @@ -5,7 +5,7 @@ function ModuleScript.new(instance) local closure = getScriptClosure(instance) moduleScript.Instance = instance - moduleScript.Constants = getConstants(closure) + moduleScript.Constants = oh.Methods.getConstants(closure) moduleScript.Protos = getProtos(closure) --moduleScript.ReturnValue = require(instance) // causes detection diff --git a/objects/Remote.lua b/objects/Remote.lua index 0ae49a33..505b2cd0 100644 --- a/objects/Remote.lua +++ b/objects/Remote.lua @@ -1,5 +1,12 @@ local Remote = {} +local pairs = pairs +local type = type +local table_insert = table.insert +local table_remove = table.remove +local table_find = table.find +local typeof = typeof + function Remote.new(instance) local remote = {} @@ -85,6 +92,8 @@ function Remote.areArgsBlocked(remote, args) return true end end + + return false end function Remote.areArgsIgnored(remote, args) @@ -97,18 +106,20 @@ function Remote.areArgsIgnored(remote, args) return true end end + + return false end function Remote.incrementCalls(remote, vargs) remote.Calls = remote.Calls + 1 - table.insert(remote.Logs, vargs) + table_insert(remote.Logs, vargs) end function Remote.decrementCalls(remote, vargs) local logs = remote.Logs remote.Calls = remote.Calls - 1 - table.remove(logs, table.find(logs, vargs)) + table_remove(logs, table_find(logs, vargs)) end return Remote \ No newline at end of file diff --git a/objects/Upvalue.lua b/objects/Upvalue.lua index bae6a0b9..cb5ee2c7 100644 --- a/objects/Upvalue.lua +++ b/objects/Upvalue.lua @@ -14,12 +14,12 @@ function Upvalue.new(closure, index, value) end function Upvalue.set(upvalue, value) - setUpvalue(upvalue.Closure.Data, upvalue.Index, value) + oh.Methods.setUpvalue(upvalue.Closure.Data, upvalue.Index, value) upvalue.Value = value end function Upvalue.update(upvalue, newValue) - local value = newValue or getUpvalue(upvalue.Closure.Data, upvalue.Index) + local value = newValue or oh.Methods.getUpvalue(upvalue.Closure.Data, upvalue.Index) local scanned = upvalue.Scanned upvalue.Value = value