[extremely old and probably outdated]
GRH-Fake-Exploit Is Tool To Test Your Game Without Injecting Executors, Also Supporting Some Executors Functions
DOWNLOAD: module.rbxm (446.2 KB) (dex + infinity yield is 14k+ lines)
VERSION: 1.0.9
-- Keys:
-- (+) = added
-- (-) = removed
-- (*) = updated
-- (i) = info
-- Updates:
--[[
Version 1.0.0 {
+ hookfunction
+ HttpGet
+ HttpPost
+ gethui
+ getinstances
+ getnilinstances
+ getscripts
+ newcclosure
+ crypt
+ http
+ http_request
+ request
+ isreadonly
+ printidentify
+ identifyexecutor
+ getgenv
}
Version 1.0.1 {
+ loadstring
+ debug.getinfo
+ bit
+ crypt.hash
+ crypt.random
* hookfunction
}
Version 1.0.2 {
i: fixed http.request returning nil
}
Version 1.0.3 {
* newcclosure
* getnilinstances
* hookfunction
}
Version 1.0.4 {
i: added most requests + better method
* http.request/http_request/request
}
Version 1.0.5 {
+ setclipboard
+ queue_on_teleport
}
Version 1.0.6 {
i: removed hookfunction because of incorrect work
- hookfunction
+ setrbxclipboard
+ getloadedmodules
+ getrenv
+ getreg
+ rconsole
}
Version 1.0.7 {
i: converted module to loader
}
Version 1.0.8 {
+ messagebox
+ rconsoleclear
}
Version 1.0.9 {
+ Dex
+ Infinity Yield
+ Block Discord Prompt
i: added "Block Discord Prompt" to not get warns for discord or smth
}
]]--
ROBLOX THIS IS MY FIRST GOOD PROJECT STOP DELETING IT
More Functions Soon.
please reply with suggerstions
44 Likes
Someone finally had the idea to make this and replicate a fake exploit environment…
-
Also consider using the loadstring provided by Roblox and setting the environment returned by the function to the exploit environment instead (use setfenv(func, env)
) Nevermind, this will NOT work on the client as Roblox does not include the Luau compiler on the client for security reasons
- You should implement
getnilinstances
in the client instead, sending the table over won’t work because you only insert destroyed instances (and they obviously won’t exist when the client receives it)
-
getnilinstances
only checks if a instance is destroyed, instead check if the Parent is nil
-
newcclosure
should probably create a function wrapping the function provided:
function newcclosure(func: (...any) -> (...any))
return function(... : any)
return func(...)
end
end
2 Likes
Thanks For Your Reply, Sadly I Use Custom loadstring Is Because You Will Error When You Try To Use Normal loadstring On Client
3 Likes
Nevermind, I forgot you were running this on the client
What I said previously
Open ServerScriptService
and check LoadStringEnabled
.
Also I suggest to disable it if you publish the game, or do backdoor checks for security.
Lastly,
PSA: Enabling LoadStringEnabled doesn't instantly jeopardise your games
1 Like
while i was making getnilinstances run on client i found an optimization
1 Like
So what exactly is the purpose of this? Is this like an anti exploit system?
Although this has some of the functions executors support (mainly debug.getinfo, which you pretty much perfectly replicated), a lot of the functions won’t work without more recreations
For example, hookfunction is usually used alongside newcclosure, which I believe can be replicated if you just do
local function newcclosure(func)
return func
end
getnilinstances has to run on the client as well, you’re looking for the client’s nil, not the server’s
There are more functions to make http requests than just httpget and httppost, there’s syn.request which can send a custom request to a website with more methods than “GET” and “POST”
in luau there is 2 closures: lua and c
to create c closure exploit have to access c using memory or smth
tool to devs so they can test their anti-cheats without breaking TOS
3 Likes
you don’t need access to creating cclosures if you’re trying to replicate the environment, most things that are done with them in exploits are done solely for protection and can be avoided if you just make newcclosure return a lua closure
Yeah I know, what I mean is masking the input closure under a different lua closure (faking the function)
So that nobody can do this:
function a() end
local c = newcclosure(a)
print(a == c)
Thanks For Replies Everyone! This Makes Project Grow.
any ideas on making getrawmetatable?
tbh if someone wanted to detect this environment, they wouldn’t do that
pretty sure they’d just do
if getgenv() == getfenv(0) then
--detected cloned environment
end
1 Like
Create a fake setmetatable, have the setmetatable store the input table and input metatable (cache them). setrawmetatable then can just get the table if it exists, sets the __metatable field to nil, use the real setmetatable to set the table to the new metatable, and revert the __metatable change old metatable, lastly cache the new metatable
sadly if you try to do pairs(getfenv(0)) to clone fenv it will only index “script” = Instance.
well i can try adding everything manually
I believe getgenv
returns the table that has the actual globals. (getfenv normally returns a table with a __index metatable set to the table that has the real globals which you cannot override due to the __metatable field)
20:52:50.053 > print(getfenv()) - Studio
20:52:50.054 {} - Edit
20:52:58.497 > print(getmetatable(getfenv())) - Studio
20:52:58.498 The metatable is locked - Edit
I didn’t think of that, well atleast I was sane enough to create a module to nearly emulate a limited Synapse environment.
(I did the right thing for the getgenv atleast because I read the docs over and over)
(the proxy arg is a addition and is NOT a part of Synapse’s actual getgenv)
Dude, I was thinking about creating an exact similar plugin to this, but I guess someone already beat me to it lol. Nice plugin btw!
1 Like
ok so i looked into your reply and im gonna work on more requests
update: Added
1 Like