Hi everyone. I present to you another detection for one of the most painful and powerful scripts Saveinstance
. No one enjoys their hard work after hours of dedication and commitment to be stolen and then being either skidded or having assets stolen.
So below I provide a simple detection for Saveinstance.
This also simply proves detecting cheats isn’t impossible, many claim Saveinstance is undetectable, here I prove you wrong.
Universal Syn-Saveinstance
Universal Syn-SaveInstance utilizes UGCValidationService
for HiddenProperty checks and other stuff. However, UGCValidationService
doesn’t actually exist in the game’s DataModel
until it is explicitly referenced.
For example, when you declare it with:
local UGCValidationService = game:GetService("UGCValidationService")
…it then becomes part of the DataModel
.
By scanning the current services within the game’s DataModel
without directly referencing UGCValidationService
, we can detect its presence. Since this service is typically only called by SaveInstance in this context, its existence strongly indicates the use of SaveInstance.
This method provides a reliable way to flag and detect Saveinstance in action.
YOU CANNOT HAVE UGCVALIDATIONSERVICE REFERENCED ANYWHERE, OTHERWISE THIS WILL FALSE POSITIVE
Detection:
if game:GetService("RunService"):IsStudio() then return end
local UGCValidationService = "UGCValidationService"
local knownServices = {}
if game:FindService(UGCValidationService) then
knownServices[UGCValidationService] = true
end
-- Crash instead of kick, because you can actually still save the game even if kicked. Crashing stops this.
local function Crash()
for i = 1, 3000 do
print("a")
warn("b")
task.spawn(function()
error("\n")
end)
end
end
local function checkForNewServices()
if not knownServices[UGCValidationService] and game:FindService(UGCValidationService) then
Crash()
while true do end
end
end
task.spawn(function()
while true do
checkForNewServices()
task.wait(2)
end
end)
Now this can ofc just be bypassed by simply disabling the script, so what we can do is hide the script in its own environment by using getfenv() (I didn’t create this method, this has been known for years). Like so:
getfenv().script:Destroy()
getfenv().script = nil
Put this at the very top of the script.
This can still obviously be bypassed by other methods, as nothing is unbypassable if its on the client. Exploits have full control of the client, which means they can do whatever they want with it. In the future I’ll possibly release something that stops FindService hooks etc for everyone. But this should hopefully stop your average skid trying to steal your assets
Thanks for reading, and I hope this helps. This may possibly end up getting patched, but I’m not sure
If you have any questions, please let me know.
Oh yeah SaveInstance is also completely undetectable according to the UniversalSynSaveInstance Devs
Clearly isnt!