· 6 years ago · Jul 06, 2019, 04:16 PM
1--[[ <
2
3 **. .*. *%\ (*) *%\
4 &&/ ./&/ *&| . . *&|
5 &&/ .(&/ *#( ./#. .*%%(/(&| .#/*%%* .*#%%#, (/. (#. .#/ .*%%(/(&| .*#%#(\
6 &@%#####&@/ ,#%* .&%* *&( *&| .@%, ,@#, %@# /&@&&, ,&( *&( *&| (&/,,,*#%
7 &&/ .(&/ .@%,(%* \&/ *&| ., ,@(. #@# ,#@@& ,&( \&/ *&| (&/,,,,,.
8 ##* *#* ./@# \(%%(**#/ .#(. ,(%%%#. .#* #%. .#/ \(%%(**#/ \%%%%%#,
9 ,%#,
10 (&*
11
12
13 ..,,,,,,,***********,,.
14 ...,,,,,,,,,,,,,,,,,,,,**********,.
15 .,,,,,,,,,,,,,,,,,,,,,,,,,,,,,**********,
16 ,,,,,......................,,,,,,,,,,,,**********,
17 ,,,..............................,,,,,,,,,,***********,
18 .,,//(###%%%%%%%%%%%%%%%##((/*,. .,,.................................,,,,,,,,,,************.
19 .*/(#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%##(*,............ ............,,,,,,,,,,************,.
20 ,/(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%(*....... ..........,,,,,,,,,*************,
21 ./(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%/,...... ........,,,,,,,,,***********//**
22 ,*#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*...... .......,,,,,,,,,************///,
23 ,/%%%%%%%%%%%%%%%%###############%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*..... ......,,,,,,,,,************///**,
24 ,(%%%%%%%%%%%###############################%%%%%%%%%%%%%%%%%%%%%%%*..... .......,,,,,,,,,************/////,
25 *(%%%%%%%%%%#####################################%#%%%%%%%%%%%%%%%%%%/,.... ......,,,,,,,,,*************/////*
26 .*%%%%%%%%%#########################################%##%%%%%%%%%%%%%%%%(,.... ......,,,,,,,,,*************////*,
27 (#%%%%%%%%################################################%%%%%%%%%%%%%%#/..... .......,,,,,,,,,*************/////*
28 ,/%%%%%%%#######################################################%%%%%%%%%%%%%%/,..... .......,,,,,,,,,,*************//////*
29 (%%%%%%%%#########################################################%%%%%%%%%%%%%#/,...... ........,,,,,,,,,,**************//////*
30 ,(%%%%%#%##########################((((((((((((((######################%%%%%%%%%%%#(......... .........,,,,,,,,,,***************///////*
31 (%%%%%%%#######################((((((((((((((((((((((################%%%%%%%%%%%%%%#*........... ...........,,,,,,,,,,,**************////////*
32 .#%%%%%%####################((((/////////////////////////((((################%%%%%%%%%%%%/,......................,,,,,,,,,,,,,,***************/////////,.
33 ,(%%%%%%%##################((((//////////////*****///////////(((##############%%%%%%%%%%%%%(,,,...............,,,,,,,,,,,,,,,,*****************/////////.
34 *#%%%%%%###################((((//////////**************////////(((#############%%%%%%%%%%%%%%#/,,,,,,,,,,,,,,,,,,,,,,,,,,,,,******************//////////*
35 .#%%%%%%##################((((////////*********************///////((############%%%%%%%%%%%%%%%%#*,,,,,,,,,,,,,,,,,,,,,,,,,*******************//////////,.
36 ,(%%%%%%%#################(((///////**************************//////((###########%%%%%%%%%%%%%%%%%%%(/*,,,,,,,,,,,,,,,***********************/////////**.
37 (%%%%%%%#################((((///////***************************//////((##########%%%%%%%%%%%%%%%%%%%%%%/*,,,,,,,**************************///////////*.
38 .%%%%%%%%%################(((///////*****************************/////((##########%%%%%%%%%%%%%%%%%%%%%%%%(******************************////////////*.
39./%%%%%%%%#################(((//////******************************/////((##########%%%%%%%%%%%%%%%%%%%%%%%%%%#(/***********************/////////////*,
40*#%%%%%%%%#################(((//////*****************************//////((##########%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#(/**********////////////////*,.
41(%%%%%%%%%##################(((///////**************************//////((##########%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&%%#(///////////////////**,.
42#%%%%%%%%%%#################(((///////**************************/////((##########%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&%%%##(((((//*,,.
43#%%%%%%%%%%##################(((////////**********************//////((###########%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&%/.
44%%%%%%%%%%%%%###################(((//////////*********//////////((############%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&&&%/.
45%%%%%%%%%%%%%####################((((/////////////////////////(((#############%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&%/.
46#%%%%%%%%%%%%%%#####################((((///////////////////(((##############%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&%/.
47#%%%%%%%%%%%%%%%#######################((((((((/////(((((((################%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&*
48/%%%%%%%%%%%%%%%%%%####################################################%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&(.
49,#%%%%%%%%%%%%%%%%%%%%%############################################%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&*
50./%%%%%%%%%%%%%%%%%%%%%%%#######################################%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&%.
51 ,%%%%%%%%%%%%%%%%%%%%%%%#####################################%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&
52 *#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%######%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&/.
53 ./%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&%.
54 .#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&%/
55 *#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*
56 ,%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%(
57 *#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/.
58 .%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%(
59 ,(&&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%,
60 .*#&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/.
61 .#%&%&&&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*
62 ,%&&&&&&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%(
63 .*(&&&&&&&&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%(.
64 ,(%&&&&&&&&&&&&&&%%%%&&&&&&&&&&&%&&&&%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%*.
65 /#%&&&&&&&&&&&&&&&&&&&&&%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/,
66 .(#&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%(,
67 ,/#&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%#,.
68 ,/(%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%&&&%/,.
69 .*(%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%#*,
70 .,*##%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%#(,.
71 .,*(#%%%&&&&&&&&&&&&&&&&&&&&%%%#(/,,
72
73Hydroxide :: nerve
74 "Hydroxide is a penetration testing tool, used to edge the security of Roblox games."
75
76<< Features:
77 > Data Explorer
78 > Data Manipulation
79 > Data Information
80 > Code Generation
81 > Script Viewer
82 > Remote Call "Spy"
83>>
84
85]]-- >
86
87-- < Existence Check >
88if ui and game:GetService("CoreGui"):FindFirstChild("Hydroxide") then -- Checks if an instances already exists
89 getgenv().ui = nil
90 game:GetService("CoreGui").Hydroxide:Destroy()
91end
92
93-- <Environment Check>
94do -- Checks if the exploit has the required functions
95 if not getgenv then
96 warn("<OH-> : Your exploit does not have getgenv, which is a vital function.")
97 return
98 end
99
100 local verified = true
101 local functions = {
102 getrawmetatable = getrawmetatable or debug.getmetatable or false,
103 setrawmetatable = setrawmetatable or debug.setmetatable or false,
104 getupvalues = debug.getupvalues or getupvalues or getupvals or false,
105 getupvalue = debug.getupvalue or getupvalue or getupval or false,
106 setupvalue = debug.setupvalue or setupvalue or setupval or false,
107 getconstants = debug.getconstants or getconstants or false,
108 setconstant = debug.setconstant or setconstant or false,
109 isexploitclosure = is_synapse_function or is_neutron_function or function() return false end,
110 setreadonly = setreadonly or false,
111 islclosure = islclosure or false,
112 getgc = getgc,
113 }
114
115 for i, f in next, functions do
116 if f then
117 getgenv()[i] = f
118 else
119 verified = false
120 print("<OH-> : Your exploit does not have " .. i)
121 end
122 end
123
124 if not verified then
125 warn("<OH-> : Your exploit must have the functions listed above in order to use Hydroxide.")
126 end
127end
128
129-- < lol? >
130for i,v in next, getreg() do
131 if type(v) == "function" and islclosure(v) then
132 local scr = getfenv(v).script
133 for k,x in next, getconstants(v) do
134 if x == "Hydroxide" and scr ~= script then
135 scr:Destroy()
136 end
137 end
138 end
139end
140
141-- < Variables >
142getgenv().ui = {}
143getgenv().abs = {}
144
145ui.addHighlight = function(element) -- Adds highlight to text when hovered over
146 element.MouseEnter:Connect(function()
147 element.TextColor3 = Color3.fromRGB(240, 240, 240)
148 element.Font = "SourceSansSemibold"
149 end)
150
151 element.MouseLeave:Connect(function()
152 element.TextColor3 = Color3.fromRGB(200, 200, 200)
153 element.Font = "SourceSans"
154 end)
155end
156
157local dataCache = {}
158local addedUpvalueCache = {}
159
160local tableCache = {}
161local functionCache = {}
162
163-- < Variables : Interface >
164local interface = game:GetObjects("rbxassetid://3426020608")[1]
165
166local drag = interface.Drag
167local messageBox = interface.MessageBox
168local searchUpvalues = interface.SearchUpvalues
169local setValueType = interface.SetValueType
170
171local body = drag.Body
172local border = drag.BorderFrame
173local collapse = drag.Collapse
174
175local sidebar = body.Sidebar
176local information = body.Information
177local console = body.Console
178local remoteSpy = body.RemoteSpy
179local viewValue = body.ViewValue
180local misc = body.Miscellaneous.List
181local welcome = body.Welcome.Scroll
182
183-- < Variables : Interface Instantiation >
184local buttonClone = sidebar._G:Clone() -- Creates a usable sidebar button template
185buttonClone.ClipsDescendants = true
186buttonClone.Icon.ImageTransparency = 0
187buttonClone.Label.Font = "SourceSans"
188buttonClone.Label.Size = UDim2.new(0, 175, 0, 20)
189sidebar._G:Destroy() -- Destroys the original button
190
191local changelogs = welcome.ChangeLogs
192changelogs.TextWrapped = true
193changelogs.Text = ''
194
195for i,v in next, misc:GetChildren() do -- Miscellaneous section clicks
196 local finished = {
197 SearchUpvalues = true
198 }
199 if v:IsA("Frame") then
200 local label = v.Label
201
202 label.MouseButton1Click:Connect(function()
203 if not finished[v.Name] then
204 ui.msg("Woops!", '"' .. label.Text .. "\" is not available yet!")
205 end
206
207 if v.Name == "SearchUpvalues" then
208 setValueType.Visible = false
209 end
210 end)
211
212 ui.addHighlight(label)
213 end
214end
215
216local changes = loadstring(game:HttpGet("https://pastebin.com/raw/TuYfxHBq"))()
217for i,v in next, changes do
218 changelogs.Text = changelogs.Text .. "• " .. v .. '\n'
219end
220
221-- < Interface : Message Box >
222messageBox.Button.MouseButton1Click:Connect(function() -- "Closes" the message box
223 messageBox.Visible = false
224 border.Visible = true
225end)
226
227ui.msg = function(title, message) -- "Creates" a message box
228 messageBox.Visible = true
229 messageBox.Title.Text = title
230 messageBox.Content.Text = message
231 border.Visible = false
232end
233
234-- < Globals : Abstractions >
235abs.isRobloxType = function(data) -- Checks if the type is Roblox-made
236 return type(data) ~= typeof(data)
237end
238
239abs.tableSize = function(table) -- Returns the number of elements in a given table
240 local size = 0
241 for i, e in next, table do
242 size = size + 1
243 end
244 return size
245end
246
247abs.getUpvalues = function()
248 local upvalues = {}
249 for i,v in next, getgc() do
250 if type(v) == "function" and not isexploitclosure(v) then
251 for k,x in next, getupvalues(v) do
252 local cache
253 local dataType = type(x)
254
255 local byValue = {string = true, boolean = true, number = true}
256
257 -- check by value -- check by key
258 if (not byValue[dataType] and not upvalues[x]) or (byValue[dataType] and not upvalues[k]) then
259 upvalues[k] = {data = x, func = v}
260 end
261 end
262 end
263 end
264
265 wait()
266 return upvalues
267end
268
269abs.scanForUpvalue = function(upvalue)
270 local upval = {}
271 for i,v in next, getgc() do
272 if type(v) == "function" then
273 if getupvalue(v, upvalue) then
274 upval.data = getupvalue(v, upvalue)
275 upval.func = v
276 break
277 end
278 end
279 end
280
281 wait()
282 return upval
283end
284
285abs.getScripts = function() -- Returns all scripts and modules which the client has access to and are not parented to nil
286 local scripts, modules = {}, {}
287 for i, f in next, getreg() do
288 if type(f) == "function" then
289 local scr = getfenv(f).script
290 if typeof(scr) == "Instance" and (not scripts[scr] or not modules[scr]) and scr.Parent ~= nil then
291 if scr:IsA("ModuleScript") then
292 modules[scr] = f
293 else
294 scripts[scr] = f
295 end
296 end
297 end
298 end
299
300 wait()
301 return scripts, modules
302end
303
304-- < Interface : Dragging > [Credits to @Tiffblocks]
305do
306 local dragging, dragInput, dragStart, startPos
307
308 drag.InputBegan:Connect(function(input)
309 if input.UserInputType == Enum.UserInputType.MouseButton1 then
310 dragging = true
311 dragStart = input.Position
312 startPos = drag.Position
313
314 input.Changed:Connect(function()
315 if input.UserInputState == Enum.UserInputState.End then
316 dragging = false
317 end
318 end)
319 end
320 end)
321
322 drag.InputChanged:connect(function(input)
323 if input.UserInputType == Enum.UserInputType.MouseMovement then
324 dragInput = input
325 end
326 end)
327
328 game:GetService("UserInputService").InputChanged:Connect(function(input)
329 if input == dragInput and dragging then
330 local delta = input.Position - dragStart
331 drag.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
332 end
333 end)
334end
335
336-- < Interface : Set Value Type >
337local svtClear = function()
338 for i,v in next, setValueType:GetChildren() do
339 if v:FindFirstChild("Label") then
340 v.Text = ''
341 v.Label.Font = "SourceSans"
342 end
343 end
344end
345
346local svtEvent
347local svtNumber = setValueType.Number
348local svtString = setValueType.String
349local svtBoolean = setValueType.Boolean
350local svtUserdata = setValueType.Userdata
351
352svtNumber.MouseButton1Click:Connect(function()
353 svtClear()
354 svtNumber.Text = '✓'
355 svtNumber.Label.Font = "SourceSansSemibold"
356end)
357
358svtString.MouseButton1Click:Connect(function()
359 svtClear()
360 svtString.Text = '✓'
361 svtString.Label.Font = "SourceSansSemibold"
362end)
363
364svtBoolean.MouseButton1Click:Connect(function()
365 svtClear()
366 svtBoolean.Text = '✓'
367 svtBoolean.Label.Font = "SourceSansSemibold"
368end)
369
370svtUserdata.MouseButton1Click:Connect(function()
371 svtClear()
372 svtUserdata.Text = '✓'
373 svtUserdata.Label.Font = "SourceSansSemibold"
374end)
375
376-- < Interface : Information >
377local typeIcon = {
378 string = 3426079582,
379 number = 3426079582,
380 boolean = 3426079582,
381 table = 3426087157,
382 userdata = 3426089331,
383 ["function"] = 3426090918
384}
385
386local attrs = {
387 string = {
388 ViewValue = true
389 },
390 number = {
391 ViewValue = true
392 },
393 boolean = {
394 ViewValue = true
395 },
396 userdata = {
397 ViewValue = true
398 },
399 table = {
400 Elements = true,
401 ModifyElements = true
402 },
403 ["function"] = {
404 Upvalues = true,
405 Constants = true,
406 Overwrite = true,
407 ViewSource = true
408 }
409}
410
411local scanUpvalues
412local addExEvent
413local viewValueEvent
414local vVBackEvent
415local vVChangeEvent
416local showInfo = function(name, data, options)
417 if not information.Visible then
418 welcome.Visible = false
419 information.Visible = true
420 end
421
422 if addExEvent then
423 addExEvent:Disconnect()
424 end
425
426 local infoBody = information.Body
427 local icon = information:FindFirstChild("Name").Icon
428 local index = icon.Index
429
430 local dataType = type(data)
431
432 icon.Image = "rbxassetid://" .. typeIcon[dataType]
433 index.Text = name
434 index.Size = UDim2.new(0, index.TextBounds.X, 0, 20)
435 icon.Position = UDim2.new(1, -(index.TextBounds.X + 24), 0, 4)
436
437 for i,v in next, infoBody:GetChildren() do
438 if attrs[dataType][v.Name] and not v:IsA("UIListLayout") then
439 v.Visible = true
440 elseif not v:IsA("UIListLayout") then
441 v.Visible = false
442 end
443 end
444
445 infoBody.Type.Visible = true
446 infoBody.Type.Text = "type: " .. dataType
447
448 if not options then
449 options = {}
450 end
451
452 if options.addToExplorer and not addedUpvalueCache[data] then
453 local addExplorer = infoBody.AddToExplorer
454 addExplorer.Visible = true
455 addExEvent = addExplorer.Button.MouseButton1Click:Connect(function()
456 ui.addButton(name, data, root, {func = options.func})
457 addedUpvalueCache[data] = true
458 addExplorer.Visible = false
459 end)
460 end
461
462 if attrs[dataType].ViewValue then
463 if viewValueEvent then
464 viewValueEvent:Disconnect()
465 end
466
467 viewValueEvent = infoBody.ViewValue.Button.MouseButton1Click:Connect(function()
468 local vVIcon = viewValue:FindFirstChild("Name").Icon
469 local vVIndex = vVIcon.Index
470
471 information.Visible = false
472
473 if options.tbl then
474 data = options.tbl[name]
475 elseif options.func then
476 if options.upval then
477 data = getupvalue(options.func, name)
478 elseif options.env then
479 data = getfenv(options.func)[name]
480 elseif options.constant then
481 data = getconstant(options.func, tonumber(name))
482 end
483 end
484
485 viewValue.Visible = true
486 viewValue.ValueBox.Text = tostring(data)
487 vVIcon.Image = "rbxassetid://" .. typeIcon[dataType]
488 vVIndex.Text = name
489
490 vVIndex.Size = UDim2.new(0, vVIndex.TextBounds.X, 0, 20)
491 vVIcon.Position = UDim2.new(1, -(vVIndex.TextBounds.X + 24), 0, 4)
492
493 if setValueType.Visible then
494 setValueType.Visible = false
495 end
496
497 if vVBackEvent then
498 vVBackEvent:Disconnect()
499 end
500
501 if vVChangeEvent then
502 vVChangeEvent:Disconnect()
503 end
504
505 vVBackEvent = viewValue.Back.MouseButton1Click:Connect(function()
506 viewValue.Visible = false
507 information.Visible = true
508 end)
509
510 vVChangeEvent = viewValue.Change.MouseButton1Click:Connect(function()
511 setValueType.Visible = true
512 if svtEvent then
513 svtEvent:Disconnect()
514 end
515 svtEvent = setValueType.Set.MouseButton1Click:Connect(function()
516 local typeSelected
517 for i,v in next, setValueType:GetChildren() do
518 if v:IsA("TextButton") and v.Text == '✓' then
519 typeSelected = v.Name:lower()
520 end
521 end
522
523 if not typeSelected then
524 ui.msg('', "You must select a type!")
525 return
526 end
527
528 local newValue
529 local valueText = viewValue.ValueBox.Text
530 if typeSelected == "number" then
531 newValue = tonumber(valueText)
532 if not newValue then
533 ui.msg('', "Invalid number value!")
534 return
535 end
536 elseif typeSelected == "string" then
537 newValue = valueText
538 elseif typeSelected == "boolean" then
539 if valueText == "true" then
540 newValue = true
541 elseif valueText == "false" then
542 newValue = false
543 else
544 ui.msg('', "Invalid boolean value!")
545 return
546 end
547 elseif typeSelected == "userdata" then
548 newValue = loadstring("return " .. valueText)()
549 if not newValue or typeof(newValue) ~= "Instance" then
550 ui.msg('', "Invalid instance value!")
551 return
552 end
553 end
554
555 if options.tbl then
556 local index = options.tbl[name]
557 options.tbl[name] = newValue
558
559 print(options.tbl[name])
560 end
561
562 if options.upval then
563 setupvalue(options.func, name, newValue)
564
565 print(getupvalue(options.func, name))
566 elseif options.env then
567 getfenv(options.func)[name] = newValue
568
569 print(getfenv(options.func)[name])
570 elseif options.constant then
571 setconstant(options.func, tostring(name), newValue)
572
573 print(getconstant(options.func, tostring(name)))
574 end
575
576 svtClear()
577 scanUpvalues()
578 dataType = type(newValue)
579 icon.Image = "rbxassetid://" .. typeIcon[dataType]
580 vVIcon.Image = icon.Image
581 infoBody.Type.Text = "type: " .. dataType
582 viewValue.ValueBox.Text = tostring(newValue)
583 setValueType.Visible = false
584 end)
585 end)
586 end)
587 end
588
589 if dataType == "function" then
590 infoBody.Upvalues.Text = "upvalues: " .. abs.tableSize(getupvalues(data))
591 infoBody.Constants.Text = "constants: " .. abs.tableSize(getconstants(data))
592 elseif dataType == "table" then
593 infoBody.Elements.Text = "elements: " .. abs.tableSize(data)
594 end
595end
596
597-- < Interface : Sidebar >
598local collapseIcon = { -- Open/Collapse icons
599 ["true"] = 3426093990,
600 ["false"] = 3426098570
601}
602
603ui.addButton = function(name, data, parent, options) -- Function to add new sidebar button
604 if data == nil then
605 return
606 end
607
608 local dataType = type(data)
609
610 local button = buttonClone:Clone()
611 local collapse = button.Collapse
612 local label = button.Label
613 local children
614
615 if not parent then -- If no parent is specified, then assign to the root directory
616 parent = sidebar
617 end
618
619 if not options then -- If no options are given, then create options
620 options = {}
621 end
622
623 if not options.icon then -- If no icon is defined, then assign an icon based on the data's type
624 options.icon = typeIcon[dataType]
625 end
626
627 button.Name = name
628 button.Parent = parent
629 button.Icon.Image = "rbxassetid://" .. options.icon
630
631 label.Text = name
632 label.Size = UDim2.new(0, label.TextBounds.X + 10, 0, 20)
633 ui.addHighlight(label) -- Add highlight to sidebar button
634 label.MouseButton1Click:Connect(function()
635 showInfo(name, data, options)
636 end)
637
638 local fn = {}
639 fn.findRoot = function(obj, parent) -- Travels up the root directory until it hits the given parent
640 if type(obj) ~= "userdata" or obj.Parent == parent then
641 return obj
642 end
643
644 return fn.findRoot(obj.Parent, parent)
645 end
646
647 local root = fn.findRoot(button, sidebar)
648
649 local addCollapse = function(element) -- Adds collapse mechanism to sidebar button
650 local collapse = element.Collapse
651
652 children = Instance.new("Frame", button)
653 local format = Instance.new("UIListLayout", children)
654
655 local fitChildren = function(element, size) -- Changes the height of the given element to however many children there are
656 element[size] = UDim2.new(0, element[size].X.Offset, 0, 0)
657
658 for i, e in next, element:GetChildren() do
659 if not e:IsA("UIListLayout") then
660 element[size] = element[size] + UDim2.new(0, 0, 0, e.Size.Y.Offset)
661 end
662 end
663 end
664
665 local mostX = 0
666 local scanLargestX = function() -- Scans the root directory's descendants for the farthest indented button
667 for i, d in next, sidebar:GetDescendants() do
668 if d.Name == "Label" and d.ClipsDescendants and (d.AbsolutePosition.X + d.TextBounds.X) > mostX then
669 mostX = d.AbsolutePosition.X + d.TextBounds.X
670 end
671 end
672 end
673
674 format.SortOrder = "LayoutOrder"
675
676 children.Position = UDim2.new(0, 10, 0, 20)
677 children.Size = UDim2.new(0, 175, 0, 0)
678 children.BackgroundTransparency = 1
679 children.Name = "Children"
680
681 collapse.Visible = true
682 collapse.ClipsDescendants = false
683 collapse.MouseEnter:Connect(function()
684 collapse.ImageTransparency = 0
685 end)
686
687 collapse.MouseLeave:Connect(function()
688 collapse.ImageTransparency = 0.5
689 end)
690
691 local processing = false
692 collapse.MouseButton1Click:Connect(function()
693 local collapsed = collapse.ClipsDescendants -- Randomly chose a trait to set as a flag which determines whether a button is collapsed or not
694
695 local scripts, modules = abs.getScripts()
696
697 fn.adjustRoots = function(button, y) -- Adjusts the entire button's roots' sizes
698 if button.Parent == sidebar then
699 return
700 end
701
702 button.Parent.Size = button.Parent.Size + UDim2.new(0, 0, 0, y)
703 return fn.adjustRoots(button.Parent, y)
704 end
705
706 if collapsed then
707 button.Size = button.Size - UDim2.new(0, 0, 0, children.Size.Y.Offset)
708 children.Size = UDim2.new(0, 175, 0, 0)
709
710 local y = 0
711 for i, c in next, button.Children:GetChildren() do -- Determines how much it should collapse by
712 if not c:IsA("UIListLayout") then
713 y = y - c.Size.Y.Offset
714 end
715 end
716
717 fn.adjustRoots(button, y)
718
719 for i, d in next, button.Children:GetDescendants() do -- Since we're collapsing this entire thing, we should probably make everything inside of it invisible
720 if d.Name == "Label" then
721 d.ClipsDescendants = false
722 end
723 end
724
725 scanLargestX() -- Scan for Sidebar CanvasSize X determination
726 else -- Opened
727 if not processing then
728 processing = true
729 else
730 return
731 end
732 if type(data) == "table" and not dataCache[data] then
733 local cache = {} -- Remove all cloned data
734 for i, e in next, data do
735 if not cache[i] then
736 local options, module = {tbl = data}
737
738 -- Check if the passed data is a script
739 if type(e) == "function" and ({["rbxassetid://3426102603"] = true, ["rbxassetid://3426105201"] = true})[root.Icon.Image] then
740 if scripts[i] then
741 options.icon = 3426109133
742 elseif modules[i] then
743 options.icon = 3426113520
744 module = ui.addButton("Return Type", require(getfenv(e).script), button.Children)
745 end
746 end
747
748 -- Create button for the data
749 options.tbl = data
750 local data = ui.addButton(tostring(i), e, button.Children, options)
751
752 -- not sure why this happens???? but delete if it does happen, otherwise parent it
753 if data and module and data:FindFirstChild("Children") then
754 module.Parent = data.Children
755 elseif module and not data:FindFirstChild("Children") then
756 data:Destroy()
757 module:Destroy()
758 end
759
760 cache[i] = true -- Cache this, so that if we run across it again, we don't clone it
761 end
762 end
763
764 dataCache[data] = true
765 elseif type(data) == "function" then
766 local filteredEnv, filteredUpvs = {}, {}
767 local constants = getconstants(data)
768
769 for i, u in next, getupvalues(data) do -- Remove all upvalues that are named any one of Roblox's globals
770 if not getrenv()[i] then
771 filteredUpvs[i] = u
772 end
773 end
774
775 for i, e in next, getfenv(data) do
776 if i ~= "script" then
777 filteredEnv[i] = e
778 end
779 end
780
781 if abs.tableSize(filteredUpvs) ~= 0 and not button.Children:FindFirstChild("Upvalues") then
782 local btn = ui.addButton("Upvalues", {}, button.Children, {showCollapse = true})
783 for i,v in next, filteredUpvs do
784 ui.addButton(tostring(i), v, btn.Children, {func = data, upval = true})
785 end
786 end
787
788 if abs.tableSize(filteredEnv) ~= 0 and not button.Children:FindFirstChild("Environment") then
789 local btn = ui.addButton("Environment", {}, button.Children, {showCollapse = true})
790 for i,v in next, filteredEnv do
791 ui.addButton(tostring(i), v, btn.Children, {func = data, env = true})
792 end
793 end
794
795 if abs.tableSize(constants) ~= 0 and not button.Children:FindFirstChild("Constants") then
796 local btn = ui.addButton("Constants", {}, button.Children, {showCollapse = true})
797 for i,v in next, getconstants(data) do
798 ui.addButton(tostring(i), v, btn.Children, {func = data, constant = true})
799 end
800 end
801 end
802
803 fitChildren(children, "Size") -- Resize children frame to fit all buttons
804 button.Size = button.Size + UDim2.new(0, 0, 0, children.Size.Y.Offset) -- Resize button's size to "Children" size to fit current directory
805
806 local y = 0
807 for i, c in next, button.Children:GetChildren() do
808 if not c:IsA("UIListLayout") then
809 y = y + c.Size.Y.Offset
810 c.Visible = true
811 end
812 end
813
814 fn.adjustRoots(button, y)
815
816 for i, d in next, button.Children:GetDescendants() do
817 if d.Name == "Label" and not d.Parent.Collapse.ClipsDescendants and d.Parent ~= button.Children then
818 d.ClipsDescendants = true
819 end
820 end
821
822 scanLargestX()
823
824 processing = false
825 end
826
827 sidebar.CanvasSize = UDim2.new(0, 0, 0, 0)
828 fitChildren(sidebar, "CanvasSize") -- Resize sidebar to fit opened directory
829
830 local oldPosition = sidebar.CanvasPosition
831 sidebar.CanvasSize = UDim2.new(0, (mostX - sidebar.AbsolutePosition.X), 0, sidebar.CanvasSize.Y.Offset)
832 sidebar.CanvasPosition = oldPosition
833
834 collapse.Image = "rbxassetid://" .. collapseIcon[tostring(collapsed)]
835
836 element.ClipsDescendants = collapsed
837 collapse.ClipsDescendants = not collapsed
838 end)
839
840 sidebar.CanvasSize = UDim2.new(0, 0, 0, 0)
841 fitChildren(sidebar, "CanvasSize") -- Resize sidebar to fit newly added child
842 end
843
844 if options.showCollapse or options.upvalueTable or options.envTable then
845 addCollapse(button) -- Add collapse to button with collapse enabled
846 end
847
848 -- Add collapse to tables or functions with upvalues/environments
849 if ( dataType == "table" and abs.tableSize(data) ~= 0 ) or ( dataType == "function" and islclosure(data) ) then
850 local increment = 0
851 if dataType == "function" then -- Get environment size
852 increment = abs.tableSize(getfenv(data))
853 end
854
855 if not options.showCollapse then -- If the environment size of the function is more than the "script" element then add a collapse
856 if dataType ~= "function" or ( dataType == "function" and ( (getfenv(data).script) and increment > 1 ) or (abs.tableSize(getconstants(data)) ~= 0 or abs.tableSize(getfenv(data)) > 1 or abs.tableSize(getupvalues(data)) ~= 0) ) then
857 addCollapse(button)
858 end
859 end
860 end
861
862 -- Add collapse to metatables
863 if not abs.isRobloxType(data) and getrawmetatable(data) and abs.tableSize(getrawmetatable(data)) ~= 0 then
864 if not button.Collapse.Visible then
865 addCollapse(button)
866 end
867
868 local filteredMetatable = {}
869 for i,v in next, getrawmetatable(data) do
870 if v ~= getrawmetatable(data) then
871 filteredMetatable[i] = v
872 end
873 end
874
875 ui.addButton("Metatable", filteredMetatable, button.Children, {isMetatable = true})
876 end
877
878 return button
879end
880
881-- < RemoteSpy >
882local gmt = getrawmetatable(game)
883setreadonly(gmt, false)
884local nmc = gmt.__namecall
885
886gmt.__namecall = function(t, ...)
887 return nmc(t, ...)
888end
889
890-- < HttpSpy >
891
892-- < Search Upvalues >
893local currentUpvalues = {}
894local viewSearchUpvalues = false
895
896local upvalQuery = searchUpvalues.Query
897local upvalSearch = searchUpvalues.Search
898local upvalScroll = searchUpvalues.Upvalues.Scroll
899
900local upvalueClone = upvalScroll.Upvalue:Clone()
901upvalScroll.Upvalue:Destroy()
902
903local createUpvalue = function(name, data, func)
904 local upvalue = upvalueClone:Clone()
905 local label = upvalue.Label
906
907 upvalue.Icon.Image = "rbxassetid://" .. typeIcon[type(data)]
908 label.Name = name
909 label.Text = name
910
911 label.MouseButton1Click:Connect(function()
912 searchUpvalues.Visible = false
913 viewValue.Visible = false
914 border.Visible = true
915
916 viewSearchUpvalues = false
917
918 showInfo(name, data, {addToExplorer = true, func = func, upval = true})
919 end)
920
921 upvalue.Parent = upvalScroll
922end
923
924misc.SearchUpvalues.Label.MouseButton1Click:Connect(function()
925 if not viewSearchUpvalues then
926 border.Visible = false
927 searchUpvalues.Visible = true
928 else
929 searchUpvalues.Visible = false
930 border.Visible = true
931 end
932 viewSearchUpvalues = not viewSearchUpvalues
933end)
934
935upvalScroll.CanvasSize = UDim2.new(0, 0, 0, 0)
936scanUpvalues = function()
937 for i,v in next, upvalScroll:GetChildren() do
938 if not v:IsA("UIListLayout") then
939 v:Destroy()
940 end
941 end
942
943 upvalScroll.CanvasSize = UDim2.new(0, 0, 0, 0)
944
945 local text = upvalQuery.Text
946 for i,v in next, abs.getUpvalues() do
947 if text:lower():sub(1, text:len()) == tostring(i):lower():sub(1, text:len()) then -- holy god this is long
948 createUpvalue(tostring(i), v.data, v.func)
949 upvalScroll.CanvasSize = upvalScroll.CanvasSize + UDim2.new(0, 0, 0, 20)
950 end
951 end
952end
953
954scanUpvalues()
955upvalSearch.MouseButton1Click:Connect(scanUpvalues)
956upvalQuery.FocusLost:Connect(function(fromEnter)
957 if fromEnter then
958 scanUpvalues()
959 end
960end)
961
962-- < Runtime >
963interface.Parent = game.CoreGui
964
965local startMessage = loadstring(game:HttpGet("https://pastebin.com/raw/TtKUuNyj"))()
966ui.msg(unpack(startMessage))