GRH-Fake-Exploit [Client Side Executor For Testing Games]

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

40 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:

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