RoTotal
Key Required VerifiedUniversal

RoTotal

Universal Scriptvxstyvxsty 670.9K views 5.5K executesUpdated Dec 16, 2023
2.7/ 5(42 votes)
231955% Positive
Lua Script•537 lines (19426 chars)
local discord = 'https://discord.gg/gYhqMRBeZV'
local Fluent = loadstring(game:HttpGet("https://github.com/dawid-scripts/Fluent/releases/latest/download/main.lua"))()
local SaveManager = loadstring(game:HttpGet("https://raw.githubusercontent.com/dawid-scripts/Fluent/master/Addons/SaveManager.lua"))()
local InterfaceManager = loadstring(game:HttpGet("https://raw.githubusercontent.com/dawid-scripts/Fluent/master/Addons/InterfaceManager.lua"))()
local HTTPs = game:GetService"HttpService";
local Market = game:GetService"MarketplaceService"
local pending = {}
local allowed = {}
local allowed2 = {}
local request2 = clonefunction(request)
local blockedfunctions = {
 hookfunction, writefile, makefolder, request, Market.PromptPurchase, Market.PromptGamePassPurchase, Market.PromptBundlePurchase, Market.PromptPremiumPurchase, Market.PromptSubscriptionPurchase, Market.PromptProductPurchase, Market.PerformPurchase, Market.PerformPurchaseV2 
}
local RBX = game:GetService('RbxAnalyticsService');
local Specific = {
  RbxAnalyticsService = {
   RBX.GetClientId,
   RBX.GetSessionId,
   RBX.GetPlaySessionId
  },
  Requests = {
   ['syn_backup.request'] = syn_backup ~= nil and syn_backup.request or nil,
   ['http_request'] = http_request,
   ['request'] = request,
   ['http.request'] = http ~= nil and http.request or nil,
   ['syn.request'] = syn ~= nil and syn.request or nil,
   ['fluxus.request'] = fluxus ~= nil and fluxus.request or nil
  }
}
local Methods = {
  RBX = {
  'GetClientId',
  'GetSessionId',
  'GetPlaySessionId'
  }
}
local path = 'RoTotal'
local SelfWriting, SendAsyncAllowed, SendAsyncBlocked = false, false, false
function encode(a)
 HTTPs:JSONEncode(a)
end
function decode(a)
 HTTPs:JSONDecode(a)
end
function getid(list)
 for i, v in list do if type(v) == 'number' then return v end end
end
local functions = {
 URLMain = function(url)
  local formatted = url:match("https://.+") or url:match("http://.+")
  formatted = formatted:split("/")[3]
  return formatted:gsub("https://", ''):gsub('http://', '')
 end
}
function TableLoop(thing, indent)
  if typeof(thing) ~= 'table' then 
      return tostring(thing) 
  end
  
  local result = '{\n'
  
  for i, v in pairs(thing) do
      local key = tostring(i)
      local value = TableLoop(v, indent + 1)
      local value2 = ''
      value2 = (typeof(value) == 'string' and ("'%s'"):format(value)) or (typeof(value) == 'number' and tostring(value))
      
      result = result .. string.rep('  ', indent) .. "['" .. key .. "'] = " .. value2 .. ',\n'
  end
  
  return result .. string.rep('  ', indent - 1) .. "}"
end
function tocURL(args)
   local cmd = "curl request " .. args.Method .. " \"" .. args.Url .. "\""
    
        if args.Headers then
            for key, value in args.Headers do
                cmd = cmd .. " -H \"" .. key .. ": " .. value .. "\"\n"
            end
        end
    
        if args.Body then
            cmd = cmd .. " --data-raw '" .. args.Body .. "'"
        end
    
        return cmd
end

local Window = Fluent:CreateWindow({
    Title = "RoTotal",
    SubTitle = "by vxsty",
    TabWidth = 160,
    Size = UDim2.fromOffset(580, 460),
    Acrylic = true,
    Theme = "Dark",
    MinimizeKey = Enum.KeyCode.LeftControl
})

local Tabs = {
    Socials = Window:AddTab({ Title = "Social", Icon = "globe" })
}

local Options = Fluent.Options
function Notify(title, text, duration)
    Fluent:Notify({
        Title = title,
        Content = text,
        Duration = duration 
    })
end

SaveManager:SetLibrary(Fluent)
InterfaceManager:SetLibrary(Fluent)

Tabs.Socials:AddButton({
        Title = "Discord",
        Description = "Join my discord server",
        Callback = function()
         local success, err = pcall(setclipboard, discord)
         if success then
          Notify("Success", 'Successfully copied discord invite to clipboard!', 5)
         else
          Notify("Error!", 'Failed to copy invite to clipboard, Printed error message.', 5)
          warn(err)
         end
        end
})
Tabs.Socials:AddButton({
  Title = "Other Scripts",
  Content = "https://scriptblox.com/u/vxsty",
  Callback = function()
    setclipboard("https://scriptblox.com/u/vxsty")
  end
})
local old0, old00, old, old2, old3, old4, old5, old6, old7, old8, old9, old10, old11 -- Namecall HttpPost, Anti chat ban, Abusing filesystem (Adding urls to RoTotal/config.json)
old0 = hookfunction(game:GetService("Players").LocalPlayer.Kick, newcclosure(function(Self, message)
 return Notify("AntiKick", 'Kick attempt denied, Kick Message: ' .. tostring(message), 10)
end))
old00 = hookfunction(game:GetService("Players").ReportAbuse, newcclosure(function(Self, message)
  return Notify("ReportAbuse", 'ReportAbuse attempt denied.', 6)
end))
old = hookmetamethod(game, "__namecall", newcclosure(function(Self, ...)
 local Method, Args = getnamecallmethod(), {...}
 if Method:lower():find('http') and SelfRequesting then return old(Self, ...) end
 if Method == 'CaptureFocus' then
    local tab = Window:AddTab({ Title = 'CaptureFocus', Icon = "focus" })
    tab:AddParagraph({
      Title = 'CaptureFocus access wanted.',
      Content = (getcallingscript() ~= nil and getcallingscript():GetFullName() or 'unknown') .. ' would like to use CaptureFocus on ' .. tostring(Self)
    })
    tab:AddButton({Title='Allow', Description='Always allows CaptureFocus on this instance', Callback=function()
     table.insert(allowed2, Self)
    end})
    tab:AddButton({Title='Block', Description='Removes this from the allowed table, Used if you only wanted to allow once or you accidently allowed.', Callback=function()
     for i, v in allowed2 do if v == Self then v = nil end end
    end})
  elseif Method:sub(1, 8):lower() == 'httppost' and not SelfRequesting then
    local args = {}
    args.Url = Args[1]
    args.Method = 'POST'
    args.Body = Args[2] or ''
    args.Headers = Args[3] and {
     ['Content-Type'] = Args[3]
    } or {}
    if not table.find(allowed, args.Url) then
      local tab = Window:AddTab({ Title = functions.URLMain(args.Url), Icon = "globe" })
      tab:AddParagraph({
       Title = 'Requested With',
       Content = 'game:' .. Method
      })
      tab:AddParagraph({
       Title = "URL",
       Content = args.Url
      })
      tab:AddParagraph({
       Title = "Method",
       Content = args.Method
      })
      if args.Headers and #args.Headers > 0 then
       tab:AddParagraph({Title='Headers', Content=TableLoop(args.Headers, 1)})
      end
      if args.Body and args.Body ~= '' then
       tab:AddParagraph({
        Title = "Body",
        Content = tostring(args.Body)
       })
      end
      tab:AddButton({Title='Allow', Description="Adds the request url to the allowed urls table (POST REQUEST ONLY).", Callback=function()
       table.insert(allowed, args.Url)
      end})
      tab:AddButton({Title='Block', Description="Removes the request url from the allowed urls table (if it exists)", Callback=function()
        for i, v in allowed do if v == args.Url then print("Found,", v) table.remove(allowed, i) end end
      end})
      local drop = tab:AddDropdown("CopyDropdown", {
        Title = "Copy As",
        Values = {'', "Source", "cURL"},
        Multi = false,
        Default = '',
    })
    drop:OnChanged(function(val)
     if val == 'Source' then
      setclipboard(string.format(
       '%s({\n Url=\'%s\'\n Method=\'%s\'\n Body = \'%s\'\n Headers=%s\n}',
       debug.getinfo(v).name or 'request', args.Url, args.Method, args.Body or '', args.Headers and #args.Headers > 0 and TableLoop(args.Headers, 2) or '{}'
      ))
      Fluent:Notify({
        Title = "Copied",
        Content = "Successfully copied as source code!",
        SubContent = "", 
        Duration = 5
      })
     elseif val == 'cURL' then
      setclipboard(tocURL(args))
      Fluent:Notify({
        Title = "Copied",
        Content = "Successfully copied as cURL!",
        SubContent = "", 
        Duration = 5
      })
     end
    end)
    return
    end
  elseif Method:sub(1, 7):lower() == 'httpget' then
    local args = {}
    local Args = {...}
    args.Url = Args[1]
    args.Method = 'GET'
    local tab = Window:AddTab({ Title = functions.URLMain(args.Url), Icon = "globe" })
      tab:AddParagraph({
       Title = 'Requested With',
       Content = 'game:' .. Method
      })
      tab:AddParagraph({
       Title = "URL",
       Content = args.Url
      })
      tab:AddParagraph({
       Title = "Method",
       Content = args.Method
      })
      local drop = tab:AddDropdown("CopyDropdown", {
        Title = "Copy As",
        Values = {'', "Source", "cURL"},
        Multi = false,
        Default = '',
    })
    drop:OnChanged(function(val)
     if val == 'Source' then
      setclipboard('game:HttpGet(\''..args.Url..'\');')
      Fluent:Notify({
        Title = "Copied",
        Content = "Successfully copied as source code!",
        SubContent = "", 
        Duration = 5
      })
     elseif val == 'cURL' then
      setclipboard(tocURL(args))
      Fluent:Notify({
        Title = "Copied",
        Content = "Successfully copied as cURL!",
        SubContent = "", 
        Duration = 5
      })
     end
    end)
    SelfRequesting = true
    return game.HttpGet(game, Args[1])
  elseif Method:sub(1, 9):lower() == 'sendasync' then
    if not table.find(allowed2, Self) and not BySelf then
      local tab = Window:AddTab({ Title = 'SendAsync', Icon = "send" })
      tab:AddParagraph({
        Title = "Channel",
        Content = Self.Name
      })
      tab:AddParagraph({
        Title = "Message",
        Content = Args[1]
      })
      tab:AddButton({Title='Send', Description='Sends the message in the select channel.', Callback=function()
       BySelf = true Self:SendAsync(Args[1]) BySelf = false
      end})
      tab:AddButton({Title='Allow', Description="Allows messages to be sent by a script in this channel", Callback=function()
        table.insert(allowed2, Self)
      end})
      tab:AddButton({Title='Block', Description="Blocks messages being sent by a script in this channel", Callback=function()
        for i, v in allowed2 do if v == Self then v = nil end end
      end})
    end
    elseif table.find(Methods.RBX, Method) then
     return game:GetService("HttpService"):GenerateGUID(false)
    elseif Method == 'RequestLimitedAsync' then
      Notify('RequestLimitedAsync', 'Script tried to use RequestLimitedAsync, Denying..', 5)
      return
    end
 return old(Self,...)
end))
for i, v in game:GetService("TextChatService"):GetDescendants() do
 if v:IsA("TextChannel") then
  local old1111;
  old1111 = hookfunction(v.SendAsync, newcclosure(function(Self, Message)
    if not table.find(allowed2, Self) then
      local tab = Window:AddTab({ Title = 'SendAsync', Icon = "send" })
      tab:AddParagraph({
        Title = "Channel",
        Content = Self.Name
      })
      tab:AddParagraph({
        Title = "Message",
        Content = Args[1]
      })
      tab:AddButton({Title='Send', Description='Sends the message in the select channel.', Callback=function()
        BySelf = true Self:SendAsync(Args[1]) BySelf = false
      end})
      tab:AddButton({Title='Allow', Description="Allows messages to be sent by a script in this channel", Callback=function()
        table.insert(allowed2, Self)
      end})
      tab:AddButton({Title='Block', Description="Blocks messages being sent by a script in this channel", Callback=function()
        for i, v in allowed2 do if v == Self then v = nil end end
      end})
  end
  return old1111(Self, Message)
  end))
 end
end
old3 = hookfunction(writefile, newcclosure(function(file, content)
 if not SelfWriting and file == path.."/config.json" then
  warn("Script tried to access RoTotal/config.json files, Attempt denied.")
  Notify('Files Accessed', 'Script attempted to access the RoTotal files, Attempt denied.', 8)
  return
 end
return old3(file, tostring(content))
end))
old4 = hookfunction(makefolder, newcclosure(function(path)
    if not SelfWriting and file == path then
     warn("Script tried to recreate the RoTotal folder, Attempt denied.")
     Notify('Files Accessed', 'Script attempted to access the RoTotal files, Attempt denied.', 8)
     return
    end
   return old4(path)
end))
old5 = hookfunction(clonefunction, newcclosure(function(func)
 if table.find(blockedfunctions, func) or func == clonefunction then
  Notify('Bypass Attempt', 'Script tried to bypass detections with clonefunction, attempt denied.', 8)
  return print
 end
 return old5(func)
end))
old6 = hookfunction(hookfunction, newcclosure(function(func, func2)
    if func == hookfunction then
     Notify('Bypass Attempt', 'Script tried to bypass detections with hookfunction, attempt denied.', 8)
     return print -- Makes script print every function they want to use instead of actually hook xD
    end
    return old6(func, func2)
end))
old7 = hookfunction(Market.GetRobuxBalance, function(...)
 return nil -- Error out some scripts.
end)
local Hook = {game.HttpPostAsync, game.HttpGet, game.HttpGetAsync}
for i = 1, 4 do
 local v;
 v = hookfunction(Hook[i], function(Self, ...)
    local args = {}
    local Args = {...}
    args.Url = Args[1]
    args.Method = i <= 2 and 'POST' or 'GET'
    args.Body = Args[2] or ''
    args.Headers = Args[3] and {
     ['Content-Type'] = Args[3]
    } or {}
    if not table.find(allowed, args.Url) and not SelfRequesting then
      local tab = Window:AddTab({ Title = functions.URLMain(args.Url), Icon = "globe" })
      tab:AddParagraph({
        Title = 'Requested With',
        Content = Hook[i] == game.HttpPost and 'game.HttpPost' or Hook[i] == game.HttpPostAsync and 'game.HttpPostAsync' or Hook[i] == game.HttpGet and 'game.HttpGet' or Hook[i] == game.HttpGetAsync and 'game.HttpGetAsync'
       })
      tab:AddParagraph({
       Title = "URL",
       Content = args.Url
      })
      tab:AddParagraph({
       Title = "Method",
       Content = args.Method
      })
      if args.Headers and #args.Headers > 0 then
       tab:AddParagraph({Title='Headers', Content=TableLoop(args.Headers, 1)})
      end
      if args.Body and args.Body ~= '' then
       tab:AddParagraph({
        Title = "Body",
        Content = tostring(args.Body)
       })
      end
      if args.Method ~= 'GET' then
      tab:AddButton({Title='Allow', Description="Adds the request url to the allowed urls table (POST REQUEST ONLY).", Callback=function()
       table.insert(allowed, args.Url)
      end})
      tab:AddButton({Title='Block', Description="Removes the request url from the allowed urls table (if it exists)", Callback=function()
        for i, v in allowed do if v == args.Url then print("Found,", v) table.remove(allowed, i) end end
      end})
      end
      local drop = tab:AddDropdown("CopyDropdown", {
        Title = "Copy As",
        Values = {'', "Source", "cURL"},
        Multi = false,
        Default = '',
      })
      local POSTSource = ('game:HttpPost("%s", "%s", "%s");'):format(args.Url or '', args.Body or '', Args[3] or '')
      local GETSource = ('game:HttpGet("%s");'):format(args.Url or '')
      drop:OnChanged(function(val)
      if val == 'Source' then
       setclipboard(args.Method=='POST'and POSTSource or GETSource)
       Fluent:Notify({
        Title = "Copied",
        Content = "Successfully copied as source code!",
        SubContent = "", 
        Duration = 5
       })
       elseif val == 'cURL' then
       setclipboard(tocURL(args))
       Fluent:Notify({
        Title = "Copied",
        Content = "Successfully copied as cURL!",
        SubContent = "", 
        Duration = 5
       })
     end
    end)
    if args.Method == 'GET' then
     return v(Self, ...)
    end
    print('Not SelfRequesting or found in allowed urls.')
    return
  elseif SelfRequesting then
   SelfRequesting = false
   return v(Self, ...)
  end
    return v(Self, ...)
 end)
end
old10 = hookfunction(game:GetService("Players").ReportAbuse, newcclosure(function(Self, ...)
 local Args = {...}
 return Notify("ReportAbuse Accessed", 'Script tried to access ReportAbuse and report player '..tostring(Args[1]), 10)
end))
for i = 7, #blockedfunctions do
 local old0 = hookfunction(blockedfunctions[i], newcclosure(function(...)
  local info = Market:GetProductInfo(getid({...}))
  local owner = info.CreatorTargetId
  local Owner = game:GetService('Players'):GetNameFromUserIdAsync(owner);
  local price = info.PriceInRobux
  print("Owner:",Owner,"\nPrice:",price,'\nOwner ID:',owner)
  Notify('MarketplaceService', 'Script attempted to prompt/complete a purchase, printed product info.', 5)
  return
 end))
end
for i, v in Specific.RbxAnalyticsService do
 hookfunction(v, function()
  Notify("RbxAnalyticsService accessed", 'RbxAnalyticsService accessed with member '..tostring(debug.getinfo(v).name)..", returned random GUID", 5)
  return HTTPs:GenerateGUID(false)
 end)
end
for i, v in Specific.Requests do
 local old0;
 old0 = hookfunction(v, newcclosure(function(...)
  if SelfRequesting then SelfRequesting = false return old(...) end
  local args = {...}
  if typeof(args) == 'table' and typeof(args[1]) == 'table' then 
   args = args[1]
  end
  if not table.find(allowed, args.Url) or not SelfRequesting then
    local tab = Window:AddTab({ Title = functions.URLMain(args.Url), Icon = "globe" })
    tab:AddParagraph({
     Title = 'Requested With',
     Content = typeof(i) ~= 'number' and i or debug.getinfo(v).name or '??'
    })
    tab:AddParagraph({
     Title = "URL",
     Content = args.Url
    })
    tab:AddParagraph({
     Title = "Method",
     Content = args.Method
    })
    tab:AddParagraph({Title='Headers', Content=TableLoop(args.Headers, 1) or 'No Headers'})
    tab:AddParagraph({
      Title = "Body",
      Content = args.Body or 'Empty'
     })
    if args.Method ~= 'GET' then
    tab:AddButton({Title='Allow', Description="Adds the request url to the allowed urls table (POST REQUEST ONLY).", Callback=function()
     table.insert(allowed, args.Url)
    end})
    tab:AddButton({Title='Block', Description="Removes the request url from the allowed urls table (if it exists)", Callback=function()
      for i, v in allowed do if v == args.Url then print("Found,", v) table.remove(allowed, i) end end
    end})
    end
    local drop = tab:AddDropdown("CopyDropdown", {
        Title = "Copy As",
        Values = {'', "Source", "cURL"},
        Multi = false,
        Default = '',
    })
    drop:OnChanged(function(val)
     if val == 'Source' then
      setclipboard(string.format(
       '%s({\n Url=\'%s\',\n Method=\'%s\',\n Body = \'%s\',\n Headers=%s\n})',
       i, args.Url, args.Method, args.Body or '', args.Headers and TableLoop(args.Headers, 2) or '{}'
      ))
      Fluent:Notify({
        Title = "Copied",
        Content = "Successfully copied as source code!",
        SubContent = "", 
        Duration = 5
      })
     elseif val == 'cURL' then
      setclipboard(tocURL(args))
      Fluent:Notify({
        Title = "Copied",
        Content = "Successfully copied as cURL!",
        SubContent = "", 
        Duration = 5
      })
     end
    end)
    local r = request2({Url=args.Url, Method='GET'})
    local Cookies, Headers = r.Cookies, r.Headers
    return {
     StatusCode = r.StatusCode,
     Success = r.Success,
     StatusMessage = r.StatusMessage,
     Cookies = Cookies,
     Headers = Headers
    }
  end
  return old0(...)
 end))
end

Features & Information

Revamped! Anti Loggers via Webhooks { Prevents unauthorized logging attempts by detecting and blocking webhook-based data transfers. } Anti Robux Stealers { Protects against malicious attempts to steal robux by denying Prompt, Perform purchase requests. } Military Grade Protection { Offers amazing security, No script can ever steal your information without you allowing it to. } Anti HWID Stealing { Blocks attempts to steal HWID (Hardware ID) information, which hackers can use to get you banned on different games such as roblox, fortnite, etc. } Anti Chat Ban { Blocks attempt to force your user to chat inappropriate/things you didn't ask to chat, Which could be used to get you banned. } Anti Unallowed HTTP Post Requests { Blocks HTTP Post requests that are not allowed by you, These requests will only work after you have clicked allowed and won't instantly work when you click allow. } Notifies When Get Requests Are Used { Notifies you in the tabs list whenever a get request is used, You can use this for your own scripts too! } Source Code Copy { Lets you copy the source code of POST requests, Source code is how the script was written } "What can I do with this?" Well, First let's talk about webhooks. Say you don't wanna get logged or get your data sent to a webhook, While using this if a post request is sent you can view it and copy it as a lua table, Then run it through a webhook spammer and spam the webhook! Or you can delete it, Second, You can execute almost ANY script without having to worry about being logged, hacked or scammed. Third, Bypass whitelist systems that use http requests to check if hardware ids are in a pastebin, list etc. Many more features! Beats Protectio & Guardian v2 v1.0.1 (The Requests Update) { Fixed GET requests returning an error New features { Copy As { cURL, Source, Python coming soon }, HeadersViewer { Allows you to view headers in requests that you weren't able to see before }, More GET detection { Script now also detects game.HttpGet, game.HttpGetAsync, game:HttpGet, request(), etc... } }, Script now shows what the request was requested with (eg: http.request, request, game.HttpGet), Script now returns Cookies and Headers from GET or POST requests to third party websites to avoid detection & not break scripts. Known Bugs: Requests may duplicate or create 2 tabs instead of one. }
#Universal#Protection#RoTotal#Free#Keyless

Community Comments (15)

huseyinboyrazhuseyinboyrazDec 16, 2023(edited)

Nice script

toastertoasterDec 16, 2023(edited)

this looks like an anti virus to me ngl

vxstyvxstyDec 16, 2023(edited)

@lemon it kinda is.

toastertoasterDec 17, 2023(edited)

@vxsty ok then

FumikoFumikoDec 17, 2023(edited)

Finally something good and also open sourced for others to not just learn from it but to also read what it does exactly.

IneedtalkinglessonsIneedtalkinglessonsJun 18, 2024(edited)

doesnt work on solara

vxstyvxstyJun 18, 2024(edited)

@Ineedtalkinglessons I know

OrealatedOrealatedJun 22, 2024(edited)

Goated

OrealatedOrealatedJun 22, 2024(edited)

Who even disliked this

sentidrexsentidrexAug 6, 2024(edited)

does this work for phone?

imhuslolimhuslolAug 10, 2024(edited)

still works?

SigmaSwagMaster69SigmaSwagMaster69Nov 3, 2024(edited)

Does it work on JJsploit? Ig I'll test it

tariktur2016tariktur2016Feb 27, 2025(edited)

Now I can execute stealers without only 1 robux

hilosarry6hilosarry6Mar 9, 2025(edited)

@vxsty some url webhook discord not showing is bugs or some maybe u can fix

rogullrogullJan 25, 2026

Crashes game on retrostudio

More Scripts for Universal Scripts