--[[ information section == this script is meant to prevent people from using your script Its basically roblox's own version of HWID by using roblox's built in features, no server is required to pull information like this. how it works: - when executed, the script grabs the device's HWID -- device specific for some odd reason. - that hwid is tied to the player’s userid and username (If enabled) but in general is tied to their device. - strikes are stored in the actual executor along with other files such as your userid, hwid, etc. nothing sensitive is stored. - once the strike limit is reached, the device is permanently blacklisted. username blacklist behavior: - if a username listed in the blacklisted usernames section runs this script, their hwid is immediately blacklisted so switching accounts is useless. - once blacklisted, any other account using the same script on the same device will also be blocked. - this prevents blacklist evasion through alt accounts. you are free to use this system in your own scripts. you may modify anything you desire since it's opensourced. important features: - if you want to change what folder gets created in the executor, or mask it with common scripts, then change the basefolder + The default is infiniteyield since most people have used it atleast on the executer once by now, I used it as an example folder. local basefolder = "infiniteyield" -- example ]] -- I LOVE DEFINING TWIN local players = game:GetService("Players") local analytics = game:GetService("RbxAnalyticsService") local httpservice = game:GetService("HttpService") local localplayer = players.LocalPlayer --[[ ==================================== CONFIGURATION ==================================== ]] local config = { strikelimit = 3, -- customize limit until full blacklist kickonly = true, -- ignore antitamper = true, -- If files are edited will blacklist antireset = false, -- If device is switched will ban the other device -- not fully working yet antiuserid = true, -- Store userid antiexecutor = false, -- Block executers if they are bad e.g. Xeno/Solara. antiusernameblacklist = true -- Toggle to blacklist usernames } local blacklistedusernames = { "AddUsername" } local basefolder = "infiniteyield" if not isfolder(basefolder) then makefolder(basefolder) end --[[ ==================================== Logic I dink ==================================== ]] local hwidfile = basefolder .. "/information.txt" local strikefile = basefolder .. "/strikes.txt" local blacklistfile = basefolder .. "/blacklist.txt" local userfile = basefolder .. "/users.txt" local metafile = basefolder .. "/meta.txt" local function readjson(path) if isfile(path) then return httpservice:JSONDecode(readfile(path)) end return {} end local function writejson(path, data) writefile(path, httpservice:JSONEncode(data)) end local function kick(reason) localplayer:Kick(reason) task.wait(2) while true do end end local function gethwid() if isfile(hwidfile) then return readfile(hwidfile) end local hwid = analytics:GetClientId() writefile(hwidfile, hwid) return hwid end local hwid = gethwid() local userid = tostring(localplayer.UserId) local username = localplayer.Name local strikes = readjson(strikefile) local blacklist = readjson(blacklistfile) local users = readjson(userfile) local meta = readjson(metafile) if blacklist[hwid] then kick("you are blacklisted.") end for _, name in ipairs(blacklistedusernames) do if config.antiusernameblacklist and username == name then blacklist[hwid] = true writejson(blacklistfile, blacklist) kick("You have been blacklisted by the script creator") end end local function addstrike(reason) strikes[hwid] = (strikes[hwid] or 0) + 1 writejson(strikefile, strikes) if strikes[hwid] >= config.strikelimit then blacklist[hwid] = true writejson(blacklistfile, blacklist) kick("blacklisted: " .. reason) end if config.kickonly then kick("strike " .. strikes[hwid] .. "/" .. config.strikelimit .. " | " .. reason) end end if config.antitamper then local integrity = hwid .. ":" .. userid if meta.integrity and meta.integrity ~= integrity then addstrike("tampering detected") else meta.integrity = integrity writejson(metafile, meta) end end if config.antireset then if meta.firstseenhwid and meta.firstseenhwid ~= hwid then addstrike("hwid reset detected") else meta.firstseenhwid = hwid writejson(metafile, meta) end end if config.antiuserid then if users[hwid] and users[hwid] ~= userid then if blacklist[hwid] then kick("blacklist evasion") else addstrike("userid mismatch") end else users[hwid] = userid writejson(userfile, users) end end if config.antiexecutor then local required = {"getgenv", "isfile", "readfile", "writefile", "makefolder"} for _, fn in ipairs(required) do if type(getgenv()[fn]) ~= "function" and type(_G[fn]) ~= "function" then addstrike("modified executor environment") break end end end