
KeylessUniversal

local LunarisObfuscator = Instance.new("ScreenGui")
local MainFrame = Instance.new("Frame")
local Title = Instance.new("TextLabel")
local InputLabel = Instance.new("TextLabel")
local InputBox = Instance.new("TextBox")
local OutputLabel = Instance.new("TextLabel")
local OutputBox = Instance.new("TextBox")
local ObfuscateButton = Instance.new("TextButton")
local CopyButton = Instance.new("TextButton")
local ClearButton = Instance.new("TextButton")
local AnimatedIcon = Instance.new("ImageLabel")
local TitleGlow = Instance.new("ImageLabel")
local TopBar = Instance.new("Frame")
local CloseButton = Instance.new("TextButton")
local ChangelogButton = Instance.new("TextButton")
local SaveButton = Instance.new("TextButton")
LunarisObfuscator.Name = "LunarisObfuscator"
LunarisObfuscator.Parent = game:GetService("CoreGui") or game.Players.LocalPlayer:WaitForChild("PlayerGui")
LunarisObfuscator.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
LunarisObfuscator.ResetOnSpawn = false
MainFrame.Name = "MainFrame"
MainFrame.Parent = LunarisObfuscator
MainFrame.BackgroundColor3 = Color3.fromRGB(20, 20, 30)
MainFrame.BackgroundTransparency = 0.1
MainFrame.BorderSizePixel = 0
MainFrame.Position = UDim2.new(0.3, 0, 0.2, 0)
MainFrame.Size = UDim2.new(0.4, 0, 0.6, 0)
MainFrame.ClipsDescendants = true
local UICorner = Instance.new("UICorner")
UICorner.CornerRadius = UDim.new(0.03, 0)
UICorner.Parent = MainFrame
local DropShadow = Instance.new("ImageLabel")
DropShadow.Name = "DropShadow"
DropShadow.Parent = MainFrame
DropShadow.BackgroundTransparency = 1
DropShadow.BorderSizePixel = 0
DropShadow.Size = UDim2.new(1, 12, 1, 12)
DropShadow.Position = UDim2.new(0, -6, 0, -6)
DropShadow.Image = "rbxassetid://139437522"
DropShadow.ImageColor3 = Color3.fromRGB(0, 0, 0)
DropShadow.ImageTransparency = 0.8
DropShadow.ScaleType = Enum.ScaleType.Slice
DropShadow.SliceCenter = Rect.new(10, 10, 118, 118)
DropShadow.ZIndex = -1
TopBar.Name = "TopBar"
TopBar.Parent = MainFrame
TopBar.BackgroundColor3 = Color3.fromRGB(30, 30, 40)
TopBar.BorderSizePixel = 0
TopBar.Size = UDim2.new(1, 0, 0.08, 0)
TopBar.ZIndex = 3
local TopBarCorner = Instance.new("UICorner")
TopBarCorner.CornerRadius = UDim.new(0, 8)
TopBarCorner.Parent = TopBar
AnimatedIcon.Name = "AnimatedIcon"
AnimatedIcon.Parent = TopBar
AnimatedIcon.BackgroundTransparency = 1
AnimatedIcon.Position = UDim2.new(0.02, 0, 0.15, 0)
AnimatedIcon.Size = UDim2.new(0.07, 0, 0.7, 0)
AnimatedIcon.Image = "rbxassetid://139437522"
AnimatedIcon.ZIndex = 4
Title.Name = "Title"
Title.Parent = TopBar
Title.BackgroundTransparency = 1
Title.Position = UDim2.new(0.1, 0, 0, 0)
Title.Size = UDim2.new(0.8, 0, 1, 0)
Title.Font = Enum.Font.GothamBold
Title.Text = " CSLO OBFUSCATOR v1.7.0"
Title.TextColor3 = Color3.fromRGB(220, 220, 255)
Title.TextSize = 18
Title.TextXAlignment = Enum.TextXAlignment.Left
Title.ZIndex = 4
TitleGlow.Name = "TitleGlow"
TitleGlow.Parent = Title
TitleGlow.BackgroundTransparency = 1
TitleGlow.Size = UDim2.new(1.2, 0, 2, 0)
TitleGlow.Position = UDim2.new(-0.1, 0, -0.5, 0)
TitleGlow.Image = "rbxassetid://139437522"
TitleGlow.ImageColor3 = Color3.fromRGB(100, 150, 255)
TitleGlow.ImageTransparency = 0.7
TitleGlow.ScaleType = Enum.ScaleType.Slice
TitleGlow.SliceCenter = Rect.new(10, 10, 118, 118)
TitleGlow.ZIndex = 3
CloseButton.Name = "CloseButton"
CloseButton.Parent = TopBar
CloseButton.BackgroundColor3 = Color3.fromRGB(180, 80, 80)
CloseButton.BackgroundTransparency = 0.5
CloseButton.BorderSizePixel = 0
CloseButton.Position = UDim2.new(0.92, 0, 0.15, 0)
CloseButton.Size = UDim2.new(0.06, 0, 0.7, 0)
CloseButton.Font = Enum.Font.GothamBold
CloseButton.Text = "X"
CloseButton.TextColor3 = Color3.fromRGB(255, 255, 255)
CloseButton.TextSize = 14
CloseButton.ZIndex = 4
local CloseCorner = Instance.new("UICorner")
CloseCorner.CornerRadius = UDim.new(0.5, 0)
CloseCorner.Parent = CloseButton
ChangelogButton.Name = "ChangelogButton"
ChangelogButton.Parent = TopBar
ChangelogButton.BackgroundColor3 = Color3.fromRGB(80, 120, 200)
ChangelogButton.BackgroundTransparency = 0.5
ChangelogButton.BorderSizePixel = 0
ChangelogButton.Position = UDim2.new(0.76, 0, 0.15, 0)
ChangelogButton.Size = UDim2.new(0.07, 0, 0.7, 0)
ChangelogButton.Font = Enum.Font.GothamBold
ChangelogButton.Text = "Changelog"
ChangelogButton.TextColor3 = Color3.fromRGB(255, 255, 255)
ChangelogButton.TextSize = 10
ChangelogButton.TextScaled = true
ChangelogButton.ZIndex = 4
SaveButton.Name = "SaveButton"
SaveButton.Parent = TopBar
SaveButton.BackgroundColor3 = Color3.fromRGB(100, 100, 100)
SaveButton.BackgroundTransparency = 0.5
SaveButton.BorderSizePixel = 0
SaveButton.Position = UDim2.new(0.84, 0, 0.15, 0)
SaveButton.Size = UDim2.new(0.07, 0, 0.7, 0)
SaveButton.Font = Enum.Font.GothamBold
SaveButton.Text = "Save"
SaveButton.TextColor3 = Color3.fromRGB(255, 255, 255)
SaveButton.TextSize = 10
SaveButton.TextScaled = true
SaveButton.ZIndex = 4
local SaveCorner = Instance.new("UICorner")
SaveCorner.CornerRadius = UDim.new(0.5, 0)
SaveCorner.Parent = SaveButton
local ChangelogCorner = Instance.new("UICorner")
ChangelogCorner.CornerRadius = UDim.new(0.5, 0)
ChangelogCorner.Parent = ChangelogButton
InputLabel.Name = "InputLabel"
InputLabel.Parent = MainFrame
InputLabel.BackgroundTransparency = 1
InputLabel.Position = UDim2.new(0, 0, 0.1, 0)
InputLabel.Size = UDim2.new(1, 0, 0.05, 0)
InputLabel.Font = Enum.Font.Gotham
InputLabel.Text = "Input Script:"
InputLabel.TextColor3 = Color3.fromRGB(200, 200, 255)
InputLabel.TextSize = 14
InputLabel.ZIndex = 2
InputBox.Name = "InputBox"
InputBox.Parent = MainFrame
InputBox.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
InputBox.BorderSizePixel = 0
InputBox.Position = UDim2.new(0.02, 0, 0.15, 0)
InputBox.Size = UDim2.new(0.96, 0, 0.35, 0)
InputBox.Font = Enum.Font.Code
InputBox.Text = "print('Hello CSLO!')"
InputBox.TextColor3 = Color3.fromRGB(220, 220, 255)
InputBox.TextSize = 12
InputBox.TextWrapped = true
InputBox.TextXAlignment = Enum.TextXAlignment.Left
InputBox.TextYAlignment = Enum.TextYAlignment.Top
InputBox.ClearTextOnFocus = false
InputBox.MultiLine = true
InputBox.ZIndex = 2
local InputCorner = Instance.new("UICorner")
InputCorner.CornerRadius = UDim.new(0.02, 0)
InputCorner.Parent = InputBox
OutputLabel.Name = "OutputLabel"
OutputLabel.Parent = MainFrame
OutputLabel.BackgroundTransparency = 1
OutputLabel.Position = UDim2.new(0, 0, 0.5, 0)
OutputLabel.Size = UDim2.new(0.52, 0, 0.05, 0)
OutputLabel.Font = Enum.Font.Gotham
OutputLabel.Text = "Obfuscated Output:"
OutputLabel.TextColor3 = Color3.fromRGB(200, 200, 255)
OutputLabel.TextSize = 14
OutputLabel.ZIndex = 2
local FileNameBox = Instance.new("TextBox")
FileNameBox.Name = "FileNameBox"
FileNameBox.Parent = MainFrame
FileNameBox.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
FileNameBox.BorderSizePixel = 0
FileNameBox.Position = UDim2.new(0.53, 0, 0.505, 0)
FileNameBox.Size = UDim2.new(0.26, 0, 0.04, 0)
FileNameBox.Font = Enum.Font.Code
FileNameBox.Text = "script.lua"
FileNameBox.PlaceholderText = "filename.lua"
FileNameBox.TextColor3 = Color3.fromRGB(200, 200, 255)
FileNameBox.TextSize = 10
FileNameBox.TextScaled = true
FileNameBox.ClearTextOnFocus = false
FileNameBox.ZIndex = 2
local FileNameCorner = Instance.new("UICorner")
FileNameCorner.CornerRadius = UDim.new(0.3, 0)
FileNameCorner.Parent = FileNameBox
local LoadFileButton = Instance.new("TextButton")
LoadFileButton.Name = "LoadFileButton"
LoadFileButton.Parent = MainFrame
LoadFileButton.BackgroundColor3 = Color3.fromRGB(0, 0, 0)
LoadFileButton.BackgroundTransparency = 0.5
LoadFileButton.BorderSizePixel = 0
LoadFileButton.Position = UDim2.new(0.80, 0, 0.505, 0)
LoadFileButton.Size = UDim2.new(0.18, 0, 0.04, 0)
LoadFileButton.Font = Enum.Font.GothamBold
LoadFileButton.Text = "LOAD FILE"
LoadFileButton.TextColor3 = Color3.fromRGB(255, 255, 255)
LoadFileButton.TextSize = 9
LoadFileButton.TextScaled = true
LoadFileButton.ZIndex = 2
local LoadFileCorner = Instance.new("UICorner")
LoadFileCorner.CornerRadius = UDim.new(0.5, 0)
LoadFileCorner.Parent = LoadFileButton
OutputBox.Name = "OutputBox"
OutputBox.Parent = MainFrame
OutputBox.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
OutputBox.BorderSizePixel = 0
OutputBox.Position = UDim2.new(0.02, 0, 0.55, 0)
OutputBox.Size = UDim2.new(0.96, 0, 0.35, 0)
OutputBox.Font = Enum.Font.Code
OutputBox.Text = ""
OutputBox.TextColor3 = Color3.fromRGB(220, 220, 255)
OutputBox.TextSize = 11
OutputBox.TextWrapped = true
OutputBox.TextXAlignment = Enum.TextXAlignment.Left
OutputBox.TextYAlignment = Enum.TextYAlignment.Top
OutputBox.ClearTextOnFocus = false
OutputBox.MultiLine = true
OutputBox.ZIndex = 2
local OutputCorner = Instance.new("UICorner")
OutputCorner.CornerRadius = UDim.new(0.02, 0)
OutputCorner.Parent = OutputBox
ObfuscateButton.Name = "ObfuscateButton"
ObfuscateButton.Parent = MainFrame
ObfuscateButton.BackgroundColor3 = Color3.fromRGB(60, 100, 200)
ObfuscateButton.BorderSizePixel = 0
ObfuscateButton.Position = UDim2.new(0.02, 0, 0.92, 0)
ObfuscateButton.Size = UDim2.new(0.3, 0, 0.06, 0)
ObfuscateButton.Font = Enum.Font.GothamBold
ObfuscateButton.Text = "OBFUSCATE"
ObfuscateButton.TextColor3 = Color3.fromRGB(255, 255, 255)
ObfuscateButton.TextSize = 14
ObfuscateButton.ZIndex = 2
local ObfuscateCorner = Instance.new("UICorner")
ObfuscateCorner.CornerRadius = UDim.new(0.5, 0)
ObfuscateCorner.Parent = ObfuscateButton
CopyButton.Name = "CopyButton"
CopyButton.Parent = MainFrame
CopyButton.BackgroundColor3 = Color3.fromRGB(50, 150, 100)
CopyButton.BorderSizePixel = 0
CopyButton.Position = UDim2.new(0.34, 0, 0.92, 0)
CopyButton.Size = UDim2.new(0.3, 0, 0.06, 0)
CopyButton.Font = Enum.Font.GothamBold
CopyButton.Text = "COPY OUTPUT"
CopyButton.TextColor3 = Color3.fromRGB(255, 255, 255)
CopyButton.TextSize = 14
CopyButton.ZIndex = 2
local CopyCorner = Instance.new("UICorner")
CopyCorner.CornerRadius = UDim.new(0.5, 0)
CopyCorner.Parent = CopyButton
ClearButton.Name = "ClearButton"
ClearButton.Parent = MainFrame
ClearButton.BackgroundColor3 = Color3.fromRGB(180, 80, 80)
ClearButton.BorderSizePixel = 0
ClearButton.Position = UDim2.new(0.66, 0, 0.92, 0)
ClearButton.Size = UDim2.new(0.32, 0, 0.06, 0)
ClearButton.Font = Enum.Font.GothamBold
ClearButton.Text = "CLEAR ALL"
ClearButton.TextColor3 = Color3.fromRGB(255, 255, 255)
ClearButton.TextSize = 14
ClearButton.ZIndex = 2
local ClearCorner = Instance.new("UICorner")
ClearCorner.CornerRadius = UDim.new(0.5, 0)
ClearCorner.Parent = ClearButton
local function animateIcon()
local TweenService = game:GetService("TweenService")
local rotationGoal = {Rotation = 360}
local rotationInfo = TweenInfo.new(4, Enum.EasingStyle.Linear, Enum.EasingDirection.Out, math.huge, false, 0)
local rotationTween = TweenService:Create(AnimatedIcon, rotationInfo, rotationGoal)
rotationTween:Play()
while true do
local pulseUp = TweenService:Create(AnimatedIcon, TweenInfo.new(0.5, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {Size = UDim2.new(0.08, 0, 0.8, 0)})
local pulseDown = TweenService:Create(AnimatedIcon, TweenInfo.new(0.5, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {Size = UDim2.new(0.07, 0, 0.7, 0)})
pulseUp:Play()
pulseUp.Completed:Wait()
pulseDown:Play()
pulseDown.Completed:Wait()
task.wait(2)
end
end
coroutine.wrap(animateIcon)()
local UserInputService = game:GetService("UserInputService")
local TweenService = game:GetService("TweenService")
local dragging = false
local dragStart = Vector2.new(0,0)
local startPos = UDim2.new(0,0,0,0)
local function updateFramePosition(input)
local delta = input.Position - dragStart
local newPos = UDim2.new(startPos.X.Scale, startPos.X.Offset+delta.X, startPos.Y.Scale, startPos.Y.Offset+delta.Y)
TweenService:Create(MainFrame, TweenInfo.new(0.1,Enum.EasingStyle.Quad,Enum.EasingDirection.Out), {Position=newPos}):Play()
end
TopBar.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 then
dragging=true
dragStart=input.Position
startPos=MainFrame.Position
TweenService:Create(TopBar, TweenInfo.new(0.1,Enum.EasingStyle.Quad,Enum.EasingDirection.Out), {BackgroundTransparency=0.3}):Play()
input.Changed:Connect(function()
if input.UserInputState == Enum.UserInputState.End then
dragging=false
TweenService:Create(TopBar, TweenInfo.new(0.1,Enum.EasingStyle.Quad,Enum.EasingDirection.Out), {BackgroundTransparency=0}):Play()
end
end)
end
end)
UserInputService.InputChanged:Connect(function(input)
if dragging and input.UserInputType == Enum.UserInputType.MouseMovement then updateFramePosition(input) end
end)
CloseButton.MouseButton1Click:Connect(function()
local tw = TweenService:Create(MainFrame, TweenInfo.new(0.3,Enum.EasingStyle.Back,Enum.EasingDirection.In), {Position=UDim2.new(0.5,0,-1,0),Size=UDim2.new(0,0,0,0)})
tw:Play()
tw.Completed:Wait()
LunarisObfuscator:Destroy()
end)
local function setupButtonHover(btn)
btn.MouseEnter:Connect(function() TweenService:Create(btn, TweenInfo.new(0.2,Enum.EasingStyle.Quad,Enum.EasingDirection.Out), {BackgroundTransparency=0.1}):Play() end)
btn.MouseLeave:Connect(function() TweenService:Create(btn, TweenInfo.new(0.2,Enum.EasingStyle.Quad,Enum.EasingDirection.Out), {BackgroundTransparency=0}):Play() end)
end
setupButtonHover(ObfuscateButton)
setupButtonHover(CopyButton)
setupButtonHover(ClearButton)
setupButtonHover(CloseButton)
setupButtonHover(ChangelogButton)
setupButtonHover(SaveButton)
local AutoSaveEnabled = false
SaveButton.MouseButton1Click:Connect(function()
AutoSaveEnabled = not AutoSaveEnabled
if AutoSaveEnabled then
SaveButton.BackgroundColor3 = Color3.fromRGB(0, 170, 0)
SaveButton.BackgroundTransparency = 0.2
else
SaveButton.BackgroundColor3 = Color3.fromRGB(100, 100, 100)
SaveButton.BackgroundTransparency = 0.5
end
end)
TweenService:Create(MainFrame, TweenInfo.new(0.5,Enum.EasingStyle.Back,Enum.EasingDirection.Out), {Position=UDim2.new(0.3,0,0.2,0),Size=UDim2.new(0.4,0,0.6,0)}):Play()
local ChangelogFrame = Instance.new("Frame")
local ChangelogTextLabel = Instance.new("TextLabel")
local ChangelogCloseButton = Instance.new("TextButton")
ChangelogFrame.Name="ChangelogFrame"
ChangelogFrame.Parent=LunarisObfuscator
ChangelogFrame.BackgroundColor3=Color3.fromRGB(180,220,255); ChangelogFrame.BackgroundTransparency=0.9
ChangelogFrame.BorderSizePixel=0; ChangelogFrame.Position=UDim2.new(0.35,0,0.25,0)
ChangelogFrame.Size=UDim2.new(0.3,0,0.5,0); ChangelogFrame.Visible=false
local CFCorner=Instance.new("UICorner"); CFCorner.CornerRadius=UDim.new(0.03,0)
CFCorner.Parent=ChangelogFrame
ChangelogTextLabel.Name="ChangelogTextLabel"; ChangelogTextLabel.Parent=ChangelogFrame
ChangelogTextLabel.BackgroundTransparency=1
ChangelogTextLabel.Position=UDim2.new(0.05,0,0.05,0)
ChangelogTextLabel.Size=UDim2.new(0.9,0,0.9,0);
ChangelogTextLabel.Font=Enum.Font.GothamBold
ChangelogTextLabel.Text="CSLO Obfuscator v1.7.0\n- Full Custom VM\n- Bytecode Encryption\n- LWZ + Base92 Compression\n- FeedBack Plezzz"
ChangelogTextLabel.TextColor3=Color3.fromRGB(255,255,255)
ChangelogTextLabel.TextSize=16
ChangelogTextLabel.TextXAlignment=Enum.TextXAlignment.Left
ChangelogTextLabel.TextYAlignment=Enum.TextYAlignment.Top
ChangelogTextLabel.TextWrapped=true
ChangelogCloseButton.Name="ChangelogCloseButton"
ChangelogCloseButton.Parent=ChangelogFrame
ChangelogCloseButton.BackgroundColor3=Color3.fromRGB(180,80,80); ChangelogCloseButton.BackgroundTransparency=0.5
ChangelogCloseButton.BorderSizePixel=0; ChangelogCloseButton.Position=UDim2.new(0.9,0,0.02,0)
ChangelogCloseButton.Size=UDim2.new(0.08,0,0.08,0); ChangelogCloseButton.Font=Enum.Font.GothamBold
ChangelogCloseButton.Text="X"; ChangelogCloseButton.TextColor3=Color3.fromRGB(255,255,255); ChangelogCloseButton.TextSize=14
local CCCorner=Instance.new("UICorner"); CCCorner.CornerRadius=UDim.new(0.5,0)
CCCorner.Parent=ChangelogCloseButton
setupButtonHover(ChangelogCloseButton)
ChangelogButton.MouseButton1Click:Connect(function()
ChangelogFrame.Visible=true
TweenService:Create(ChangelogFrame, TweenInfo.new(0.3,Enum.EasingStyle.Back,Enum.EasingDirection.Out), {Position=UDim2.new(0.35,0,0.25,0),Size=UDim2.new(0.3,0,0.5,0)}):Play()
end)
ChangelogCloseButton.MouseButton1Click:Connect(function()
local tw=TweenService:Create(ChangelogFrame, TweenInfo.new(0.2,Enum.EasingStyle.Back,Enum.EasingDirection.In), {Position=UDim2.new(0.35,0,0.2,0),Size=UDim2.new(0.3,0,0,0)})
tw:Play(); tw.Completed:Wait(); ChangelogFrame.Visible=false
end)
local varCounter = 0
local usedVars = {}
local function newVar()
local name = ""
local temp = varCounter
repeat
local rem = temp % 52
local charCode = (rem < 26) and (97 + rem) or (65 + rem - 26)
name = string.char(charCode) .. name
temp = math.floor(temp / 52) - 1
until temp < 0
varCounter = varCounter + 1
return "_" .. name
end
local function lex(src)
local toks = {}
local len = #src
local pos = 1
local line = 1
local col = 1
local function byte(n) return string.byte(src, pos+(n or 0)) end
local function sub(s,e) return string.sub(src, s, e) end
local function isA(c) return (c>=65 and c<=90) or (c>=97 and c<=122) or c==95 end
local function isD(c) return c>=48 and c<=57 end
local function isAN(c) return isA(c) or isD(c) end
local function isH(c) return isD(c) or (c>=65 and c<=70) or (c>=97 and c<=102) end
local function isWS(c) return c==32 or c==9 end
local function adv(n)
n = n or 1
for i = 1, n do
local c = string.byte(src, pos)
pos = pos + 1
if c == 10 then line = line + 1; col = 1 else col = col + 1 end
end
end
local KW = {
["and"]=1,["break"]=1,["continue"]=1,["do"]=1,["else"]=1,
["elseif"]=1,["end"]=1,["false"]=1,["for"]=1,["function"]=1,
["if"]=1,["in"]=1,["local"]=1,["nil"]=1,["not"]=1,["or"]=1,
["repeat"]=1,["return"]=1,["then"]=1,["true"]=1,["until"]=1,
["while"]=1,
}
local function addT(tType, v, r, sPos, sCol, sLine)
toks[#toks+1] = {
raw = r or v,
type = tType,
index = sPos,
secondarytype = tType,
column = sCol,
length = pos - sPos,
line = sLine,
endindex = pos - 1,
value = v
}
end
local function skipLine()
while pos<=len and byte()~=10 and byte()~=13 do adv() end
end
local function readLong()
local eq=0; adv()
while byte()==61 do eq=eq+1; adv() end
if byte()~=91 then return nil end; adv()
if byte()==10 then adv() elseif byte()==13 then adv(); if byte()==10 then adv() end end
local cl="]"..string.rep("=",eq).."]"
local s2=string.find(src, cl, pos, true)
if not s2 then error("unfinished long string at "..pos) end
local content = sub(pos, s2-1)
for i=1, #content do
local c = string.byte(content, i)
if c == 10 then line = line + 1; col = 1 else col = col + 1 end
end
pos = s2 + #cl
col = col + #cl
return content
end
local function readStr(q)
adv(); local buf={}
while pos<=len do
local c=byte()
if c==q then adv(); break end
if c==92 then
adv(); local e=byte(); adv()
if e==110 then buf[#buf+1]="\n"
elseif e==116 then buf[#buf+1]="\t"
elseif e==114 then buf[#buf+1]="\r"
elseif e==92 then buf[#buf+1]="\\"
elseif e==39 then buf[#buf+1]="'"
elseif e==34 then buf[#buf+1]='"'
elseif e==48 then buf[#buf+1]="\0"
elseif e==117 then
if byte()==123 then
adv(); local hs=""
while byte()~=125 do hs=hs..string.char(byte()); adv() end
adv()
local cp=tonumber(hs,16) or 0
if cp<128 then buf[#buf+1]=string.char(cp)
elseif cp<2048 then buf[#buf+1]=string.char(192+math.floor(cp/64),128+cp%64)
else buf[#buf+1]=string.char(224+math.floor(cp/4096),128+math.floor(cp%4096/64),128+cp%64) end
end
elseif e>=48 and e<=57 then
local ns=string.char(e)
if byte()>=48 and byte()<=57 then ns=ns..string.char(byte()); adv() end
if byte()>=48 and byte()<=57 then ns=ns..string.char(byte()); adv() end
buf[#buf+1]=string.char(tonumber(ns))
else buf[#buf+1]=string.char(e) end
else buf[#buf+1]=string.char(c); adv() end
end
return table.concat(buf)
end
local function readNum()
local s=pos
if byte()==48 and (byte(1)==120 or byte(1)==88) then
adv(2)
while pos<=len and isH(byte()) do adv() end
if byte()==46 then adv(); while pos<=len and isH(byte()) do adv() end end
if byte()==112 or byte()==80 then adv()
if byte()==43 or byte()==45 then adv() end
while pos<=len and isD(byte()) do adv() end end
else
while pos<=len and isD(byte()) do adv() end
if byte()==46 and byte(1)~=46 then adv()
while pos<=len and isD(byte()) do adv() end end
if byte()==101 or byte()==69 then adv()
if byte()==43 or byte()==45 then adv() end
while pos<=len and isD(byte()) do adv() end end
end
return sub(s,pos-1)
end
while pos<=len do
local c=byte()
local sP, sC, sL = pos, col, line
if isWS(c) then adv()
elseif c==10 or c==13 then
local r = string.char(c)
adv()
if c==13 and byte()==10 then r = r .. "\n"; adv() end
addT("newline", r, r, sP, sC, sL)
elseif c==45 and byte(1)==45 then
adv(2)
if byte()==91 then
local sv=pos; adv()
local eq2=0; while byte()==61 do eq2=eq2+1; adv() end
if byte()==91 then
adv()
local cl="]"..string.rep("=",eq2).."]"
local s2=string.find(src,cl,pos,true)
if s2 then pos=s2+#cl else pos=len+1 end
else pos=sv; skipLine() end
else skipLine() end
elseif c==34 or c==39 then
local q=c; local s=readStr(c)
addT("string",s, sub(sP,pos-1), sP, sC, sL)
elseif c==91 and (byte(1)==91 or byte(1)==61) then
adv()
local ls=readLong()
if ls then addT("string",ls,sub(sP,pos-1), sP, sC, sL) else pos=sP; addT("punctuation","[","[", sP, sC, sL); adv() end
elseif isD(c) or (c==46 and isD(byte(1))) then
local ns=readNum(); addT("number",ns, ns, sP, sC, sL)
elseif isA(c) then
while pos<=len and isAN(byte()) do adv() end
local w=sub(sP,pos-1)
if KW[w] then addT("keyword",w, w, sP, sC, sL) else addT("identifier",w, w, sP, sC, sL) end
elseif c==46 then
if byte(1)==46 and byte(2)==46 then adv(3); addT("punctuation","...", "...", sP, sC, sL)
elseif byte(1)==46 then adv(2); addT("punctuation","..", "..", sP, sC, sL)
else adv(); addT("punctuation",".", ".", sP, sC, sL) end
elseif c==61 then
if byte(1)==61 then adv(2); addT("punctuation","==", "==", sP, sC, sL) else adv(); addT("punctuation","=", "=", sP, sC, sL) end
elseif c==126 and byte(1)==61 then adv(2); addT("punctuation","~=", "~=", sP, sC, sL)
elseif c==60 then
if byte(1)==61 then adv(2); addT("punctuation","<=", "<=", sP, sC, sL) else adv(); addT("punctuation","<", "<", sP, sC, sL) end
elseif c==62 then
if byte(1)==61 then adv(2); addT("punctuation",">=", ">=", sP, sC, sL) else adv(); addT("punctuation",">", ">", sP, sC, sL) end
elseif c==58 then
if byte(1)==58 then adv(2); addT("punctuation","::", "::", sP, sC, sL) else adv(); addT("punctuation",":", ":", sP, sC, sL) end
elseif c==47 and byte(1)==47 then adv(2); addT("punctuation","//", "//", sP, sC, sL)
else
local ch=string.char(c)
adv(); addT("punctuation",ch, ch, sP, sC, sL)
end
end
addT("eof","EOF", "EOF", pos, col, line)
return toks
end
local function renameVars(toks)
local scope = {{}}
local globalRename = {}
local PROTECTED = {
["print"]=1,["tostring"]=1,["tonumber"]=1,["type"]=1,["pairs"]=1,
["ipairs"]=1,["next"]=1,["select"]=1,["unpack"]=1,["rawget"]=1,
["rawset"]=1,["rawequal"]=1,["setmetatable"]=1,["getmetatable"]=1,
["pcall"]=1,["xpcall"]=1,["error"]=1,["assert"]=1,["require"]=1,
["math"]=1,["string"]=1,["table"]=1,["bit32"]=1,["os"]=1,["io"]=1,
["game"]=1,["workspace"]=1,["script"]=1,["Instance"]=1,
["Vector2"]=1,["Vector3"]=1,["Color3"]=1,["UDim"]=1,["UDim2"]=1,
["CFrame"]=1,["Enum"]=1,["Rect"]=1,["TweenInfo"]=1,["BrickColor"]=1,
["Region3"]=1,["Ray"]=1,["NumberRange"]=1,["ColorSequence"]=1,
["task"]=1,["coroutine"]=1,["_G"]=1,["_ENV"]=1,["self"]=1,
["wait"]=1,["spawn"]=1,["delay"]=1,["typeof"]=1,["warn"]=1,
["tick"]=1,["time"]=1,["collectgarbage"]=1,
}
local nameMap = {}
local function getTok(i)
while toks[i] and toks[i].type == "newline" do i=i+1 end
return toks[i], i
end
local function collectLocals()
local i=1
while i<=#toks do
local t, nxt = getTok(i)
if not t then break end
i = nxt
if t.type=="keyword" and t.value=="local" then
local nj = i+1
local t2, j = getTok(nj)
if t2 and t2.type=="keyword" and t2.value=="function" then
local t3, k = getTok(j+1)
if t3 and t3.type=="identifier" and not PROTECTED[t3.value] then
if not nameMap[t3.value] then nameMap[t3.value]=newVar() end
end
elseif t2 and t2.type=="identifier" then
while t2 and t2.type=="identifier" do
if not PROTECTED[t2.value] and not nameMap[t2.value] then
nameMap[t2.value]=newVar()
end
local tComma, nk = getTok(j+1)
if tComma and tComma.type=="punctuation" and tComma.value=="," then
t2, j = getTok(nk+1)
else break end
end
end
elseif t.type=="keyword" and t.value=="function" then
local nj = i+1
local tj, j = getTok(nj)
while tj and not (tj.type=="punctuation" and tj.value=="(") do
tj, j = getTok(j+1)
end
tj, j = getTok(j+1)
while tj and not (tj.type=="punctuation" and tj.value==")") do
if tj.type=="identifier" and not PROTECTED[tj.value] and not nameMap[tj.value] then
nameMap[tj.value]=newVar()
end
tj, j = getTok(j+1)
end
elseif (t.type=="keyword" and t.value=="for") then
local nj = i+1
local tj, j = getTok(nj)
while tj and not (tj.type=="keyword" and tj.value=="in") and not (tj.type=="punctuation" and tj.value=="=") do
if tj.type=="identifier" and not PROTECTED[tj.value] and not nameMap[tj.value] then
nameMap[tj.value]=newVar()
end
local tComma, nk = getTok(j+1)
if tComma and tComma.type=="punctuation" and tComma.value=="," then
tj, j = getTok(nk+1)
else break end
end
end
i=i+1
end
end
collectLocals()
local result = {}
for _,t in ipairs(toks) do
if t.type=="identifier" and nameMap[t.value] then
local newName = nameMap[t.value]
t.value = newName
t.raw = newName
t.length = #newName
result[#result+1]=t
else
result[#result+1]=t
end
end
return result
end
local function makeOpcodes()
local used = {}
local function fop()
local val
repeat val = math.random(1, 65535) until not used[val]
used[val] = true
return val
end
return {
M_PUSH_REG=fop(), M_PUSH_K=fop(), M_PUSH_LIT=fop(),
M_MOVE_CONST_ID=fop(), M_DECRYPT_CONST=fop(), M_WRITE_REG=fop(), M_TAG_TAINT=fop(), M_MASK_WRITE=fop(),
M_FETCH_REG_ID=fop(),
M_POP_ALU_B=fop(), M_POP_ALU_A=fop(),
M_ALU_ADD=fop(), M_ALU_SUB=fop(), M_ALU_MUL=fop(), M_ALU_DIV=fop(), M_ALU_MOD=fop(), M_ALU_POW=fop(), M_ALU_IDIV=fop(), M_ALU_BAND=fop(),
M_ALU_BOR=fop(), M_ALU_BXOR=fop(), M_ALU_SHL=fop(), M_ALU_SHR=fop(), M_ALU_UNM=fop(), M_ALU_BNOT=fop(), M_ALU_NOT=fop(), M_ALU_LEN=fop(),
M_LOADBOOL=fop(), M_LOADNIL=fop(),
M_GETGLOBAL=fop(), M_SETGLOBAL=fop(), M_GETTABLE=fop(), M_SETTABLE=fop(), M_NEWTABLE=fop(), M_SELF=fop(),
M_CONCAT=fop(), M_JMP=fop(), M_EQ=fop(), M_LT=fop(), M_LE=fop(), M_TEST=fop(), M_CALL=fop(),
M_RETURN=fop(), M_FORPREP=fop(), M_FORLOOP=fop(), M_CLOSURE=fop(), M_HALT=fop(), M_NOP=fop(), M_EXEC_SUB=fop(), M_SECURE_ERASE=fop(),
M_GETUPVAL=fop(), M_SETUPVAL=fop(),
SUB_OP_DEC=fop(), SUB_OP_RET=fop()
}
end
local function parseAST(toks)
local tp=1
local function T()
while toks[tp] and toks[tp].type == "newline" do tp = tp + 1 end
return toks[tp] or {type="eof", value="EOF", raw="EOF"}
end
local function Tt() return T().type end
local function Tv() return T().value end
local function Pt(n)
local tmp = tp
local c = 0
while true do
while toks[tmp] and toks[tmp].type == "newline" do tmp = tmp + 1 end
c = c + 1
if c >= n then break end
tmp = tmp + 1
end
local x = toks[tmp]
return x and x.type or "eof"
end
local function Pv(n)
local tmp = tp
local c = 0
while true do
while toks[tmp] and toks[tmp].type == "newline" do tmp = tmp + 1 end
c = c + 1
if c >= n then break end
tmp = tmp + 1
end
local x = toks[tmp]
return x and x.value or ""
end
local function adv()
tp=tp+1
while toks[tp] and toks[tp].type == "newline" do tp = tp + 1 end
end
local function chk(t,v) if v then return T().type==t and T().value==v end return T().type==t end
local function eat(t,v)
if not chk(t,v) then error("Expected "..t..(v and " '"..v.."'" or "").." got "..T().type.." '"..tostring(T().value).."'") end
local r=T(); adv(); return r
end
local function try(t,v) if chk(t,v) then adv(); return true end end
local parseExpr,parseStat,parseBlock,parseFB
local BOPS={["or"]=1,["and"]=2,["<"]=3,[">"]=3,["<="]=3,[">="]=3,["=="]=3,["~="]=3,
[".."]=4,["+"]=5,["-"]=5,["*"]=6,["/"]=6,["%"]=6,["//"]=6,["^"]=7}
local RASS={["^"]=true,[".."]=true}
local ENDS={["end"]=1,["else"]=1,["elseif"]=1,["until"]=1,["eof"]=1}
local function pSfx(base)
while true do
if chk("punctuation",".") then
adv(); local f=eat("identifier").value
base = { type="MemberExpression", base=base, identifier=f }
elseif chk("punctuation","[") then
adv(); local idx=parseExpr(); eat("punctuation","]")
base = { type="IndexExpression", base=base, index=idx }
elseif chk("punctuation",":") then
adv(); local m=eat("identifier").value
eat("punctuation","(")
local args={}
if not chk("punctuation",")") then
args[#args+1]=parseExpr()
while try("punctuation",",") do args[#args+1]=parseExpr() end
end
eat("punctuation",")")
base = { type="CallExpression", base=base, method=m, arguments=args, isSelf=true }
elseif chk("punctuation","(") then
adv(); local args={}
if not chk("punctuation",")") then
args[#args+1]=parseExpr()
while try("punctuation",",") do args[#args+1]=parseExpr() end
end
eat("punctuation",")")
base = { type="CallExpression", base=base, arguments=args, isSelf=false }
elseif chk("string") then
local sv=T().value; adv()
base = { type="CallExpression", base=base, arguments={{type="Literal", kind="string", value=sv}}, isSelf=false }
elseif chk("punctuation","{") then
adv()
local fields={}
while not chk("punctuation","}") do
if chk("identifier") and Pt(2)=="punctuation" and Pv(2)=="=" then
local k=T().value; adv(); adv()
fields[#fields+1]={ key={type="Literal", kind="string", value=k}, value=parseExpr() }
elseif chk("punctuation","[") then
adv(); local k=parseExpr(); eat("punctuation","]"); eat("punctuation","=")
fields[#fields+1]={ key=k, value=parseExpr() }
else fields[#fields+1]={ key=nil, value=parseExpr() } end
if not try("punctuation",",") then try("punctuation",";") end
end
eat("punctuation","}")
base = { type="CallExpression", base=base, arguments={{type="TableLiteral", fields=fields}}, isSelf=false }
else break end
end
return base
end
local function pPrim()
local t=T()
if t.type=="number" then adv(); return { type="Literal", kind="number", value=tonumber(t.value) }
elseif t.type=="string" then adv(); return { type="Literal", kind="string", value=t.value }
elseif t.type=="keyword" and t.value=="true" then adv(); return { type="Literal", kind="boolean", value=true }
elseif t.type=="keyword" and t.value=="false" then adv(); return { type="Literal", kind="boolean", value=false }
elseif t.type=="keyword" and t.value=="nil" then adv(); return { type="Literal", kind="nil", value=nil }
elseif t.type=="punctuation" and t.value=="..." then adv(); return { type="VarargLiteral" }
elseif t.type=="keyword" and t.value=="function" then adv(); return parseFB()
elseif t.type=="punctuation" and t.value=="(" then
adv(); local e=parseExpr(); eat("punctuation",")"); return pSfx(e)
elseif t.type=="keyword" and t.value=="not" then adv(); return { type="UnaryExpression", operator="not", argument=pPrim() }
elseif t.type=="punctuation" and t.value=="-" then adv(); return { type="UnaryExpression", operator="-", argument=pPrim() }
elseif t.type=="punctuation" and t.value=="#" then adv(); return { type="UnaryExpression", operator="#", argument=pPrim() }
elseif t.type=="punctuation" and t.value=="~" then adv(); return { type="UnaryExpression", operator="~", argument=pPrim() }
elseif t.type=="punctuation" and t.value=="{" then
adv()
local fields={}
while not chk("punctuation","}") do
if chk("identifier") and Pt(2)=="punctuation" and Pv(2)=="=" then
local k=T().value; adv(); adv()
fields[#fields+1]={ key={type="Literal", kind="string", value=k}, value=parseExpr() }
elseif chk("punctuation","[") then
adv(); local k=parseExpr(); eat("punctuation","]"); eat("punctuation","=")
fields[#fields+1]={ key=k, value=parseExpr() }
else fields[#fields+1]={ key=nil, value=parseExpr() } end
if not try("punctuation",",") then try("punctuation",";") end
end
eat("punctuation","}")
return { type="TableLiteral", fields=fields }
elseif t.type=="identifier" then
local n=t.value; adv()
return pSfx({ type="Identifier", name=n })
else error("Unexpected token in expression: "..t.type.." '"..t.value.."'") end
end
parseExpr = function(mp)
mp=mp or 0
local node=pPrim()
while true do
local op=T().value
local pr=BOPS[op]
if not pr or pr<=mp then break end
if (op=="+" or op=="-" or op=="*" or op=="/" or op=="%" or op=="^" or op=="..") and Pt(2)=="punctuation" and Pv(2)=="=" then
break
end
adv()
local np2=RASS[op] and pr-1 or pr
local right=parseExpr(np2)
node={ type="BinaryExpression", operator=op, left=node, right=right }
end
return node
end
parseFB = function()
eat("punctuation","(")
local params={}; local isva=false
while not chk("punctuation",")") do
if chk("punctuation","...") then isva=true; adv(); break end
params[#params+1]=eat("identifier").value; try("punctuation",",")
end
eat("punctuation",")")
local body=parseBlock(); eat("keyword","end")
return { type="FunctionDefinition", params=params, isVararg=isva, body=body }
end
parseStat = function()
local t=T()
if t.type=="keyword" and t.value=="local" then
adv()
if chk("keyword","function") then
adv(); local n=eat("identifier").value; local fb=parseFB()
return { type="LocalFunctionDefinition", name=n, functionDef=fb }
else
local names={eat("identifier").value}
while try("punctuation",",") do names[#names+1]=eat("identifier").value end
local values={}
if try("punctuation","=") then
values[#values+1]=parseExpr()
while try("punctuation",",") do values[#values+1]=parseExpr() end
end
return { type="LocalDefinition", names=names, values=values }
end
elseif t.type=="keyword" and t.value=="function" then
adv(); local n=eat("identifier").value; local chain={n}
while chk("punctuation",".") do adv(); chain[#chain+1]=eat("identifier").value end
local isM=false
if chk("punctuation",":") then adv(); chain[#chain+1]=eat("identifier").value; isM=true end
local fb=parseFB()
return { type="GlobalFunctionDefinition", chain=chain, isMethod=isM, functionDef=fb }
elseif t.type=="keyword" and t.value=="return" then
adv(); local args={}
if not ENDS[Tv()] and not chk("punctuation",";") then
args[#args+1]=parseExpr()
while try("punctuation",",") do args[#args+1]=parseExpr() end
end
try("punctuation",";")
return { type="ReturnStatement", arguments=args }
elseif t.type=="keyword" and t.value=="if" then
adv(); local clauses={}
clauses[#clauses+1]={ condition=parseExpr(), body=parseBlock() }
while chk("keyword","elseif") do
adv(); clauses[#clauses+1]={ condition=parseExpr(), body=parseBlock() }
end
local elseBody=nil
if try("keyword","else") then elseBody=parseBlock() end
eat("keyword","end")
return { type="IfStatement", clauses=clauses, elseBody=elseBody }
elseif t.type=="keyword" and t.value=="while" then
adv(); local cond=parseExpr(); eat("keyword","do"); local body=parseBlock(); eat("keyword","end")
return { type="WhileStatement", condition=cond, body=body }
elseif t.type=="keyword" and t.value=="repeat" then
adv(); local body=parseBlock(); eat("keyword","until"); local cond=parseExpr()
return { type="RepeatUntilStatement", body=body, condition=cond }
elseif t.type=="keyword" and t.value=="for" then
adv(); local vn=eat("identifier").value
if try("punctuation","=") then
local start=parseExpr(); eat("punctuation",","); local limit=parseExpr(); local step=nil
if try("punctuation",",") then step=parseExpr() end
eat("keyword","do"); local body=parseBlock(); eat("keyword","end")
return { type="ForNumericStatement", variable=vn, start=start, limit=limit, step=step, body=body }
else
local names={vn}
while not chk("keyword","in") do try("punctuation",","); if chk("identifier") then names[#names+1]=eat("identifier").value end end
eat("keyword","in"); local iters={}
iters[#iters+1]=parseExpr()
while try("punctuation",",") do iters[#iters+1]=parseExpr() end
eat("keyword","do"); local body=parseBlock(); eat("keyword","end")
return { type="ForGenericStatement", variables=names, iterators=iters, body=body }
end
elseif t.type=="keyword" and t.value=="do" then
adv(); local body=parseBlock(); eat("keyword","end"); return { type="DoStatement", body=body }
elseif t.type=="keyword" and t.value=="break" then
adv(); return { type="BreakStatement" }
elseif t.type=="keyword" and t.value=="continue" then
adv(); return { type="ContinueStatement" }
elseif t.type=="identifier" or (t.type=="punctuation" and t.value=="(") then
local firstExpr = parseExpr()
local isCompound = false
local cOp = ""
local nxtVal = T().value
if (nxtVal=="+" or nxtVal=="-" or nxtVal=="*" or nxtVal=="/" or nxtVal=="%" or nxtVal=="^" or nxtVal=="..") and Pt(2)=="punctuation" and Pv(2)=="=" then
isCompound = true
cOp = nxtVal
adv(); adv()
end
if isCompound then
local rhs = { parseExpr() }
while try("punctuation",",") do rhs[#rhs+1] = parseExpr() end
try("punctuation",";")
rhs[1] = { type="BinaryExpression", operator=cOp, left=firstExpr, right=rhs[1] }
return { type="AssignmentStatement", lhs={firstExpr}, rhs=rhs }
elseif chk("punctuation","=") or chk("punctuation",",") then
local lhs = { firstExpr }
while try("punctuation",",") do lhs[#lhs+1] = parseExpr() end
eat("punctuation","=")
local rhs = { parseExpr() }
while try("punctuation",",") do rhs[#rhs+1] = parseExpr() end
try("punctuation",";")
return { type="AssignmentStatement", lhs=lhs, rhs=rhs }
else
try("punctuation",";")
return { type="ExpressionStatement", expression=firstExpr }
end
elseif t.type=="punctuation" and t.value==";" then adv()
else adv() end
try("punctuation",";")
end
parseBlock = function()
local block = {}
while Tt()~="eof" and not (Tt()=="keyword" and ENDS[Tv()]) do
local s=parseStat()
if s then block[#block+1]=s end
end
return block
end
return { type="Chunk", body=parseBlock() }
end
local function compileAST(ast, OC)
local function newP(np, parent) return {c={},k={},ki={},np=np or 0,mr=np or 0,sc={{}},lc=np or 0,pr={},va=false,sub_c={},loopStack={},upvalues={},parent=parent} end
local function getOrAddStrKey(p, str)
local lookup = "enc_str:"..str
if p.ki[lookup] ~= nil then
return p.ki[lookup], p.k[p.ki[lookup]+1].key
end
local k_key = math.random(1, 255) + (#str * math.random(1, 255))
local k_obj = {type="enc_string", val=str, key=k_key}
local i = #p.k
p.k[i+1] = k_obj
p.ki[lookup] = i
return i, k_key
end
local function addK(p,v)
local key=type(v)..":"..tostring(v)
if p.ki[key]~=nil then return p.ki[key] end
local i=#p.k; p.k[i+1]=v; p.ki[key]=i; return i
end
local function emit(p,...) p.c[#p.c+1]={...}; return #p.c-1 end
local function patch(p,i,t2) p.c[i+1][2]=t2 end
local function aR(p) local r=p.lc; p.lc=r+1; if p.lc>p.mr then p.mr=p.lc end; return r end
local function fR(p) p.lc=p.lc-1 end
local function nL(p,n) local r=aR(p); p.sc[#p.sc][#p.sc[#p.sc]+1]={n=n,r=r}; return r end
local function fL(p,n)
for s=#p.sc,1,-1 do
for i=#p.sc[s],1,-1 do
if p.sc[s][i].n==n then return p.sc[s][i].r end
end
end
return nil
end
local function resolveUpval(p, name)
if not p.parent then return nil end
local r = fL(p.parent, name)
if r then
for i, uv in ipairs(p.upvalues) do
if uv.isLocal and uv.index == r then return i - 1 end
end
table.insert(p.upvalues, {isLocal = true, index = r})
return #p.upvalues - 1
end
local ur = resolveUpval(p.parent, name)
if ur then
for i, uv in ipairs(p.upvalues) do
if not uv.isLocal and uv.index == ur then return i - 1 end
end
table.insert(p.upvalues, {isLocal = false, index = ur})
return #p.upvalues - 1
end
return nil
end
local function pushS(p) p.sc[#p.sc+1]={} end
local function popS(p) local s=p.sc[#p.sc]; p.lc=p.lc-#s; p.sc[#p.sc]=nil end
local function emitPUSH_REG(p, reg) return emit(p, OC.M_PUSH_REG, reg) end
local function emitPUSH_K(p, k_idx) return emit(p, OC.M_PUSH_K, k_idx) end
local function emitPUSH_LIT(p, val) return emit(p, OC.M_PUSH_LIT, val) end
local function eJMP(p, target) local i=emitPUSH_LIT(p, target); emit(p, OC.M_JMP); return i end
local function emitMOVE(p, dst, src)
emit(p, OC.M_FETCH_REG_ID, src)
emit(p, OC.M_WRITE_REG, dst)
end
local function emitALU(p, op, dst, src1, src2)
emit(p, OC.M_PUSH_REG, src1)
emit(p, OC.M_PUSH_REG, src2)
emit(p, OC.M_POP_ALU_B)
emit(p, OC.M_POP_ALU_A)
emit(p, op)
emit(p, OC.M_WRITE_REG, dst)
end
local function emitALU_UNARY(p, op, dst, src)
emit(p, OC.M_PUSH_REG, src)
emit(p, op)
emit(p, OC.M_WRITE_REG, dst)
end
local function eCmp(p,op,dst,B,C)
emitPUSH_LIT(p, 1); emitPUSH_REG(p, B); emitPUSH_REG(p, C); emit(p, op)
local j1=eJMP(p, 0)
emitPUSH_LIT(p, 0); emitPUSH_LIT(p, 0); emit(p, OC.M_LOADBOOL, dst)
local j2=eJMP(p, 0)
patch(p, j1, #p.c + 1)
emitPUSH_LIT(p, 1); emitPUSH_LIT(p, 0); emit(p, OC.M_LOADBOOL, dst)
patch(p, j2, #p.c + 1)
end
local function emitLOADK_NonLinearMBA(p, dst, val)
if type(val) == "number" and val == math.floor(val) and val >= 0 and val <= 2147483647 then
local xkey = math.random(1, 65535)
local enc = bit32.bxor(math.floor(val), xkey)
emitPUSH_LIT(p, enc)
emitPUSH_LIT(p, xkey)
emit(p, OC.M_POP_ALU_B)
emit(p, OC.M_POP_ALU_A)
emit(p, OC.M_ALU_BXOR)
emit(p, OC.M_WRITE_REG, dst)
else
local mask = math.random(10, 9999)
local enc_val = val - mask
local k_idx = #p.k
p.k[k_idx + 1] = enc_val
p.ki["__enc_flt_" .. k_idx] = k_idx
emitPUSH_K(p, k_idx)
emitPUSH_LIT(p, mask)
emit(p, OC.M_POP_ALU_B)
emit(p, OC.M_POP_ALU_A)
emit(p, OC.M_ALU_ADD)
emit(p, OC.M_WRITE_REG, dst)
end
end
local compileExpr, compileStat, compileBlock
compileExpr = function(p, node, dst)
if node.type == "Literal" then
if node.kind == "number" then emitLOADK_NonLinearMBA(p, dst, node.value)
elseif node.kind == "string" then
local strID, strKey = getOrAddStrKey(p, node.value)
emitPUSH_K(p, strID); emit(p, OC.M_EXEC_SUB, dst, strKey)
elseif node.kind == "boolean" then emitPUSH_LIT(p, node.value and 1 or 0); emitPUSH_LIT(p, 0); emit(p, OC.M_LOADBOOL, dst)
elseif node.kind == "nil" then emitPUSH_LIT(p, dst); emitPUSH_LIT(p, dst); emit(p, OC.M_LOADNIL) end
elseif node.type == "VarargLiteral" then
emitPUSH_LIT(p, dst); emitPUSH_LIT(p, dst); emit(p, OC.M_LOADNIL)
elseif node.type == "FunctionDefinition" then
local fp=newP(#node.params, p); fp.va=node.isVararg
pushS(fp)
for i, pn in ipairs(node.params) do
local r = i - 1
fp.sc[#fp.sc][#fp.sc[#fp.sc]+1] = {n = pn, r = r}
end
compileBlock(fp, node.body)
popS(fp)
emitPUSH_LIT(fp, 0); emitPUSH_LIT(fp, 0); emit(fp, OC.M_RETURN)
local pi=#p.pr; p.pr[pi+1]=fp
emitPUSH_LIT(p, pi); emit(p, OC.M_CLOSURE, dst)
elseif node.type == "Identifier" then
local r=fL(p, node.name)
if r then if dst~=r then emitMOVE(p, dst, r) end
else
local u = resolveUpval(p, node.name)
if u then
emitPUSH_LIT(p, u)
emit(p, OC.M_GETUPVAL, dst)
else
local strID, strKey = getOrAddStrKey(p, node.name)
emitPUSH_K(p, strID); emit(p, OC.M_GETGLOBAL, dst, strKey)
end
end
elseif node.type == "UnaryExpression" then
compileExpr(p, node.argument, dst)
if node.operator == "not" then emitALU_UNARY(p, OC.M_ALU_NOT, dst, dst)
elseif node.operator == "-" then emitALU_UNARY(p, OC.M_ALU_UNM, dst, dst)
elseif node.operator == "#" then emitALU_UNARY(p, OC.M_ALU_LEN, dst, dst)
elseif node.operator == "~" then emitALU_UNARY(p, OC.M_ALU_BNOT, dst, dst) end
elseif node.type == "TableLiteral" then
emit(p, OC.M_NEWTABLE, dst)
local idx=1
for _, field in ipairs(node.fields) do
if field.key then
local kr=aR(p); local vr=aR(p)
compileExpr(p, field.key, kr); compileExpr(p, field.value, vr)
emitPUSH_REG(p, dst); emitPUSH_REG(p, kr); emitPUSH_REG(p, vr); emit(p, OC.M_SETTABLE); fR(p); fR(p)
else
local kr=aR(p); local vr=aR(p)
emitLOADK_NonLinearMBA(p, kr, idx); compileExpr(p, field.value, vr)
emitPUSH_REG(p, dst); emitPUSH_REG(p, kr); emitPUSH_REG(p, vr); emit(p, OC.M_SETTABLE); fR(p); fR(p);
idx=idx+1
end
end
elseif node.type == "BinaryExpression" then
compileExpr(p, node.left, dst)
local rr=aR(p); compileExpr(p, node.right, rr)
local op=node.operator
if op=="+" then emitALU(p, OC.M_ALU_ADD, dst, dst, rr)
elseif op=="-" then emitALU(p, OC.M_ALU_SUB, dst, dst, rr)
elseif op=="*" then emitALU(p, OC.M_ALU_MUL, dst, dst, rr)
elseif op=="/" then emitALU(p, OC.M_ALU_DIV, dst, dst, rr)
elseif op=="%" then emitALU(p, OC.M_ALU_MOD, dst, dst, rr)
elseif op=="^" then emitALU(p, OC.M_ALU_POW, dst, dst, rr)
elseif op==".." then emitPUSH_LIT(p, dst); emitPUSH_LIT(p, rr); emit(p, OC.M_CONCAT, dst)
elseif op=="//" then emitALU(p, OC.M_ALU_IDIV, dst, dst, rr)
elseif op=="&" then emitALU(p, OC.M_ALU_BAND, dst, dst, rr)
elseif op=="|" then emitALU(p, OC.M_ALU_BOR, dst, dst, rr)
elseif op=="~" then emitALU(p, OC.M_ALU_BXOR, dst, dst, rr)
elseif op=="<<" then emitALU(p, OC.M_ALU_SHL, dst, dst, rr)
elseif op==">>" then emitALU(p, OC.M_ALU_SHR, dst, dst, rr)
elseif op=="==" then eCmp(p,OC.M_EQ,dst,dst,rr)
elseif op=="~=" then
emitPUSH_LIT(p, 0); emitPUSH_REG(p, dst); emitPUSH_REG(p, rr); emit(p, OC.M_EQ); local j=eJMP(p, 0)
emitPUSH_LIT(p, 0); emitPUSH_LIT(p, 0); emit(p, OC.M_LOADBOOL, dst); local j2=eJMP(p, 0)
patch(p,j,#p.c + 1); emitPUSH_LIT(p, 1); emitPUSH_LIT(p, 0); emit(p, OC.M_LOADBOOL, dst); patch(p,j2,#p.c + 1)
elseif op=="<" then eCmp(p,OC.M_LT,dst,dst,rr)
elseif op=="<=" then eCmp(p,OC.M_LE,dst,dst,rr)
elseif op==">" then eCmp(p,OC.M_LT,dst,rr,dst)
elseif op==">=" then eCmp(p,OC.M_LE,dst,rr,dst)
elseif op=="and" then
emitPUSH_REG(p, dst); emitPUSH_LIT(p, 0); emit(p, OC.M_TEST); local j=eJMP(p, 0)
emitMOVE(p, dst, rr); patch(p,j,#p.c + 1)
elseif op=="or" then
emitPUSH_REG(p, dst); emitPUSH_LIT(p, 1); emit(p, OC.M_TEST); local j=eJMP(p, 0)
emitMOVE(p, dst, rr); patch(p,j,#p.c + 1)
end
fR(p)
elseif node.type == "MemberExpression" then
compileExpr(p, node.base, dst)
local strID, strKey = getOrAddStrKey(p, node.identifier)
local kr=aR(p); emitPUSH_K(p, strID); emit(p, OC.M_EXEC_SUB, kr, strKey)
emitPUSH_REG(p, dst); emitPUSH_REG(p, kr); emit(p, OC.M_GETTABLE, dst); fR(p)
elseif node.type == "IndexExpression" then
compileExpr(p, node.base, dst)
local kr=aR(p); compileExpr(p, node.index, kr)
emitPUSH_REG(p, dst); emitPUSH_REG(p, kr); emit(p, OC.M_GETTABLE, dst); fR(p)
elseif node.type == "CallExpression" then
if node.isSelf then
local t_base = aR(p)
compileExpr(p, node.base, t_base)
local sk = aR(p)
local c_base = aR(p)
local self_reserved = aR(p)
local na = 1
local string_args = {}
for _, arg in ipairs(node.arguments) do
local ar = aR(p)
if arg.type == "Literal" and arg.kind == "string" then
table.insert(string_args, {node = arg, reg = ar})
else
compileExpr(p, arg, ar)
end
na = na + 1
end
local strID, strKey = getOrAddStrKey(p, node.method)
emitPUSH_K(p, strID)
emit(p, OC.M_EXEC_SUB, sk, strKey)
emitPUSH_REG(p, t_base)
emitPUSH_REG(p, sk)
emit(p, OC.M_SELF, c_base)
emit(p, OC.M_SECURE_ERASE, sk)
for _, sArg in ipairs(string_args) do
compileExpr(p, sArg.node, sArg.reg)
end
emitPUSH_LIT(p, c_base)
emitPUSH_LIT(p, na)
emitPUSH_LIT(p, 1)
emit(p, OC.M_CALL)
if dst ~= c_base then emitMOVE(p, dst, c_base) end
for _, sArg in ipairs(string_args) do
emit(p, OC.M_SECURE_ERASE, sArg.reg)
end
for _ = 1, na + 3 do fR(p) end
else
local c_base = aR(p)
compileExpr(p, node.base, c_base)
local na = 0
local string_args = {}
for _, arg in ipairs(node.arguments) do
local ar = aR(p)
if arg.type == "Literal" and arg.kind == "string" then
table.insert(string_args, {node = arg, reg = ar})
else
compileExpr(p, arg, ar)
end
na = na + 1
end
for _, sArg in ipairs(string_args) do
compileExpr(p, sArg.node, sArg.reg)
end
emitPUSH_LIT(p, c_base)
emitPUSH_LIT(p, na)
emitPUSH_LIT(p, 1)
emit(p, OC.M_CALL)
if dst ~= c_base then emitMOVE(p, dst, c_base) end
for _, sArg in ipairs(string_args) do
emit(p, OC.M_SECURE_ERASE, sArg.reg)
end
for _ = 1, na + 1 do fR(p) end
end
end
end
compileStat = function(p, node)
if node.type == "LocalDefinition" then
local rs={}
for _, n in ipairs(node.names) do
rs[#rs+1]=nL(p, n)
emitPUSH_LIT(p, rs[#rs]); emitPUSH_LIT(p, rs[#rs]); emit(p, OC.M_LOADNIL)
end
for i, valNode in ipairs(node.values) do
if rs[i] then
compileExpr(p, valNode, rs[i])
if valNode.type == "CallExpression" and i == #node.values and #rs > i then
local req_nrv = #rs - i + 1
for b = #p.c, 1, -1 do
if p.c[b][1] == OC.M_CALL then
if p.c[b-1] and p.c[b-1][1] == OC.M_PUSH_LIT then
p.c[b-1][2] = req_nrv
local c_base = p.c[b-3][2]
for j = 1, req_nrv - 1 do
emitMOVE(p, rs[i + j], c_base + j)
end
end
break
end
end
else
end
end
end
elseif node.type == "LocalFunctionDefinition" then
local r=nL(p, node.name)
emitPUSH_LIT(p, r); emitPUSH_LIT(p, r); emit(p, OC.M_LOADNIL)
compileExpr(p, node.functionDef, r)
elseif node.type == "GlobalFunctionDefinition" then
local chain=node.chain
local tmp=aR(p); compileExpr(p, node.functionDef, tmp)
if node.isMethod and p.pr[#p.pr] then p.pr[#p.pr].np = p.pr[#p.pr].np+1 end
if #chain==1 then
local r=fL(p, chain[1])
if r then emitMOVE(p, r, tmp)
else
local strID, strKey = getOrAddStrKey(p, chain[1])
emitPUSH_K(p, strID); emitPUSH_REG(p, tmp); emit(p, OC.M_SETGLOBAL, strKey)
end
else
local tr=aR(p); local r=fL(p, chain[1])
if r then emitMOVE(p, tr, r)
else
local strID1, strKey1 = getOrAddStrKey(p, chain[1])
emitPUSH_K(p, strID1); emit(p, OC.M_GETGLOBAL, tr, strKey1)
end
for i=2,#chain-1 do
local strID_i, strKey_i = getOrAddStrKey(p, chain[i])
local kr=aR(p); emitPUSH_K(p, strID_i); emit(p, OC.M_EXEC_SUB, kr, strKey_i)
emitPUSH_REG(p, tr); emitPUSH_REG(p, kr); emit(p, OC.M_GETTABLE, tr); fR(p)
end
local strID_l, strKey_l = getOrAddStrKey(p, chain[#chain])
local kr=aR(p); emitPUSH_K(p, strID_l); emit(p, OC.M_EXEC_SUB, kr, strKey_l)
emitPUSH_REG(p, tr); emitPUSH_REG(p, kr); emitPUSH_REG(p, tmp); emit(p, OC.M_SETTABLE); fR(p); fR(p)
end
fR(p)
elseif node.type == "ReturnStatement" then
local nb=#node.arguments
local base=p.lc
if nb > 0 then
for i, arg in ipairs(node.arguments) do
local r=aR(p); compileExpr(p, arg, r)
end
emitPUSH_LIT(p, base); emitPUSH_LIT(p, nb); emit(p, OC.M_RETURN)
for _=1,nb do fR(p) end
else
emitPUSH_LIT(p, 0); emitPUSH_LIT(p, 0); emit(p, OC.M_RETURN)
end
elseif node.type == "IfStatement" then
local done={}
for _, clause in ipairs(node.clauses) do
local cr=aR(p); compileExpr(p, clause.condition, cr)
emitPUSH_REG(p, cr); emitPUSH_LIT(p, 0); emit(p, OC.M_TEST); fR(p)
local jf=eJMP(p, 0); pushS(p); compileBlock(p, clause.body); popS(p)
local je=eJMP(p, 0); done[#done+1]=je; patch(p, jf, #p.c + 1)
end
if node.elseBody then
pushS(p); compileBlock(p, node.elseBody); popS(p)
end
for _, j in ipairs(done) do patch(p, j, #p.c + 1) end
elseif node.type == "WhileStatement" then
local top=#p.c;
local cr=aR(p); compileExpr(p, node.condition, cr)
emitPUSH_REG(p, cr); emitPUSH_LIT(p, 0); emit(p, OC.M_TEST); fR(p); local jf=eJMP(p, 0)
p.loopStack = p.loopStack or {}
table.insert(p.loopStack, {breaks={}, continues={}})
pushS(p); compileBlock(p, node.body); popS(p)
local lctx = table.remove(p.loopStack)
for _, cj in ipairs(lctx.continues) do patch(p, cj, top + 1) end
eJMP(p, top + 1);
patch(p, jf, #p.c + 1)
for _, bj in ipairs(lctx.breaks) do patch(p, bj, #p.c + 1) end
elseif node.type == "RepeatUntilStatement" then
local top=#p.c; pushS(p);
p.loopStack = p.loopStack or {}
table.insert(p.loopStack, {breaks={}, continues={}})
compileBlock(p, node.body); popS(p)
local lctx = table.remove(p.loopStack)
local contTarget = #p.c + 1
for _, cj in ipairs(lctx.continues) do patch(p, cj, contTarget) end
local cr=aR(p); compileExpr(p, node.condition, cr)
emitPUSH_REG(p, cr);
emitPUSH_LIT(p, 0); emit(p, OC.M_TEST); fR(p); eJMP(p, top + 1)
for _, bj in ipairs(lctx.breaks) do patch(p, bj, #p.c + 1) end
elseif node.type == "ForNumericStatement" then
pushS(p)
local ir=nL(p,"__i") local lr=nL(p,"__l") local sr=nL(p,"__s") local vr=nL(p, node.variable)
compileExpr(p, node.start, ir);
compileExpr(p, node.limit, lr)
if node.step then compileExpr(p, node.step, sr) else emitLOADK_NonLinearMBA(p, sr, 1) end
local p_ir1 = emitPUSH_LIT(p, ir);
local pi2 = emitPUSH_LIT(p, 0);
emit(p, OC.M_FORPREP)
local bodyStart = #p.c + 1
emitMOVE(p, vr, ir)
p.loopStack = p.loopStack or {}
table.insert(p.loopStack, {breaks={}, continues={}})
compileBlock(p, node.body)
local lctx = table.remove(p.loopStack)
local p_ir2 = emitPUSH_LIT(p, ir);
for _, cj in ipairs(lctx.continues) do patch(p, cj, p_ir2) end
local li = emitPUSH_LIT(p, 0);
emit(p, OC.M_FORLOOP)
patch(p, pi2, p_ir2 + 1)
patch(p, li, bodyStart)
for _, bj in ipairs(lctx.breaks) do patch(p, bj, #p.c + 1) end
popS(p)
elseif node.type == "ForGenericStatement" then
pushS(p)
local itr=nL(p,"__it"); local str2=nL(p,"__st");
local ctl=nL(p,"__ct")
compileExpr(p, node.iterators[1] or {type="Literal",kind="nil"}, itr)
if node.iterators[1] and node.iterators[1].type == "CallExpression" and not node.iterators[2] then
for b = #p.c, 1, -1 do
if p.c[b][1] == OC.M_CALL then
if p.c[b-1] and p.c[b-1][1] == OC.M_PUSH_LIT then
p.c[b-1][2] = 3
local c_base = p.c[b-3][2]
emitMOVE(p, str2, c_base + 1)
emitMOVE(p, ctl, c_base + 2)
end
break
end
end
end
if node.iterators[2] then compileExpr(p, node.iterators[2], str2) end
if node.iterators[3] then compileExpr(p, node.iterators[3], ctl) end
local vrs={}
for _, vname in ipairs(node.variables) do vrs[#vrs+1]=nL(p, vname) end
local call_base = aR(p)
local call_arg1 = aR(p)
local call_arg2 = aR(p)
local top=#p.c
emitMOVE(p, call_base, itr)
emitMOVE(p, call_arg1, str2)
emitMOVE(p, call_arg2, ctl)
emitPUSH_LIT(p, call_base)
emitPUSH_LIT(p, 2)
emitPUSH_LIT(p, #node.variables)
emit(p, OC.M_CALL)
emitMOVE(p, ctl, call_base)
for i, vr in ipairs(vrs) do
emitMOVE(p, vr, call_base + i - 1)
end
local
nr=aR(p)
emitPUSH_LIT(p, nr)
emitPUSH_LIT(p, nr)
emit(p, OC.M_LOADNIL)
emitPUSH_LIT(p, 1)
emitPUSH_REG(p, ctl)
emitPUSH_REG(p, nr)
emit(p, OC.M_EQ)
fR(p)
local jf=eJMP(p, 0)
p.loopStack = p.loopStack or {}
table.insert(p.loopStack, {breaks={}, continues={}})
compileBlock(p, node.body)
local lctx = table.remove(p.loopStack)
for _, cj in ipairs(lctx.continues) do patch(p, cj, top + 1) end
eJMP(p, top + 1)
patch(p, jf, #p.c + 1)
for _, bj in ipairs(lctx.breaks) do patch(p, bj, #p.c + 1) end
popS(p)
elseif node.type == "DoStatement" then
pushS(p); compileBlock(p, node.body); popS(p)
elseif node.type == "BreakStatement" then
local j = eJMP(p, 0)
if p.loopStack and #p.loopStack > 0 then
table.insert(p.loopStack[#p.loopStack].breaks, j)
end
elseif node.type == "ContinueStatement" then
local j = eJMP(p, 0)
if p.loopStack and #p.loopStack > 0 then
table.insert(p.loopStack[#p.loopStack].continues, j)
end
elseif node.type == "ExpressionStatement" then
local dr=aR(p); compileExpr(p, node.expression, dr); fR(p)
elseif node.type == "AssignmentStatement" then
local compiledRhs={}
for i, rhsNode in ipairs(node.rhs) do
local rr=aR(p)
compileExpr(p, rhsNode, rr)
compiledRhs[#compiledRhs+1]=rr
if rhsNode.type == "CallExpression" and i == #node.rhs and #node.lhs > i then
local req_nrv = #node.lhs - i + 1
for b = #p.c, 1, -1 do
if p.c[b][1] == OC.M_CALL then
if p.c[b-1] and p.c[b-1][1] == OC.M_PUSH_LIT then
p.c[b-1][2] = req_nrv
local c_base = p.c[b-3][2]
for j = 1, req_nrv - 1 do
local evr = aR(p)
emitMOVE(p, evr, c_base + j)
compiledRhs[#compiledRhs+1] = evr
end
end
break
end
end
end
end
for i, lhsNode in ipairs(node.lhs) do
local vr=compiledRhs[i]
if not vr then break end
if lhsNode.type == "Identifier" then
local r=fL(p, lhsNode.name)
if r then
emitMOVE(p, r, vr)
else
local u = resolveUpval(p, lhsNode.name)
if u then
emitPUSH_LIT(p, u)
emitPUSH_REG(p, vr)
emit(p, OC.M_SETUPVAL)
else
local strID, strKey = getOrAddStrKey(p, lhsNode.name)
emitPUSH_K(p, strID); emitPUSH_REG(p, vr);
emit(p, OC.M_SETGLOBAL, strKey)
end
end
elseif lhsNode.type == "MemberExpression" then
local tr=aR(p); compileExpr(p, lhsNode.base, tr)
local strID, strKey = getOrAddStrKey(p, lhsNode.identifier)
local kr=aR(p); emitPUSH_K(p, strID); emit(p, OC.M_EXEC_SUB, kr, strKey)
emitPUSH_REG(p, tr); emitPUSH_REG(p, kr); emitPUSH_REG(p, vr); emit(p, OC.M_SETTABLE); fR(p); fR(p)
elseif lhsNode.type == "IndexExpression" then
local tr=aR(p); compileExpr(p, lhsNode.base, tr)
local kr=aR(p); compileExpr(p, lhsNode.index, kr)
emitPUSH_REG(p, tr); emitPUSH_REG(p, kr); emitPUSH_REG(p, vr); emit(p, OC.M_SETTABLE); fR(p); fR(p)
end
end
for _=1, #compiledRhs do fR(p) end
end
end
compileBlock = function(p, block)
for _, stat in ipairs(block) do compileStat(p, stat) end
end
local root=newP(0)
root.va=true
pushS(root)
compileBlock(root, ast.body)
emit(root, OC.M_HALT)
return root
end
local function peepholeOptimize(proto, OC)
local superMap = {}
local superCount = 0
local usedOpcodes = {}
for _, val in pairs(OC) do usedOpcodes[val] = true end
local function fop()
local val
repeat val = math.random(1, 65535) until not usedOpcodes[val]
usedOpcodes[val] = true
return val
end
local reverseOC = {}
for k, v in pairs(OC) do reverseOC[v] = k end
local function getName(val)
return reverseOC[val]
end
local safeOpMap = {}
local function isSafeFast(op)
if safeOpMap[op] ~= nil then return safeOpMap[op] end
local opName = reverseOC[op]
if opName and string.sub(opName, 1, 8) == "M_SUPER_" then
safeOpMap[op] = false
return false
end
local safe = op ~= OC.M_JMP and op ~= OC.M_TEST and op ~= OC.M_EQ and
op ~= OC.M_LT and op ~= OC.M_LE and op ~= OC.M_FORPREP and
op ~= OC.M_FORLOOP and op ~= OC.M_CALL and op ~= OC.M_RETURN and
op ~= OC.M_HALT and op ~= OC.M_EXEC_SUB and
op ~= OC.M_GETGLOBAL and op ~= OC.M_SETGLOBAL and op ~= OC.M_LOADBOOL
safeOpMap[op] = safe
return safe
end
local function findAndApply(p)
local pairsCount = {}
local function count(p_inner)
for i = 1, #p_inner.c - 1 do
local op1 = p_inner.c[i][1]
local op2 = p_inner.c[i+1][1]
if isSafeFast(op1) and isSafeFast(op2) then
local key = (op1 * 256) + op2
pairsCount[key] = (pairsCount[key] or 0) + 1
end
end
for _, sp in ipairs(p_inner.pr) do count(sp) end
end
count(p)
local bestPair, maxCount = nil, 0
for k, c in pairs(pairsCount) do
if c > maxCount then maxCount = c; bestPair = k end
end
if maxCount >= 2 then
local o2 = bestPair % 256
local o1 = math.floor(bestPair / 256)
superCount = superCount + 1
local superName = "M_SUPER_" .. superCount
local superVal = fop()
OC[superName] = superVal
reverseOC[superVal] = superName
superMap[superName] = {getName(o1), getName(o2)}
local function apply(p_inner)
local _skip_next = false
for i = 1, #p_inner.c - 1 do
if _skip_next then
_skip_next = false
elseif p_inner.c[i][1] == o1 and p_inner.c[i+1][1] == o2 then
p_inner.c[i][1] = superVal
_skip_next = true
end
end
for _, sp in ipairs(p_inner.pr) do apply(sp) end
end
apply(p)
return true
end
return false
end
for iter = 1, 15 do
if not findAndApply(proto) then break end
end
return superMap
end
local function serialize(proto, OC, opMap, pk, mathProxy, stringChar, genMathCall, numKey)
local function sNum(v)
if v==math.floor(v) and v>=0 and v<=0xFFFF then
return "("..genMathCall(v, mathProxy)..")"
end
return tostring(v)
end
local function sK(v)
if type(v)=="number" then return sNum(v)
elseif type(v)=="boolean" then return tostring(v)
elseif v==nil then return "nil"
elseif type(v)=="table" and v.type=="enc_string" then
local nums={}
for i=1,#v.val do nums[i] = bit32.bxor(string.byte(v.val,i), v.key) end
return "{"..pk.dKey.."={"..table.concat(nums,",").."}}"
elseif type(v)=="string" then
if v == "" then return "''" end
local chunkSize = (#v > 500) and math.random(50, 100) or math.random(2, 4)
local chunks = {}
local i = 1
while i <= #v do
chunks[#chunks+1] = string.sub(v, i, i + chunkSize - 1)
i = i + chunkSize
end
local memKeys = {}
local usedKeys = {}
for _ = 1, #chunks do
local k
repeat k = math.random(10000, 99999) until not usedKeys[k]
usedKeys[k] = true
memKeys[#memKeys+1] = k
end
local insertOrder = {}
for idx = 1, #chunks do insertOrder[idx] = idx end
for idx = #insertOrder, 2, -1 do
local rand = math.random(idx)
insertOrder[idx], insertOrder[rand] = insertOrder[rand], insertOrder[idx]
end
local masterXor = math.random(1, 255)
local memInit = {}
for _, idx in ipairs(insertOrder) do
local chunk = chunks[idx]
local mKey = memKeys[idx]
local bytes = {}
for j = 1, #chunk do bytes[#bytes+1] = bit32.bxor(string.byte(chunk, j), masterXor) end
memInit[#memInit+1] = "["..mKey.."]={"..table.concat(bytes,",").."}"
end
local memVar, ptrVar = newVar(), newVar()
local genFunc, stateVar, kVar = newVar(), newVar(), newVar()
local chunkVar, jVar, sVar = newVar(), newVar(), newVar()
local encK = genMathCall(masterXor, mathProxy)
return "(function() local "..memVar.."={"..table.concat(memInit, ",").."}; local "..ptrVar.."={"..table.concat(memKeys, ",").."}; local _k="..encK.."; local function "..genFunc.."("..stateVar..") if "..stateVar..">#"..ptrVar.." then return '' end; local "..kVar.."="..ptrVar.."["..stateVar.."]; local "..chunkVar.."="..memVar.."["..kVar.."]; local "..sVar.."=''; for "..jVar.."=1,#"..chunkVar.." do "..sVar.."="..sVar.."..string.char(bit32.bxor("..chunkVar.."["..jVar.."],_k)); end; "..memVar.."["..kVar.."]=nil; local _ret="..sVar..".."..genFunc.."("..stateVar.."+1); "..sVar.."=nil; return _ret; end; return "..genFunc.."(1) end)()"
else return "nil" end
end
local function sProto(p)
local cp={}
local order={}
local expH = 0
local secret_seed = math.random(1000, 9999)
for i = 1, #p.c do
local poly_key = ( (i * i * 197) + (i * 83) + secret_seed ) % 4294967296
local ins = p.c[i]
local orig_op = ins[1]
if orig_op == OC.M_EXEC_SUB or orig_op == OC.M_GETGLOBAL then
local K_D = bit32.bxor(i, bit32.bxor(bit32.rshift(poly_key, 2), orig_op))
ins[3] = bit32.bxor(ins[3], K_D)
elseif orig_op == OC.M_SETGLOBAL then
local K_D = bit32.bxor(i, bit32.bxor(bit32.rshift(poly_key, 2), orig_op))
ins[2] = bit32.bxor(ins[2], K_D)
end
ins[1] = bit32.bxor(ins[1], poly_key)
if ins[2] then ins[2] = bit32.bxor(ins[2], poly_key) end
if ins[3] then ins[3] = bit32.bxor(ins[3], poly_key) end
for j=1, #ins do
expH = (expH + ins[j]) % 4294967296
end
end
local bcFingerprint = 0
for i = 1, #p.c do
local ins = p.c[i]
for j = 1, #ins do
bcFingerprint = bit32.bxor(bcFingerprint, ins[j] or 0)
bcFingerprint = (bcFingerprint * 16777619 + 1) % 4294967296
end
end
local constKey = ( (bcFingerprint * bcFingerprint * 197) + (bcFingerprint * 83) + secret_seed ) % 4294967296
local ec1v = bit32.bxor(256, constKey)
local ec2v = bit32.bxor(9, bit32.bxor(constKey, 0x11))
local ec3v = bit32.bxor(36, bit32.bxor(constKey, 0x22))
for i=1,#p.c do order[i]=i end
for i=#order,2,-1 do
local j=math.random(i)
order[i],order[j]=order[j],order[i]
end
local b92 = " !#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~"
local function toB92(num)
if num == 0 then return string.sub(b92, 1, 1) end
local res = ""
while num > 0 do
local rem = num % 92
res = string.sub(b92, rem + 1, rem + 1) .. res
num = math.floor(num / 92)
end
return res
end
for _,orig_idx in ipairs(order) do
local ins=p.c[orig_idx]
local ip={toB92(orig_idx), toB92(ins[1])}
if ins[2] then ip[#ip+1]=toB92(ins[2]) end
if ins[3] then ip[#ip+1]=toB92(ins[3]) end
cp[#cp+1]=table.concat(ip,"'")
end
local kp={}
for i=1, #p.k do
local kv = p.k[i]
local val_expr = sK(kv)
if i == 1 then
kp[#kp+1]="if _c_id == "..(i-1).." then return "..val_expr
else
kp[#kp+1]="elseif _c_id == "..(i-1).." then return "..val_expr
end
end
local pool_func = ""
if #kp > 0 then
pool_func = "function(_c_id) "..table.concat(kp, " ").." else return nil end end"
else
pool_func = "function(_c_id) return nil end"
end
local sub_p = {}
if not p.sub_c or #p.sub_c == 0 then
p.sub_c = { {OC.SUB_OP_DEC, 0}, {OC.SUB_OP_RET, 0} }
end
for _, ins in ipairs(p.sub_c) do
sub_p[#sub_p+1] = "{"..bit32.bxor(ins[1], secret_seed % 256)..","..bit32.bxor(ins[2] or 0, secret_seed % 256).."}"
end
local pp={}
for _,sp in ipairs(p.pr) do pp[#pp+1]=sProto(sp) end
local uv_p = {}
if p.upvalues then
for _, uv in ipairs(p.upvalues) do
uv_p[#uv_p+1] = "{"..(uv.isLocal and "1" or "0")..","..uv.index.."}"
end
end
local encoded_seed = bit32.bxor(secret_seed, expH % 65536)
local b92Decoder = "(function(s) local b=' !#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~' local m={} for i=1,92 do m[string.sub(b,i,i)]=i-1 end local function f(str) local num=0 for i=1,#str do num=num*92+m[string.sub(str,i,i)] end return num end local t={} for p in string.gmatch(s,'([^\"]+)') do local g=string.gmatch(p,\"([^']+)\") local idx=f(g()) local r={} for v in g do r[#r+1]=f(v) end t[idx]=r end return t end)"
local safe_payload = table.concat(cp, "\""):gsub("\"", "\\\"")
return "{"..pk.c.."="..b92Decoder.."(\""..safe_payload.."\"),sub_c={"..table.concat(sub_p,",").."},"..pk.k.."="..pool_func
..","..pk.np.."="..p.np..",upvalues={"..table.concat(uv_p,",").."},"..pk.va.."="..(p.va and 1 or 0)
..","..pk.pr.."={"..table.concat(pp,",").."},"..pk.mr.."="..(p.mr or 0)..","..pk.hash.."="..expH..","..pk.seed.."="..encoded_seed..","..pk.ec1.."="..ec1v..","..pk.ec2.."="..ec2v..","..pk.ec3.."="..ec3v.."}"
end
return sProto(proto)
end
local function buildVM(opVarNames, vmName, v, pk, OC, stringChar, numKey, superMap, mathProxy)
local L={}
local function A(s) L[#L+1]=s end
local function ov(n) return opVarNames[n] end
local rV = {
subVMName = newVar(),
opaqueTrue = newVar(),
pipelineLockVar = newVar(),
alu_a = newVar(),
alu_b = newVar(),
alu_id = newVar(),
alu_res = newVar(),
dispatch_next = newVar(),
has_returned = newVar(),
return_values = newVar(),
Central_Dispatcher = newVar(),
State_Variable = newVar(),
Opaque_Transition = newVar(),
sub_cache = newVar(),
encObj = newVar(),
sub_bc = newVar(),
c = newVar(),
s = newVar(),
_p = newVar(),
b = newVar(),
a = newVar(),
k = newVar(),
gk = newVar(),
t = newVar(),
v = newVar(),
ps = newVar(),
ci = newVar(),
nrv = newVar(),
na = newVar(),
dst = newVar(),
fn = newVar(),
a2 = newVar(),
ai = newVar(),
rv = newVar(),
ri = newVar(),
n = newVar(),
base = newVar(),
ir = newVar(),
idx = newVar(),
p_idx = newVar(),
x = newVar(),
mip = newVar(),
rt_seed = newVar(),
chain_key = newVar(),
env = newVar(),
math = newVar(),
bit = newVar(),
floor = newVar(),
cos = newVar(),
sin = newVar(),
pi = newVar(),
band = newVar(),
lshift = newVar(),
rshift = newVar(),
op_val = newVar(),
cff_state = newVar(),
realBc = newVar(),
realK = newVar(),
mt = newVar(),
self = newVar(),
key = newVar(),
val = newVar(),
crash = newVar(),
safe_iscc = newVar(),
safe_newcc = newVar(),
poly_seed = newVar(),
cff_st = newVar(),
max_pc = newVar(),
gm = newVar(),
tp = newVar(),
pc = newVar(),
isc = newVar(),
is_safe = newVar(),
fake_prop_pre = newVar(),
tof_pre = newVar(),
g_pre = newVar(),
v3_pre = newVar(),
env_probe_mt = newVar(),
mt_bc_pre = newVar(),
mt_h_pre = newVar(),
is_inst_pre = newVar(),
s_pre = newVar(),
e_pre = newVar(),
err_valid_pre = newVar(),
v3_valid_pre = newVar(),
s2_pre = newVar(),
r2_pre = newVar(),
rg = newVar(),
sf = newVar(),
poly_share = newVar(),
vmTrusted = newVar(),
clPr = newVar(),
clUvs = newVar(),
clIdx = newVar(),
clUv = newVar(),
clVal = newVar(),
clSet = newVar(),
clInner = newVar(),
clWrapped = newVar(),
upIdx = newVar(),
upVal = newVar(),
l4_cor = newVar(),
l4_cc = newVar(),
l4_cr = newVar(),
l4_cy = newVar(),
l4_np = newVar(),
l4_gmt = newVar(),
l4_pc = newVar(),
l4_ts = newVar(),
l4_sf = newVar(),
l4_trap = newVar(),
l4_thr = newVar(),
l4_frac = newVar(),
l4_pkey = newVar(),
l4_s = newVar(),
l4_r = newVar(),
bcFp = newVar(),
ckR = newVar(),
dc1 = newVar(),
dc2 = newVar(),
dc3 = newVar(),
passed = newVar(),
cM = newVar(),
cMem = newVar(),
cG = newVar(),
cE = newVar(),
cR = newVar(),
rcStore = newVar(),
rcKey = newVar(),
rcGet = newVar(),
rcSet = newVar(),
pushReg_idx = newVar(),
pushK_id = newVar(),
pushLit_val = newVar(),
writeReg_idx = newVar(),
fetchReg_idx = newVar(),
loadBool_idx = newVar(),
getGlobal_dst = newVar(),
getGlobal_kid = newVar(),
setGlobal_kid = newVar(),
getTable_dst = newVar(),
newTable_dst = newVar(),
self_dst = newVar(),
concat_dst = newVar(),
closure_dst = newVar(),
getUpval_dst = newVar(),
execSub_dst = newVar(),
execSub_kid = newVar()
}
v.dynState = newVar()
v.handlers = newVar()
v.res = newVar()
v.rk = newVar()
v.rks = newVar()
v.tmp = newVar()
v.top = newVar()
local function bStr(str)
if not str or str == "" then return "''" end
local chunkSize = (#str > 500) and math.random(50, 100) or math.random(2, 4)
local chunks = {}
local i = 1
while i <= #str do
chunks[#chunks+1] = string.sub(str, i, i + chunkSize - 1)
i = i + chunkSize
end
local memKeys = {}
local usedKeys = {}
for _ = 1, #chunks do
local k
repeat k = math.random(10000, 99999) until not usedKeys[k]
usedKeys[k] = true
memKeys[#memKeys+1] = k
end
local insertOrder = {}
for idx = 1, #chunks do insertOrder[idx] = idx end
for idx = #insertOrder, 2, -1 do
local rand = math.random(idx)
insertOrder[idx], insertOrder[rand] = insertOrder[rand], insertOrder[idx]
end
local masterXor = math.random(1, 255)
local memInit = {}
for _, idx in ipairs(insertOrder) do
local chunk = chunks[idx]
local mKey = memKeys[idx]
local bytes = {}
for j = 1, #chunk do bytes[#bytes+1] = bit32.bxor(string.byte(chunk, j), masterXor) end
memInit[#memInit+1] = "["..mKey.."]={"..table.concat(bytes,",").."}"
end
local memVar, ptrVar = newVar(), newVar()
local genFunc, stateVar, kVar = newVar(), newVar(), newVar()
local chunkVar, jVar, sVar = newVar(), newVar(), newVar()
return "(function() local "..memVar.."={"..table.concat(memInit, ",").."}; local "..ptrVar.."={"..table.concat(memKeys, ",").."}; local function "..genFunc.."("..stateVar..") if "..stateVar..">#"..ptrVar.." then return '' end; local "..kVar.."="..ptrVar.."["..stateVar.."]; local "..chunkVar.."="..memVar.."["..kVar.."]; local "..sVar.."=''; for "..jVar.."=1,#"..chunkVar.." do "..sVar.."="..sVar.."..string.char(bit32.bxor("..chunkVar.."["..jVar.."],"..masterXor..")); end; "..memVar.."["..kVar.."]=nil; local _ret="..sVar..".."..genFunc.."("..stateVar.."+1); "..sVar.."=nil; return _ret; end; return "..genFunc.."(1) end)()"
end
A(" local "..rV.env.." = getfenv and getfenv() or _ENV or _G")
A(" local "..rV.math.." = "..rV.env.."["..bStr("math").."]")
A(" local "..rV.bit.." = "..rV.env.."["..bStr("bit32").."] or "..rV.math.."")
A(" local "..rV.floor.." = "..rV.math.."["..bStr("floor").."]")
A(" local "..rV.cos.." = "..rV.math.."["..bStr("cos").."]")
A(" local "..rV.sin.." = "..rV.math.."["..bStr("sin").."]")
A(" local "..rV.pi.." = "..rV.math.."["..bStr("pi").."]")
A(" local "..rV.band.." = "..rV.bit.."["..bStr("band").."] or function(a,b) return a end")
A(" local "..rV.lshift.." = "..rV.bit.."["..bStr("lshift").."] or function(a,b) return a*(2^b) end")
A(" local "..rV.rshift.." = "..rV.bit.."["..bStr("rshift").."] or function(a,b) return "..rV.floor.."(a/(2^b)) end")
local function genCollatzCheck(varName)
local choice = math.random(1, 4)
if choice == 1 then
return "((("..varName.." * "..varName..") - "..varName..") % 2 == 0)"
elseif choice == 2 then
return "(math.abs(math.sin("..varName..")^2 + math.cos("..varName..")^2 - 1) < 0.05)"
elseif choice == 3 then
return "((math.floor("..varName.." * 0.5) * 2) <= "..varName..")"
else
return "(math.abs(("..varName.." * 0.333333) * 3 - "..varName..") < 0.05)"
end
end
local v_mba_t = {
x = newVar(), y = newVar(), mba = newVar(), dec = newVar()
}
A(" local function "..rV.opaqueTrue.."()")
A(" local "..v_mba_t.x.." = (("..v.dynState.." or 1) * 0.84147098) % 9999")
A(" local "..v_mba_t.y.." = math.floor("..v_mba_t.x..")")
A(" local "..v_mba_t.mba.." = (("..v_mba_t.y.." * "..v_mba_t.y..") - "..v_mba_t.y..") % 2")
A(" local "..v_mba_t.dec.." = math.abs(math.sin("..v_mba_t.x..")^2 + math.cos("..v_mba_t.x..")^2 - 1)")
A(" return ("..v_mba_t.mba.." == 0 and "..v_mba_t.dec.." < 0.05) and 1 or 0")
A(" end")
local sV = {
mem = newVar(),
spc = newVar(),
ds = newVar(),
hnd = newVar(),
sc = newVar(),
opv = newVar(),
raw = newVar(),
sop = newVar(),
res = newVar(),
mba_a = newVar(),
mba_s = newVar(),
sec_bc = newVar(),
p_key = newVar(),
a_key = newVar(),
rt_pc = newVar(),
rt_rk = newVar(),
rt_op = newVar(),
k_d = newVar(),
dx = newVar(),
c_state = newVar(),
rss = newVar(),
sub_h = newVar(),
ret = newVar(),
trap = newVar(),
nxt_rk = newVar()
}
A(" local "..rV.sub_cache.." = setmetatable({}, {__mode = 'kv'})")
A(" local function "..rV.subVMName.."("..rV.encObj..", "..sV.p_key..", "..sV.sec_bc..", "..sV.rt_pc..", "..sV.rt_rk..", "..sV.rt_op..")")
A(" if type("..rV.encObj..") ~= 'table' and not "..sV.sec_bc.." then return "..rV.encObj.." end")
A(" if not "..sV.sec_bc.." and "..rV.sub_cache.."["..rV.encObj.."] then return "..rV.sub_cache.."["..rV.encObj.."] end")
A(" local "..sV.mem.." = setmetatable({}, {")
A(" __index = function(t, k) return rawget(t, k) end,")
A(" __newindex = function(t, k, v) rawset(t, k, v) end,")
A(" __metatable = 'LOCKED_MEM'")
A(" })")
A(" local "..rV.sub_bc.." = "..sV.sec_bc.." or "..v.P..".sub_c")
A(" local "..sV.ds.." = 0")
A(" local "..sV.hnd.." = {}")
A(" local "..sV.sc.." = string.char")
A(" local "..sV.k_d.." = bit32.bxor("..sV.rt_pc.." or 0, bit32.bxor(bit32.rshift("..sV.rt_rk.." or 0, 2), "..sV.rt_op.." or 0))")
A(" local "..sV.a_key.." = bit32.bxor("..sV.p_key..", "..sV.k_d..")")
A(" local function "..sV.mba_a.."(a, b) return bit32.bxor(a, b) + bit32.lshift(bit32.band(a, b), 1) end")
A(" local function "..sV.mba_s.."(a, b) return bit32.bxor(a, bit32.bnot(b)) + bit32.lshift(bit32.band(a, bit32.bnot(b)), 1) + 1 end")
local sub_hBody1 = sV.ds.." = math.floor("..sV.mba_a.."("..sV.ds..", "..sV.sop.."[1]) % 256);"
local sub_dCheck1 = genCollatzCheck(sV.ds)
A(" "..sV.hnd.."["..ov("SUB_OP_DEC").."] = function("..sV.sop..") ")
A(" "..sub_hBody1)
A(" if "..rV.opaqueTrue.."() == 1 then")
A(" if "..sub_dCheck1.." then ")
A(" if type("..rV.encObj..") == 'table' and "..rV.encObj.."."..pk.dKey.." then")
A(" "..sV.mem.."[1] = ("..sV.mem.."[1] or '')")
A(" for "..rV.idx.."=1,#"..rV.encObj.."."..pk.dKey.." do ")
A(" local "..sV.dx.." = bit32.bxor("..rV.encObj.."."..pk.dKey.."["..rV.idx.."], "..sV.a_key..")")
A(" "..sV.mem.."[1] = "..sV.mem.."[1] .. "..sV.sc.."("..sV.dx..")")
A(" end")
A(" end")
A(" end")
A(" else")
A(" "..sV.p_key.." = bit32.bxor("..sV.p_key..", 0x1B)")
A(" end")
A(" end")
local sub_hBody2 = sV.ds.." = math.floor("..sV.mba_s.."("..sV.ds..", "..sV.sop.."[1]) % 256);"
local sub_dCheck2 = genCollatzCheck(sV.ds)
A(" "..sV.hnd.."["..ov("SUB_OP_RET").."] = function("..sV.sop..") ")
A(" "..sub_hBody2)
A(" if "..rV.opaqueTrue.."() == 1 then")
A(" if "..sub_dCheck2.." then ")
A(" local "..sV.res.." = "..sV.mem.."[1]; "..sV.mem.."[1] = nil")
A(" "..sV.mem.." = nil")
A(" return "..sV.res.."")
A(" end")
A(" end")
A(" end")
A(" "..sV.hnd.."[0xDEAD] = function("..sV.sop..") ")
A(" "..sV.mem.."[1] = "..sV.mba_s.."((bit32.bxor("..v.P.."."..pk.seed..", "..v.P.."."..pk.hash.." % 65536) % 256), "..sV.sop.."[2] or 0)")
A(" if "..sV.mem.."[1] ~= 0 then "..sV.p_key.." = bit32.bxor("..sV.p_key..", 0x2C) end")
A(" end")
A(" local "..rV.cff_state.." = 1")
A(" local "..sV.spc.." = 1")
A(" while true do")
A(" local "..sV.opv.." = "..rV.opaqueTrue.."()")
A(" local "..sV.c_state.." = "..rV.cff_state.." * "..sV.opv.."")
A(" if "..sV.c_state.." == 1 then")
A(" local "..sV.raw.." = "..rV.sub_bc.."["..sV.spc.." * "..sV.opv.."] or {0, 0}")
A(" local "..sV.rss.." = bit32.bxor("..v.P.."."..pk.seed..", "..v.P.."."..pk.hash.." % 65536) % 256")
A(" local "..sV.sop.." = {bit32.bxor("..sV.raw.."[1], "..sV.rss.."), bit32.bxor("..sV.raw.."[2] or 0, "..sV.rss..")}")
A(" local "..sV.sub_h.." = "..sV.hnd.."["..sV.sop.."[1]]")
A(" if "..sV.sub_h.." then")
A(" local "..sV.ret.." = "..sV.sub_h.."("..sV.sop..")")
A(" if "..sV.ret.." then return "..sV.ret.." end")
A(" else")
A(" local "..sV.trap.." = "..sV.hnd.."[0xDEAD]")
A(" if "..sV.trap.." then "..sV.trap.."("..sV.sop..") end")
A(" end")
A(" "..rV.cff_state.." = 2 * "..sV.opv.."")
A(" elseif "..sV.c_state.." == 2 then")
A(" "..sV.spc.." = "..sV.spc.." + "..sV.opv.."")
A(" if "..sV.spc.." > #"..rV.sub_bc.." then break end")
A(" "..rV.cff_state.." = 1 * "..sV.opv.."")
A(" else")
A(" break")
A(" end")
A(" end")
A(" end")
A("local function "..vmName.."("..v.P..","..v.E..","..v.a..","..v.U..")")
local randLockStr = string.char(math.random(97,122), math.random(97,122), math.random(97,122), math.random(97,122), math.random(97,122))
local rt_mulConst = math.random(100000000, 999999999)
local rt_modConst = math.random(0x100000, 0xFFFFFF)
A(" local "..rV.rt_seed.." = math.floor(os.clock() * "..rt_mulConst..") % "..rt_modConst.."")
A(" local "..rV.chain_key.." = bit32.bxor("..rV.rt_seed..", " .. math.random(0x1000, 0xFFFF) .. ")")
A(" local "..rV.l4_cor.." = "..rV.env.."["..bStr("coroutine").."]")
A(" local "..rV.l4_cc.." = "..rV.l4_cor.."["..bStr("create").."]")
A(" local "..rV.l4_cr.." = "..rV.l4_cor.."["..bStr("resume").."]")
A(" local "..rV.l4_cy.." = "..rV.l4_cor.."["..bStr("yield").."]")
A(" local "..rV.l4_np.." = "..rV.env.."["..bStr("newproxy").."]")
A(" local "..rV.l4_gmt.." = "..rV.env.."["..bStr("getmetatable").."]")
A(" local "..rV.l4_pc.." = "..rV.env.."["..bStr("pcall").."]")
A(" local "..rV.l4_ts.." = "..rV.env.."["..bStr("tostring").."]")
A(" local "..rV.l4_sf.." = "..rV.env.."["..bStr("string").."]["..bStr("find").."]")
A(" local "..rV.l4_frac.." = false")
A(" if "..rV.l4_np.." and "..rV.l4_cc.." and "..rV.l4_cr.." and "..rV.l4_cy.." then")
A(" local "..rV.l4_trap.." = "..rV.l4_np.."(true)")
A(" "..rV.l4_gmt.."("..rV.l4_trap..")["..bStr("__tostring").."] = function() "..rV.l4_cy.."() return "..bStr(" ").." end")
A(" local "..rV.l4_thr.." = "..rV.l4_cc.."(function()")
A(" local "..rV.l4_s..", "..rV.l4_r.." = "..rV.l4_pc.."("..rV.l4_ts..", "..rV.l4_trap..")")
A(" if not "..rV.l4_s.." and "..rV.l4_sf.."("..rV.l4_ts.."("..rV.l4_r.." or "..bStr(" ").."), "..bStr("yield")..") then")
A(" "..rV.l4_frac.." = true")
A(" end")
A(" end)")
A(" "..rV.l4_cr.."("..rV.l4_thr..")")
A(" "..rV.l4_trap.." = nil; "..rV.l4_thr.." = nil")
A(" end")
A(" if not "..rV.l4_frac.." then")
A(" local "..rV.l4_pkey.." = ("..v.P.."."..pk.hash.." % 254) + 1")
A(" "..rV.chain_key.." = bit32.bxor("..rV.chain_key..", "..rV.l4_pkey..")")
A(" "..rV.l4_pkey.." = nil")
A(" end")
A(" "..rV.l4_cor.."=nil; "..rV.l4_cc.."=nil; "..rV.l4_cr.."=nil; "..rV.l4_cy.."=nil")
A(" "..rV.l4_np.."=nil; "..rV.l4_gmt.."=nil; "..rV.l4_pc.."=nil; "..rV.l4_ts.."=nil; "..rV.l4_sf.."=nil; "..rV.l4_frac.."=nil")
A(" local "..rV.rcStore.."={}; local "..v.pr.."="..v.P.."."..pk.pr)
A(" local "..rV.rcKey.." = bit32.bxor("..rV.rt_seed..", "..rV.chain_key..")")
A(" setmetatable("..rV.rcStore..", {")
A(" __pairs = function() "..v.dynState.." = bit32.bxor("..v.dynState..", 0xDEAD); return function() end end,")
A(" __tostring = function() "..v.dynState.." = bit32.bxor("..v.dynState..", 0xDEAD); return 'Memory' end")
A(" })")
A(" local function "..rV.rcGet.."("..rV.key..") return "..rV.rcStore.."[bit32.bxor("..rV.key..", "..rV.rcKey..")] end")
A(" local function "..rV.rcSet.."("..rV.key..", "..rV.val..") "..rV.rcStore.."[bit32.bxor("..rV.key..", "..rV.rcKey..")] = "..rV.val.." end")
A(" local "..rV.realBc.."="..v.P.."."..pk.c)
A(" local "..rV.realK.."="..v.P.."."..pk.k)
A(" local function "..rV.crash.."() "..v.rk.." = bit32.bxor("..v.rk..", 0x5A); "..v.rks.." = bit32.bxor("..v.rks..", 0x5A) end")
A(" local "..rV.mt.." = {")
A(" __index = function("..rV.self..", "..rV.key..")")
A(" return "..rV.realBc.."["..rV.key.."]")
A(" end,")
A(" __newindex = function("..rV.self..", "..rV.key..", "..rV.val..") "..rV.crash.."() end,")
A(" __metatable = '"..randLockStr.."'")
A(" }")
A(" local "..v.bc.." = setmetatable({}, "..rV.mt..")")
A(" local function "..v.mk.."("..v.p..","..v.e..") return{"..pk.p.."="..v.p..","..pk.e.."="..v.e..","..pk.cl.."=true}end")
A(" if "..v.a.." then for "..rV.x.."=1, "..v.a..".n or 0 do "..rV.rcSet.."("..rV.x.."-1, "..v.a.."["..rV.x.."]) end end")
A(" local "..rV.pipelineLockVar.." = ("..rV.opaqueTrue.."() == 1)")
A(" local "..rV.vmTrusted.." = setmetatable({}, {__mode='k'})")
A(" local "..v.dynState.." = 0")
local tV3 = { e1 = newVar(), s1 = newVar(), r1 = newVar(), e2 = newVar(), ok = newVar(), fn = newVar() }
A(" local "..rV.safe_iscc.." = (function()")
A(" local "..tV3.e1.." = "..rV.env)
A(" return "..tV3.e1.."["..bStr("iscclosure").."] or function(f) local "..tV3.s1..", "..tV3.r1.." = pcall(function() return "..tV3.e1..".debug.info(f, 's') == '[C]' end) return "..tV3.s1.." and "..tV3.r1.." or false end")
A(" end)()")
A(" local "..rV.safe_iscc.." = function(f) return type(f) == " .. bStr("function") .. " end")
A(" local "..v.tmp.." = {}")
A(" local "..v.top.." = 0")
A(" local "..v.i..", "..v.op)
A(" local "..v.rk.." = 0")
A(" local "..rV.poly_seed.." = bit32.bxor("..v.P.."."..pk.seed..", "..v.P.."."..pk.hash.." % 65536)")
local cv = {
H = newVar(), i = newVar(), t = newVar(), j = newVar(),
tbO = newVar(), tbR = newVar(), hk = newVar(), ln = newVar(), m = newVar()
}
local maskKey = math.random(100000, 999999)
A(" do")
A(" local "..cv.H.." = 0")
A(" for "..cv.i.."=1, #"..rV.realBc.." do")
A(" local "..cv.t.." = "..v.bc.."["..cv.i.."]")
A(" if "..cv.t.." then")
A(" for "..cv.j.."=1, #"..cv.t.." do "..cv.H.." = ("..cv.H.." + "..cv.t.."["..cv.j.."]) % 4294967296 end")
A(" end")
A(" end")
local st_1 = math.random(1000, 9999)
local st_2 = math.random(1000, 9999)
local st_3 = math.random(1000, 9999)
local st_4 = math.random(1000, 9999)
local st_end = math.random(1000, 9999)
local cff_nodes = {
{ st = st_1, cd = cv.tbO..", "..cv.tbR.." = pcall(function() return "..rV.env.."["..bStr("debug").."]["..bStr("traceback").."]() end); "..rV.cff_st.." = "..st_2 },
{ st = st_2, cd = "if "..cv.tbO.." and type("..cv.tbR..") == "..bStr("string").." then "..rV.cff_st.." = "..st_3.." else "..rV.cff_st.." = "..st_end.." end" },
{ st = st_3, cd = "for "..cv.m.." in getfenv()["..bStr("string").."]["..bStr("gmatch").."]("..cv.tbR..", "..bStr("\n")..") do "..cv.ln.." = "..cv.ln.." + 1 end; "..rV.cff_st.." = "..st_4 },
{ st = st_4, cd = "if "..cv.ln.." > 150000 then "..cv.hk.." = true end; "..rV.cff_st.." = "..st_end }
}
for i = #cff_nodes, 2, -1 do
local j = math.random(i)
cff_nodes[i], cff_nodes[j] = cff_nodes[j], cff_nodes[i]
end
A(" local "..cv.hk.." = false")
A(" local "..cv.ln.." = 0")
A(" local "..cv.tbO..", "..cv.tbR)
A(" local "..rV.cff_st.." = "..st_1)
A(" while "..rV.cff_st.." ~= "..st_end.." do")
for i, node in ipairs(cff_nodes) do
if i == 1 then
A(" if "..rV.cff_st.." == "..node.st.." then")
else
A(" elseif "..rV.cff_st.." == "..node.st.." then")
end
A(" "..node.cd)
end
A(" end")
A(" end")
local tV1 = { encAct = newVar(), encExp = newVar() }
A(" local "..tV1.encAct.." = bit32.bxor("..cv.H..", "..maskKey..")")
A(" local "..tV1.encExp.." = bit32.bxor("..v.P.."."..pk.hash.." or 0, "..maskKey..")")
A(" if "..tV1.encAct.." ~= "..tV1.encExp.." or "..cv.hk.." then ")
A(" "..v.dynState.." = bit32.bxor("..v.dynState..", 0xDEADBEEF)")
A(" "..v.rk.." = bit32.bxor("..v.rk..", 0x1A2B3C); "..v.rks.." = bit32.bxor("..v.rks..", 0x1A2B3C)")
A(" "..rV.Central_Dispatcher.." = false")
A(" end")
A(" end")
local tV2 = { hkey = newVar(), h_raw = newVar(), xk = newVar() }
A(" local "..tV2.hkey.." = math.random(100, 9999)")
A(" local "..tV2.h_raw.." = {}")
A(" local "..v.handlers.." = setmetatable({}, {")
A(" __index = function(_, k)")
A(" if type(k) ~= 'number' then "..v.rk.." = bit32.bxor("..v.rk..", 0x3D); "..v.rks.." = bit32.bxor("..v.rks..", 0x3D) return function() end end")
A(" return "..tV2.h_raw.."[bit32.bxor(k, "..tV2.hkey..")] or function() end")
A(" end,")
A(" __newindex = function(_, k, v)")
A(" local "..tV2.xk.." = bit32.bxor(k, "..tV2.hkey..")")
A(" if "..tV2.h_raw.."["..tV2.xk.."] then "..v.rk.." = bit32.bxor("..v.rk..", 0x4E); "..v.rks.." = bit32.bxor("..v.rks..", 0x4E) return end")
A(" "..tV2.h_raw.."["..tV2.xk.."] = v")
A(" end,")
A(" __metatable = 'Locked'")
A(" })")
A(" local "..rV.alu_a..", "..rV.alu_b..", "..rV.alu_id..", "..rV.alu_res.."")
A(" local "..rV.dispatch_next.."")
A(" local "..rV.has_returned.." = false")
A(" local "..rV.return_values.." = {}")
A(" local "..rV.Central_Dispatcher.." = true")
A(" local "..rV.State_Variable.." = 1")
local mk1 = math.random(100000, 999999)
local mk2 = bit32.bxor(numKey, mk1)
local encNumKey = "bit32.bxor("..mk1..", "..mk2..")"
local zV = {
idx = newVar(),
s = newVar(),
len = newVar(),
z = newVar(),
i = newVar()
}
local opLogic = {
{ "M_SECURE_ERASE", "local "..zV.idx.."="..v.i.."[2]; "..zV.idx.."="..zV.idx.." and bit32.bxor("..zV.idx..","..v.rks..") or nil; if "..zV.idx.." and "..zV.idx..">2147483647 then "..zV.idx.."="..zV.idx.."-4294967296 end; if type("..rV.rcGet.."("..zV.idx.."))=='string' then local "..zV.s.."="..rV.rcGet.."("..zV.idx.."); local "..zV.len.."=#"..zV.s.."; for _erase_loop=1,4 do local "..zV.z.."={}; for "..zV.i.."=1,"..zV.len.." do "..zV.z.."["..zV.i.."]=string.char(math.random(0,255)) end; "..rV.rcSet.."("..zV.idx..", table.concat("..zV.z..")); end; end; "..rV.rcSet.."("..zV.idx..", nil);" },
{ "M_PUSH_REG", "local "..rV.pushReg_idx.."="..v.i.."[2]; "..rV.pushReg_idx.."="..rV.pushReg_idx.." and bit32.bxor("..rV.pushReg_idx..","..v.rks..") or nil; if "..rV.pushReg_idx.." and "..rV.pushReg_idx..">2147483647 then "..rV.pushReg_idx.."="..rV.pushReg_idx.."-4294967296 end; "..v.top.."="..v.top.."+1;"..v.tmp.."["..v.top.."]="..rV.rcGet.."("..rV.pushReg_idx..")" },
{ "M_PUSH_K", "local "..rV.pushK_id.."="..v.i.."[2]; "..rV.pushK_id.."="..rV.pushK_id.." and bit32.bxor("..rV.pushK_id..","..v.rks..") or nil; if "..rV.pushK_id.." and "..rV.pushK_id..">2147483647 then "..rV.pushK_id.."="..rV.pushK_id.."-4294967296 end; "..v.top.."="..v.top.."+1;"..v.tmp.."["..v.top.."]="..rV.realK.."("..rV.pushK_id..")" },
{ "M_PUSH_LIT", "local "..rV.pushLit_val.."="..v.i.."[2]; "..rV.pushLit_val.."="..rV.pushLit_val.." and bit32.bxor("..rV.pushLit_val..","..v.rks..") or nil; if "..rV.pushLit_val.." and "..rV.pushLit_val..">2147483647 then "..rV.pushLit_val.."="..rV.pushLit_val.."-4294967296 end; "..v.top.."="..v.top.."+1;"..v.tmp.."["..v.top.."]="..rV.pushLit_val.."" },
{ "M_WRITE_REG", "local "..rV.writeReg_idx.."="..v.i.."[2]; "..rV.writeReg_idx.."="..rV.writeReg_idx.." and bit32.bxor("..rV.writeReg_idx..","..v.rks..") or nil; if "..rV.writeReg_idx.." and "..rV.writeReg_idx..">2147483647 then "..rV.writeReg_idx.."="..rV.writeReg_idx.."-4294967296 end; "..rV.rcSet.."("..rV.writeReg_idx..", "..rV.alu_res..")" },
{ "M_FETCH_REG_ID", "local "..rV.fetchReg_idx.."="..v.i.."[2]; "..rV.fetchReg_idx.."="..rV.fetchReg_idx.." and bit32.bxor("..rV.fetchReg_idx..","..v.rks..") or nil; if "..rV.fetchReg_idx.." and "..rV.fetchReg_idx..">2147483647 then "..rV.fetchReg_idx.."="..rV.fetchReg_idx.."-4294967296 end; "..rV.alu_res.."="..rV.rcGet.."("..rV.fetchReg_idx..")" },
{ "M_POP_ALU_B", rV.alu_b.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1" },
{ "M_POP_ALU_A", rV.alu_a.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1" },
{ "M_ALU_ADD", "if type("..rV.alu_a..")=='number' and type("..rV.alu_b..")=='number' then local "..rV._p.."="..v.dynState.."%3;if "..rV._p.."==0 then "..rV.alu_res.."="..rV.alu_a.."+"..rV.alu_b.." elseif "..rV._p.."==1 then "..rV.alu_res.."=("..rV.alu_a.."*2+"..rV.alu_b.."*2)/2 else "..rV.alu_res.."=("..rV.alu_a.."+"..v.rk..")+("..rV.alu_b.."-"..v.rk..") end else "..rV.alu_res.."="..rV.alu_a.."+"..rV.alu_b.." end" },
{ "M_ALU_SUB", "if type("..rV.alu_a..")=='number' and type("..rV.alu_b..")=='number' then local "..rV._p.."="..v.dynState.."%3;if "..rV._p.."==0 then "..rV.alu_res.."="..rV.alu_a.."-"..rV.alu_b.." elseif "..rV._p.."==1 then "..rV.alu_res.."=("..rV.alu_a.."*2-"..rV.alu_b.."*2)/2 else "..rV.alu_res.."=("..rV.alu_a.."+"..v.rk..")-("..rV.alu_b.."+"..v.rk..") end else "..rV.alu_res.."="..rV.alu_a.."-"..rV.alu_b.." end" },
{ "M_ALU_MUL", "local "..rV._p.."="..v.dynState.."%2;if "..rV._p.."==0 then "..rV.alu_res.."="..rV.alu_a.."*"..rV.alu_b.." else "..rV.alu_res.."="..rV.alu_b.."*"..rV.alu_a.." end" },
{ "M_ALU_BXOR", "local "..rV._p.."="..v.dynState.."%3;if "..rV._p.."==0 then "..rV.alu_res.."=bit32.bxor("..rV.alu_a..","..rV.alu_b..") elseif "..rV._p.."==1 then "..rV.alu_res.."=bit32.bor("..rV.alu_a..","..rV.alu_b..")-bit32.band("..rV.alu_a..","..rV.alu_b..") else "..rV.alu_res.."=bit32.bnot(bit32.bxor(bit32.bnot("..rV.alu_a.."),"..rV.alu_b..")) end" },
{ "M_ALU_DIV", rV.alu_res.."="..rV.alu_b.."~=0 and "..rV.alu_a.."/"..rV.alu_b.." or 0" },
{ "M_ALU_MOD", rV.alu_res.."="..rV.alu_b.."~=0 and "..rV.alu_a.."%"..rV.alu_b.." or 0" },
{ "M_ALU_POW", rV.alu_res.."="..rV.alu_a.."^"..rV.alu_b.."" },
{ "M_ALU_IDIV", rV.alu_res.."="..rV.alu_b.."~=0 and math.floor("..rV.alu_a.."/"..rV.alu_b..") or 0" },
{ "M_ALU_BAND", "local "..rV._p.."="..v.dynState.."%2;if "..rV._p.."==0 then "..rV.alu_res.."=bit32.band("..rV.alu_a..","..rV.alu_b..") else "..rV.alu_res.."=bit32.bnot(bit32.bor(bit32.bnot("..rV.alu_a.."),bit32.bnot("..rV.alu_b.."))) end" },
{ "M_ALU_BOR", "local "..rV._p.."="..v.dynState.."%2;if "..rV._p.."==0 then "..rV.alu_res.."=bit32.bor("..rV.alu_a..","..rV.alu_b..") else "..rV.alu_res.."=bit32.bnot(bit32.band(bit32.bnot("..rV.alu_a.."),bit32.bnot("..rV.alu_b.."))) end" },
{ "M_ALU_SHL", rV.alu_res.."=bit32.lshift("..rV.alu_a..","..rV.alu_b..")" },
{ "M_ALU_SHR", rV.alu_res.."=bit32.rshift("..rV.alu_a..","..rV.alu_b..")" },
{ "M_ALU_UNM", rV.alu_a.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;"..rV.alu_res.."=-"..rV.alu_a.."" },
{ "M_ALU_BNOT", rV.alu_a.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;"..rV.alu_res.."=bit32.bnot("..rV.alu_a..")" },
{ "M_ALU_NOT", rV.alu_a.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;"..rV.alu_res.."=not "..rV.alu_a.."" },
{ "M_ALU_LEN", rV.alu_a.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;"..rV.alu_res.."=type("..rV.alu_a..")=='string' and #"..rV.alu_a.." or (type("..rV.alu_a..")=='table' and #"..rV.alu_a.." or 0)" },
{ "M_LOADBOOL", "local "..rV.c.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.b.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.loadBool_idx.."="..v.i.."[2]; "..rV.loadBool_idx.."="..rV.loadBool_idx.." and bit32.bxor("..rV.loadBool_idx..","..v.rks..") or nil; if "..rV.loadBool_idx.." and "..rV.loadBool_idx..">2147483647 then "..rV.loadBool_idx.."="..rV.loadBool_idx.."-4294967296 end; "..rV.rcSet.."("..rV.loadBool_idx..", ("..rV.b.."~=0));if "..rV.c.."~=0 then "..rV.dispatch_next.."="..rV.dispatch_next.."+2 end" },
{ "M_LOADNIL", "local "..rV.b.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.a.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;for "..rV.x.."="..rV.a..","..rV.b.." do "..rV.rcSet.."("..rV.x..", nil) end" },
{ "M_GETGLOBAL", "local "..rV.k.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.getGlobal_dst.."="..v.i.."[2]; "..rV.getGlobal_dst.."="..rV.getGlobal_dst.." and bit32.bxor("..rV.getGlobal_dst..","..v.rks..") or nil; if "..rV.getGlobal_dst.." and "..rV.getGlobal_dst..">2147483647 then "..rV.getGlobal_dst.."="..rV.getGlobal_dst.."-4294967296 end; local "..rV.getGlobal_kid.."="..v.i.."[3]; "..rV.getGlobal_kid.."="..rV.getGlobal_kid.." and bit32.bxor("..rV.getGlobal_kid..","..v.rks..") or nil; if "..rV.getGlobal_kid.." and "..rV.getGlobal_kid..">2147483647 then "..rV.getGlobal_kid.."="..rV.getGlobal_kid.."-4294967296 end; "..rV.rcSet.."("..rV.getGlobal_dst..", "..v.E.."["..rV.subVMName.."("..rV.k..", "..rV.getGlobal_kid..", nil, "..rV.State_Variable..", "..v.rks..", "..v.op..")])" },
{ "M_SETGLOBAL", "local "..rV.s.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.gk.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.setGlobal_kid.."="..v.i.."[2]; "..rV.setGlobal_kid.."="..rV.setGlobal_kid.." and bit32.bxor("..rV.setGlobal_kid..","..v.rks..") or nil; if "..rV.setGlobal_kid.." and "..rV.setGlobal_kid..">2147483647 then "..rV.setGlobal_kid.."="..rV.setGlobal_kid.."-4294967296 end; "..v.E.."["..rV.subVMName.."("..rV.gk..", "..rV.setGlobal_kid..", nil, "..rV.State_Variable..", "..v.rks..", "..v.op..")]="..rV.s.."" },
{ "M_GETTABLE", "local "..rV.k.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.t.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1; local "..rV.getTable_dst.."="..v.i.."[2]; "..rV.getTable_dst.."="..rV.getTable_dst.." and bit32.bxor("..rV.getTable_dst..","..v.rks..") or nil; if "..rV.getTable_dst.." and "..rV.getTable_dst..">2147483647 then "..rV.getTable_dst.."="..rV.getTable_dst.."-4294967296 end; "..rV.rcSet.."("..rV.getTable_dst..", "..rV.t.."["..rV.k.."])" },
{ "M_SETTABLE", "local "..rV.v.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.k.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.t.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1; "..rV.t.."["..rV.k.."]="..rV.v.."" },
{ "M_NEWTABLE", "local "..rV.newTable_dst.."="..v.i.."[2]; "..rV.newTable_dst.."="..rV.newTable_dst.." and bit32.bxor("..rV.newTable_dst..","..v.rks..") or nil; if "..rV.newTable_dst.." and "..rV.newTable_dst..">2147483647 then "..rV.newTable_dst.."="..rV.newTable_dst.."-4294967296 end; "..rV.rcSet.."("..rV.newTable_dst..", {})" },
{ "M_SELF", "local "..rV.k.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.t.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.self_dst.."="..v.i.."[2]; "..rV.self_dst.."="..rV.self_dst.." and bit32.bxor("..rV.self_dst..","..v.rks..") or nil; if "..rV.self_dst.." and "..rV.self_dst..">2147483647 then "..rV.self_dst.."="..rV.self_dst.."-4294967296 end; "..rV.rcSet.."("..rV.self_dst.."+1, "..rV.t..");"..rV.rcSet.."("..rV.self_dst..", "..rV.t.."["..rV.k.."])" },
{ "M_CONCAT", "local "..rV.b.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.a.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.ps.."={};for "..rV.ci.."="..rV.a..","..rV.b.." do "..rV.ps.."[#"..rV.ps.."+1]=tostring("..rV.rcGet.."("..rV.ci..")) end;local "..rV.concat_dst.."="..v.i.."[2]; "..rV.concat_dst.."="..rV.concat_dst.." and bit32.bxor("..rV.concat_dst..","..v.rks..") or nil; if "..rV.concat_dst.." and "..rV.concat_dst..">2147483647 then "..rV.concat_dst.."="..rV.concat_dst.."-4294967296 end; "..rV.rcSet.."("..rV.concat_dst..", table.concat("..rV.ps.."))" },
{ "M_JMP", rV.dispatch_next.."=(("..v.tmp.."["..v.top.."]) or ("..rV.dispatch_next.."));"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1" },
{ "M_EQ", "local "..rV.c.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.b.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.a.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;if("..rV.b.."=="..rV.c..")~=("..rV.a.."~=0)then "..rV.dispatch_next.."="..rV.dispatch_next.."+2 end" },
{ "M_LT", "local "..rV.c.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.b.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.a.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;if("..rV.b.."<"..rV.c..")~=("..rV.a.."~=0)then "..rV.dispatch_next.."="..rV.dispatch_next.."+2 end" },
{ "M_LE", "local "..rV.c.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.b.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.a.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;if("..rV.b.."<="..rV.c..")~=("..rV.a.."~=0)then "..rV.dispatch_next.."="..rV.dispatch_next.."+2 end" },
{ "M_TEST", "local "..rV.b.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.a.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;if(not not "..rV.a..")~=("..rV.b.."~=0)then "..rV.dispatch_next.."="..rV.dispatch_next.."+2 end" },
{ "M_CALL", "local "..rV.nrv.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.na.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.dst.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.fn.."="..rV.rcGet.."("..rV.dst..");local "..rV.a2.."={};for "..rV.ai.."=1,"..rV.na.." do "..rV.a2.."["..rV.ai.."]="..rV.rcGet.."("..rV.dst.."+"..rV.ai..") end;local "..rV.rv.."; if type("..rV.fn..")=="..bStr("table").." and rawget("..rV.fn..",'"..pk.cl.."') then "..rV.rv.." = {"..vmName.."("..rV.fn.."."..pk.p..","..rV.fn.."."..pk.e..","..rV.a2..")} else "..rV.rv.." = {"..rV.fn.."((unpack or table.unpack)("..rV.a2..", 1, "..rV.na.."))} end; for "..rV.ri.."=1,"..rV.nrv.." do "..rV.rcSet.."("..rV.dst.."+"..rV.ri.."-1, "..rV.rv.."["..rV.ri.."]) end" },
{ "M_RETURN", "local "..rV.n.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.base.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;"..rV.has_returned.."=true;if "..rV.n.."==0 then "..rV.return_values.."={}; "..rV.rcStore.."={}; return end;local "..rV.rv.."={};for "..rV.ri.."=0,"..rV.n.."-1 do "..rV.rv.."["..rV.ri.."+1]="..rV.rcGet.."("..rV.base.."+"..rV.ri..") end;"..rV.return_values.."="..rV.rv..";"..rV.rcStore.."={};return" },
{ "M_FORPREP", "local "..rV.t.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.ir.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;"..rV.rcSet.."("..rV.ir..", ("..rV.rcGet.."("..rV.ir..") or 0)-("..rV.rcGet.."("..rV.ir.."+2) or 1)); "..rV.dispatch_next.."="..rV.t },
{ "M_FORLOOP", "local "..rV.t.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.ir.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.idx.."="..rV.rcGet.."("..rV.ir..")+("..rV.rcGet.."("..rV.ir.."+2) or 1);"..rV.rcSet.."("..rV.ir..", "..rV.idx..");if "..rV.idx.."<="..rV.rcGet.."("..rV.ir.."+1) then "..rV.rcSet.."("..rV.ir.."+3, "..rV.idx..");"..rV.dispatch_next.."="..rV.t.." end" },
{ "M_CLOSURE", "local "..rV.p_idx.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1; local "..rV.clPr.."="..v.pr.."["..rV.p_idx.."+1]; local "..rV.clUvs.."={}; for "..rV.clIdx..","..rV.clUv.." in ipairs("..rV.clPr..".upvalues or {}) do if "..rV.clUv.."[1]==1 then "..rV.clUvs.."["..rV.clIdx.."]=function("..rV.clVal..","..rV.clSet..") if "..rV.clSet.." then "..rV.rcSet.."("..rV.clUv.."[2], "..rV.clVal..") else return "..rV.rcGet.."("..rV.clUv.."[2]) end end else "..rV.clUvs.."["..rV.clIdx.."]="..v.U.."["..rV.clUv.."[2]+1] end end; local "..rV.clInner.." = function(...) return "..vmName.."("..rV.clPr..","..v.E..",{n=select('#', ...), ...},"..rV.clUvs..") end; local "..rV.clWrapped.."; if "..rV.safe_newcc.." then "..rV.clWrapped.." = "..rV.safe_newcc.."("..rV.clInner..") else "..rV.clWrapped.." = "..rV.clInner.." end; "..rV.vmTrusted.."["..rV.clWrapped.."] = true; local "..rV.closure_dst.."="..v.i.."[2]; "..rV.closure_dst.."="..rV.closure_dst.." and bit32.bxor("..rV.closure_dst..","..v.rks..") or nil; if "..rV.closure_dst.." and "..rV.closure_dst..">2147483647 then "..rV.closure_dst.."="..rV.closure_dst.."-4294967296 end; "..rV.rcSet.."("..rV.closure_dst..", "..rV.clWrapped..")" },
{ "M_GETUPVAL", "local "..rV.upIdx.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1; local "..rV.getUpval_dst.."="..v.i.."[2]; "..rV.getUpval_dst.."="..rV.getUpval_dst.." and bit32.bxor("..rV.getUpval_dst..","..v.rks..") or nil; if "..rV.getUpval_dst.." and "..rV.getUpval_dst..">2147483647 then "..rV.getUpval_dst.."="..rV.getUpval_dst.."-4294967296 end; "..rV.rcSet.."("..rV.getUpval_dst..", "..v.U.."["..rV.upIdx.."+1]())" },
{ "M_SETUPVAL", "local "..rV.upVal.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1; local "..rV.upIdx.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1; "..v.U.."["..rV.upIdx.."+1]("..rV.upVal..", true)" },
{ "M_HALT", ""..rV.Central_Dispatcher.."=false; "..rV.rcStore.."={}" },
{ "M_NOP", "" },
{ "M_EXEC_SUB", "local "..rV.k.."="..v.tmp.."["..v.top.."];"..v.tmp.."["..v.top.."]=nil;"..v.top.."="..v.top.."-1;local "..rV.execSub_dst.."="..v.i.."[2]; "..rV.execSub_dst.."="..rV.execSub_dst.." and bit32.bxor("..rV.execSub_dst..","..v.rks..") or nil; if "..rV.execSub_dst.." and "..rV.execSub_dst..">2147483647 then "..rV.execSub_dst.."="..rV.execSub_dst.."-4294967296 end; local "..rV.execSub_kid.."="..v.i.."[3]; "..rV.execSub_kid.."="..rV.execSub_kid.." and bit32.bxor("..rV.execSub_kid..","..v.rks..") or nil; if "..rV.execSub_kid.." and "..rV.execSub_kid..">2147483647 then "..rV.execSub_kid.."="..rV.execSub_kid.."-4294967296 end; "..rV.rcSet.."("..rV.execSub_dst..", "..rV.subVMName.."("..rV.k..", "..rV.execSub_kid..", nil, "..rV.State_Variable..", "..v.rks..", "..v.op..")) " }
}
local function getLogicString(opName)
for _, def in ipairs(opLogic) do
if def[1] == opName then return def[2] end
end
return ""
end
for superName, ops in pairs(superMap) do
local logic1 = getLogicString(ops[1])
local logic2 = getLogicString(ops[2])
local v_nxt = "nxt_"..math.random(1000,9999)
local fake_path = v.dynState.." = bit32.bxor("..v.dynState..", 0xDEADBEEF);"
local combinedLogic = logic1 .. " " ..
"local "..v_nxt.." = " .. v.bc .. "[" .. rV.dispatch_next .. "]; " ..
"if "..v_nxt.." then " ..
"local "..sV.nxt_rk.." = ((("..rV.dispatch_next.." * "..rV.dispatch_next.." * 197) + ("..rV.dispatch_next.." * 83) + "..rV.poly_seed..") % 4294967296); " ..
"if ("..v.dynState.." % 256) == 0xDEAD then "..sV.nxt_rk.." = 0 end; " ..
v.dynState.." = bit32.bxor("..v.dynState..", "..v_nxt.."[1]); " ..
v.dynState.." = math.floor(("..v.dynState.." + ("..v_nxt.."[1] or 0)) % 256); " ..
v.i.." = "..v_nxt.."; " ..
v.rks.." = "..sV.nxt_rk.."; " ..
v.rk.." = "..v_nxt.."[2] or 0; " ..
"if "..rV.opaqueTrue.."() == 1 then " .. logic2 .. " else " .. fake_path .. " end " ..
rV.dispatch_next .. " = " .. rV.dispatch_next .. " + 1; " ..
"end"
opLogic[#opLogic+1] = { superName, combinedLogic }
end
for i = #opLogic, 2, -1 do
local j = math.random(i)
opLogic[i], opLogic[j] = opLogic[j], opLogic[i]
end
for _, opDef in ipairs(opLogic) do
local op = opDef[1]
local logic = opDef[2]
local jv = newVar()
local opq_val = math.random(10, 9999)
local junk_logic = "local "..jv.." = "..opq_val.."; if bit32.band("..jv..", bit32.bnot("..jv..")) ~= 0 then "..v.rk.." = bit32.bxor("..v.rk..", "..jv..") end; "
local mut_key = math.random(100, 999)
local v_tmp_d = newVar()
local dyn_mutation = "local "..v_tmp_d.." = bit32.bxor("..v.dynState..", "..mut_key..") + (bit32.band("..v.dynState..", "..mut_key..") * 2); "..v.dynState.." = "..v_tmp_d.." - "..mut_key.."; "
logic = junk_logic .. dyn_mutation .. logic
local hBody = v.dynState.." = math.floor(("..v.dynState.." + ("..v.i.."[1] or 0)) % 256);"
local dCheck = genCollatzCheck(v.dynState)
if op == "M_HALT" or op == "M_RETURN" then
hBody = hBody .. "if "..rV.pipelineLockVar.." or "..rV.opaqueTrue.."() then if "..rV.pipelineLockVar.." or " .. dCheck .. " then " .. logic .. " else return end else return end"
else
hBody = hBody .. "if "..rV.pipelineLockVar.." or "..rV.opaqueTrue.."() then if "..rV.pipelineLockVar.." or " .. dCheck .. " then " .. logic .. " else "..rV.dispatch_next.."="..rV.dispatch_next.."-"..math.random(1,10).." end else "..rV.dispatch_next.."="..rV.dispatch_next.."+"..math.random(1,10).." end"
end
A(" "..v.handlers.."["..ov(op).."] = function() " .. hBody .. " end")
end
A(" local "..rV.max_pc.." = 0")
A(" for k in pairs("..rV.realBc..") do if type(k) == 'number' and k > "..rV.max_pc.." then "..rV.max_pc.." = k end end")
A(" local "..rV.gm.." = "..rV.env.."["..bStr("getmetatable").."]")
A(" local "..rV.tp.." = "..rV.env.."["..bStr("type").."]")
A(" local "..rV.pc.." = "..rV.env.."["..bStr("pcall").."]")
A(" local "..rV.rg.." = "..rV.env.."["..bStr("rawget").."]")
A(" local "..rV.isc.." = function(f) return type(f) == " .. bStr("function") .. " end")
A(" local "..rV.tof_pre.." = "..rV.env.."["..bStr("typeof").."]")
A(" local "..rV.g_pre.." = "..rV.env.."["..bStr("game").."]")
A(" local "..rV.v3_pre.." = "..rV.env.."["..bStr("Vector3").."]")
A(" local "..rV.sf.." = "..rV.env.."["..bStr("string").."] and "..rV.env.."["..bStr("string").."]["..bStr("find").."] or function() return nil end")
A(" do")
A(" local "..rV.env_probe_mt.." = ("..rV.tp.."("..rV.gm..") == "..bStr("function")..") and "..rV.gm.."("..v.E..") or nil")
A(" if "..rV.tp.."("..rV.env_probe_mt..") == "..bStr("table").." and "..rV.rg.."("..rV.env_probe_mt..", "..bStr("__newindex")..") ~= nil then")
A(" "..v.dynState.." = bit32.bxor("..v.dynState..", "..rV.rt_seed..")")
A(" "..v.rk.." = bit32.bxor("..v.rk..", "..rV.chain_key.."); "..v.rks.." = bit32.bxor("..v.rks..", "..rV.chain_key..")")
A(" "..rV.Central_Dispatcher.." = false")
A(" end")
A(" end")
A(" local "..rV.mt_bc_pre.." = ("..rV.tp.."("..rV.gm..") == "..bStr("function")..") and "..rV.gm.."("..v.bc..") or "..bStr("nil").."")
A(" local "..rV.mt_h_pre.." = ("..rV.tp.."("..rV.gm..") == "..bStr("function")..") and "..rV.gm.."("..v.handlers..") or "..bStr("nil").."")
A(" local "..rV.is_inst_pre.." = ("..rV.tof_pre.." and "..rV.g_pre.." and "..rV.tof_pre.."("..rV.g_pre..") == "..bStr("Instance")..") and true or false")
A(" local "..rV.s_pre..", "..rV.e_pre.." = "..rV.pc.."(function() return "..rV.g_pre.."."..rV.fake_prop_pre.." end)")
A(" local "..rV.err_valid_pre.." = (not "..rV.s_pre.." and "..rV.tp.."("..rV.e_pre..") == "..bStr("string").." and "..rV.sf.."("..rV.e_pre..", "..bStr("valid member")..")) and true or false")
A(" local "..rV.v3_valid_pre.." = false")
A(" if "..rV.v3_pre.." and "..rV.v3_pre.."["..bStr("new").."] then")
A(" local "..rV.s2_pre..", "..rV.r2_pre.." = "..rV.pc.."(function() local _v1 = "..rV.v3_pre.."["..bStr("new").."](1,0,0); local _v2 = "..rV.v3_pre.."["..bStr("new").."](0,1,0); return _v1["..bStr("Cross").."](_v1, _v2)["..bStr("Z").."] end)")
A(" "..rV.v3_valid_pre.." = ("..rV.s2_pre.." and "..rV.r2_pre.." == 1)")
A(" end")
A(" local "..rV.bcFp.." = 0")
A(" for "..rV.ci.."=1,"..rV.max_pc.." do local "..rV.t.."="..rV.realBc.."["..rV.ci.."]; if "..rV.t.." then for "..rV.x.."=1,#"..rV.t.." do "..rV.bcFp.."=bit32.bxor("..rV.bcFp..","..rV.t.."["..rV.x.."] or 0); "..rV.bcFp.."=("..rV.bcFp.."*16777619+1)%4294967296 end end end")
A(" local "..rV.ckR.." = ( ("..rV.bcFp.." * "..rV.bcFp.." * 197) + ("..rV.bcFp.." * 83) + "..rV.poly_seed..") % 4294967296")
A(" local "..rV.dc1.." = bit32.bxor("..v.P.."."..pk.ec1..", "..rV.ckR..")")
A(" local "..rV.dc2.." = bit32.bxor("..v.P.."."..pk.ec2..", bit32.bxor("..rV.ckR..", 0x11))")
A(" local "..rV.dc3.." = bit32.bxor("..v.P.."."..pk.ec3..", bit32.bxor("..rV.ckR..", 0x22))")
A(" local "..rV.cM.." = (math.abs(math.log(100,10)-2) < 1e-6) and (math.sin(0) == 0) and (math.abs((123.456*math.pi)/math.pi - 123.456) < 1e-6)")
A(" local "..rV.cMem.." = "..rV.pc.."(function() local "..rV.fn.." = "..rV.g_pre..":GetService("..bStr("MemStorageService").."); local "..rV.s_pre.." = tostring(math.log(100,10)); "..rV.fn..":SetItem("..bStr("nv_chk")..", "..rV.s_pre.."); local "..rV.e_pre.." = tonumber("..rV.fn..":GetItem("..bStr("nv_chk")..")); if not ("..rV.e_pre.." and math.abs("..rV.e_pre.."-2)<1e-6) then error() end end)")
A(" local "..rV.cG.." = "..rV.pc.."(function() local "..rV.fn.." = "..rV.g_pre..":GetService("..bStr("HttpService").."):GenerateGUID(false); if not (type("..rV.fn..")=="..bStr("string").." and #"..rV.fn.."=="..rV.dc3.." and "..rV.fn..":sub("..rV.dc2..","..rV.dc2..")=="..bStr("-")..") then error() end end)")
A(" local "..rV.cE.." = "..rV.pc.."(function() if "..rV.env.."["..bStr("Enum").."]["..bStr("Material").."]["..bStr("Plastic").."].Value ~= "..rV.dc1.." then error() end end)")
A(" local "..rV.cR.." = "..rV.pc.."(function() local "..rV.fn.." = "..rV.g_pre..":GetService("..bStr("RunService").."); if not ("..rV.fn..":IsClient() ~= "..rV.fn..":IsServer()) then error() end if "..rV.tof_pre.."("..rV.fn..".Heartbeat) ~= "..bStr("RBXScriptSignal").." then error() end end)")
A(" local "..rV.passed.." = 0")
A(" "..rV.passed.." = "..rV.passed.." + (("..rV.mt_bc_pre.." == '"..randLockStr.."') and 1 or 0)")
A(" "..rV.passed.." = "..rV.passed.." + (("..rV.mt_h_pre.." == "..bStr("Locked")..") and 1 or 0)")
A(" "..rV.passed.." = "..rV.passed.." + ("..rV.isc.."("..rV.pc..") and 1 or 0)")
A(" "..rV.passed.." = "..rV.passed.." + ("..rV.is_inst_pre.." and 1 or 0)")
A(" "..rV.passed.." = "..rV.passed.." + ("..rV.err_valid_pre.." and 1 or 0)")
A(" "..rV.passed.." = "..rV.passed.." + ("..rV.v3_valid_pre.." and 1 or 0)")
A(" "..rV.passed.." = "..rV.passed.." + ("..rV.cM.." and 1 or 0)")
A(" "..rV.passed.." = "..rV.passed.." + ("..rV.cMem.." and 1 or 0)")
A(" "..rV.passed.." = "..rV.passed.." + ("..rV.cG.." and 1 or 0)")
A(" "..rV.passed.." = "..rV.passed.." + ("..rV.cE.." and 1 or 0)")
A(" "..rV.passed.." = "..rV.passed.." + ("..rV.cR.." and 1 or 0)")
A(" local "..rV.is_safe.." = ("..rV.passed.." >= 11) and 1 or 0")
A(" if ("..rV.is_safe.." + 0) == 0 then")
A(" "..v.dynState.." = bit32.bxor("..v.dynState..", bit32.bxor("..rV.rt_seed..", "..rV.chain_key.."))")
A(" "..v.rk.." = bit32.bxor("..v.rk..", bit32.bxor("..rV.chain_key..", "..rV.rt_seed.." + 1)); "..v.rks.." = bit32.bxor("..v.rks..", bit32.bxor("..rV.chain_key..", "..rV.rt_seed.." + 1))")
A(" "..rV.State_Variable.." = "..rV.max_pc.." + math.random(1000, 9999)")
A(" end")
A(" while "..rV.Central_Dispatcher.." do")
A(" if "..rV.State_Variable.." > "..rV.max_pc.." or "..rV.State_Variable.." < 1 then break end")
A(" local "..rV.op_val.." = "..rV.opaqueTrue.."()")
A(" if "..rV.op_val.." == 1 then")
A(" "..v.i.."="..v.bc.."["..rV.State_Variable.." * "..rV.op_val.."]")
A(" local "..rV.poly_share.." = ( ("..rV.State_Variable.." * "..rV.State_Variable.." * 197) + ("..rV.State_Variable.." * 83) + "..rV.poly_seed.." ) % 4294967296")
A(" if ("..v.dynState.." % 256) == 0xDEAD then "..rV.poly_share.." = 0 end")
A(" "..v.rks.." = "..rV.poly_share.."")
A(" "..v.dynState.." = bit32.bxor("..v.dynState..", "..v.i.."[1])")
A(" "..v.op.." = bit32.bxor("..v.i.."[1], "..v.rks..")")
A(" "..v.rk.." = "..v.i.."[2] or 0")
local pc_obfuscation = "bit32.bxor("..rV.State_Variable..", 1) + (bit32.band("..rV.State_Variable..", 1) * 2)"
A(" "..rV.dispatch_next.." = "..pc_obfuscation)
A(" "..v.handlers.."["..v.op.."]()")
A(" if "..rV.has_returned.." then return table.unpack("..rV.return_values..") end")
local dV = {
d1 = newVar(), d2 = newVar(),
df1_1 = newVar(), df2_1 = newVar(), df3_1 = newVar(),
df1_2 = newVar(), df2_2 = newVar(), df3_2 = newVar(),
mix = newVar(),
tp1 = newVar(), sf1 = newVar(), tp2 = newVar(), sf2 = newVar(),
oq = newVar(),
op1_1 = newVar(), op2_1 = newVar(), op1_2 = newVar(), op2_2 = newVar()
}
local st1_start = math.random(10000, 99999)
local st1_trap = math.random(10000, 99999)
local st1_calc = math.random(10000, 99999)
local st1_opaque = math.random(10000, 99999)
local st1_final = math.random(10000, 99999)
local st1_end = math.random(10000, 99999)
local st2_start = math.random(10000, 99999)
local st2_trap = math.random(10000, 99999)
local st2_calc = math.random(10000, 99999)
local st2_opaque = math.random(10000, 99999)
local st2_final = math.random(10000, 99999)
local st2_end = math.random(10000, 99999)
local xor_key = math.random(100, 999)
local base_start_trap_1 = bit32.bxor(st1_start, st1_trap)
local base_start_calc_1 = bit32.bxor(st1_start, st1_calc)
local base_trap_end_1 = bit32.bxor(st1_trap, st1_end)
local base_calc_opaque_1 = bit32.bxor(st1_calc, st1_opaque)
local base_opaque_trap_1 = bit32.bxor(st1_opaque, st1_trap)
local base_opaque_final_1 = bit32.bxor(st1_opaque, st1_final)
local base_final_end_1 = bit32.bxor(st1_final, st1_end)
local base_start_trap_2 = bit32.bxor(st2_start, st2_trap)
local base_start_calc_2 = bit32.bxor(st2_start, st2_calc)
local base_trap_end_2 = bit32.bxor(st2_trap, st2_end)
local base_calc_opaque_2 = bit32.bxor(st2_calc, st2_opaque)
local base_opaque_trap_2 = bit32.bxor(st2_opaque, st2_trap)
local base_opaque_final_2 = bit32.bxor(st2_opaque, st2_final)
local base_final_end_2 = bit32.bxor(st2_final, st2_end)
A(" local "..dV.mix.." = 0")
A(" local "..dV.df1_1.." = bit32.bxor("..base_start_trap_1..", "..dV.mix..")")
A(" local "..dV.df2_1.." = bit32.bxor("..base_start_calc_1..", "..dV.mix..")")
A(" local "..dV.df3_1.." = bit32.bxor("..base_trap_end_1..", "..dV.mix..")")
A(" local "..dV.df1_2.." = bit32.bxor("..base_start_trap_2..", "..dV.mix..")")
A(" local "..dV.df2_2.." = bit32.bxor("..base_start_calc_2..", "..dV.mix..")")
A(" local "..dV.df3_2.." = bit32.bxor("..base_trap_end_2..", "..dV.mix..")")
A(" local "..dV.tp1.." = (1 - "..rV.is_safe..") * bit32.bxor("..dV.df1_1..", "..dV.mix..");")
A(" local "..dV.sf1.." = "..rV.is_safe.." * bit32.bxor("..dV.df2_1..", "..dV.mix..");")
A(" local "..dV.tp2.." = (1 - "..rV.is_safe..") * bit32.bxor("..dV.df1_2..", "..dV.mix..");")
A(" local "..dV.sf2.." = "..rV.is_safe.." * bit32.bxor("..dV.df2_2..", "..dV.mix..");")
A(" local "..rV.Opaque_Transition.." = "..rV.dispatch_next.."; ")
A(" local "..dV.d1.." = "..st1_start.."; ")
A(" local "..dV.d2.." = "..st2_start.."; ")
A(" while bit32.bor(bit32.bxor("..dV.d1..", "..st1_end.."), bit32.bxor("..dV.d2..", "..st2_end..")) ~= 0 do ")
local cff_blocks = {
{
st1 = st1_start, st2 = st2_start,
cd = dV.d1.." = bit32.bxor("..dV.d1..", bit32.bor("..dV.tp1..", "..dV.sf1..")); "..dV.d2.." = bit32.bxor("..dV.d2..", bit32.bor("..dV.tp2..", "..dV.sf2..")); "
},
{
st1 = st1_trap, st2 = st2_trap,
cd = v.dynState.." = bit32.bxor("..v.dynState..", bit32.bxor("..rV.rt_seed..", "..rV.chain_key..")); "..v.rk.." = bit32.bxor("..v.rk..", bit32.bxor("..rV.chain_key..", "..rV.rt_seed..")); "..v.rks.." = bit32.bxor("..v.rks..", bit32.bxor("..rV.chain_key..", "..rV.rt_seed..")); "..rV.State_Variable.." = "..rV.max_pc.." + math.random(1000, 9999); "..dV.d1.." = bit32.bxor("..dV.d1..", bit32.bxor("..dV.df3_1..", "..dV.mix..")); "..dV.d2.." = bit32.bxor("..dV.d2..", bit32.bxor("..dV.df3_2..", "..dV.mix..")); "
},
{
st1 = st1_calc, st2 = st2_calc,
cd = rV.mip.." = bit32.bxor(bit32.bxor("..rV.Opaque_Transition..", "..xor_key.."), bit32.bxor("..v.dynState..", "..xor_key..")); "..dV.d1.." = bit32.bxor("..dV.d1..", bit32.bxor("..bit32.bxor(base_calc_opaque_1, 0x55AA)..", 0x55AA)); "..dV.d2.." = bit32.bxor("..dV.d2..", bit32.bxor("..bit32.bxor(base_calc_opaque_2, 0x55AA)..", 0x55AA)); "
},
{
st1 = st1_opaque, st2 = st2_opaque,
cd = "local "..dV.oq.." = 1; local "..dV.op1_1.." = bit32.bxor("..base_opaque_final_1..", "..v.dynState.."); local "..dV.op2_1.." = bit32.bxor("..base_opaque_trap_1..", "..v.dynState.."); local "..dV.op1_2.." = bit32.bxor("..base_opaque_final_2..", "..v.dynState.."); local "..dV.op2_2.." = bit32.bxor("..base_opaque_trap_2..", "..v.dynState.."); "..dV.d1.." = bit32.bxor("..dV.d1..", ("..dV.oq.." * bit32.bxor("..dV.op1_1..", "..v.dynState..")) + ((1 - "..dV.oq..") * bit32.bxor("..dV.op2_1..", "..v.dynState.."))); "..dV.d2.." = bit32.bxor("..dV.d2..", ("..dV.oq.." * bit32.bxor("..dV.op1_2..", "..v.dynState..")) + ((1 - "..dV.oq..") * bit32.bxor("..dV.op2_2..", "..v.dynState.."))); "
},
{
st1 = st1_final, st2 = st2_final,
cd = rV.State_Variable.." = bit32.bxor("..rV.mip..", "..v.dynState.."); "..dV.d1.." = bit32.bxor("..dV.d1..", bit32.bxor("..bit32.bxor(base_final_end_1, 0x1234)..", 0x1234)); "..dV.d2.." = bit32.bxor("..dV.d2..", bit32.bxor("..bit32.bxor(base_final_end_2, 0x1234)..", 0x1234)); "
}
}
local num_fakes = math.random(5, 12)
local prev_fake_1 = st1_trap
local prev_fake_2 = st2_trap
for i = 1, num_fakes do
local f_st1 = math.random(10000, 99999)
local f_st2 = math.random(10000, 99999)
local diff_f_1 = bit32.bxor(f_st1, prev_fake_1)
local diff_f_2 = bit32.bxor(f_st2, prev_fake_2)
local _rt_f_key = math.random(1024, 65535)
local dyn_diff_f_1 = bit32.bxor(diff_f_1, _rt_f_key)
local dyn_diff_f_2 = bit32.bxor(diff_f_2, _rt_f_key)
local fake_logic = rV.State_Variable.." = bit32.bxor("..v.dynState..", "..math.random(100, 999).."); "..dV.d1.." = bit32.bxor("..dV.d1..", bit32.bxor("..dyn_diff_f_1..", ".._rt_f_key..")); "..dV.d2.." = bit32.bxor("..dV.d2..", bit32.bxor("..dyn_diff_f_2..", ".._rt_f_key..")); "
local mod_m = math.random(3, 7)
local impossible_val = mod_m + math.random(1, 9)
local opq_condition = "(("..rV.chain_key.." % "..mod_m..") == "..impossible_val..")"
cff_blocks[#cff_blocks].cd = cff_blocks[#cff_blocks].cd .. "if "..opq_condition.." then "..dV.d1.." = bit32.bxor("..dV.d1..", "..bit32.bxor(st1_final, f_st1).."); "..dV.d2.." = bit32.bxor("..dV.d2..", "..bit32.bxor(st2_final, f_st2).."); end; "
cff_blocks[#cff_blocks+1] = { st1 = f_st1, st2 = f_st2, cd = fake_logic }
prev_fake_1 = f_st1
prev_fake_2 = f_st2
end
for i = #cff_blocks, 2, -1 do
local j = math.random(i)
cff_blocks[i], cff_blocks[j] = cff_blocks[j], cff_blocks[i]
end
for i, b in ipairs(cff_blocks) do
local opq_chk = "(bit32.bxor("..dV.d1..", "..b.st1..") + bit32.bxor("..dV.d2..", "..b.st2..")) == 0"
if i == 1 then
A(" if "..opq_chk.." then ")
else
A(" elseif "..opq_chk.." then ")
end
A(" "..b.cd)
end
A(" end; ")
A(" end; ")
A(" else")
A(" "..rV.State_Variable.." = "..rV.State_Variable.." + (math.random(1,2) == 1 and 0 or 1)")
A(" end")
A(" end")
A("end")
return table.concat(L, "\n")
end
local LoadFileEnabled = false
local CompiledScriptOutput = ""
LoadFileButton.MouseButton1Click:Connect(function()
LoadFileEnabled = not LoadFileEnabled
LoadFileButton.BackgroundColor3 = LoadFileEnabled
and Color3.fromRGB(0,170,0) or Color3.fromRGB(0,0,0)
end)
CopyButton.MouseButton1Click:Connect(function()
local textToCopy = (CompiledScriptOutput ~= "") and CompiledScriptOutput or OutputBox.Text
if textToCopy ~= "" then
setclipboard(textToCopy)
CopyButton.Text="COPIED!"
task.wait(1)
CopyButton.Text="COPY OUTPUT"
end
end)
ClearButton.MouseButton1Click:Connect(function()
InputBox.Text = ""
OutputBox.Text = ""
CompiledScriptOutput = ""
end)
ObfuscateButton.MouseButton1Click:Connect(function()
local src = InputBox.Text
if src=="" then
if LoadFileEnabled then
local ok,data=pcall(readfile, FileNameBox.Text)
if ok then src=data else OutputBox.Text="readfile error"; return end
else return end
end
OutputBox.Text="Compiling..."
local numKey = math.random(100000, 999999)
task.spawn(function()
usedVars = {}
local ok1, toks_or_err = pcall(function() return lex(src) end)
if not ok1 then OutputBox.Text="Lex error: "..tostring(toks_or_err); return end
local toks = renameVars(toks_or_err)
local OC = makeOpcodes()
local ok2a, ast_or_err = pcall(function() return parseAST(toks) end)
if not ok2a then OutputBox.Text="Parse error: "..tostring(ast_or_err); return end
local ast = ast_or_err
local v_enc_st_ = newVar()
local v_time_st_ = newVar()
local function applyASTFunctionEncryption(node)
if type(node) == "table" then
if node.type == "FunctionDefinition" then
local stateVar = v_enc_st_ .. tostring(math.random(1000, 9999))
local timeVar = v_time_st_ .. tostring(math.random(1000, 9999))
local osClockBase = {
type = "CallExpression",
base = {
type = "MemberExpression",
base = { type = "Identifier", name = "os" },
identifier = "clock"
},
arguments = {},
isSelf = false
}
local timeDef = {
type = "LocalDefinition",
names = {timeVar},
values = {osClockBase}
}
local stateDef = {
type = "LocalDefinition",
names = {stateVar},
values = {{
type = "BinaryExpression",
operator = "==",
left = {
type = "CallExpression",
base = { type = "Identifier", name = "type" },
arguments = {{ type = "Identifier", name = timeVar }},
isSelf = false
},
right = { type = "Literal", kind = "string", value = "number" }
}}
}
local condition = {
type = "BinaryExpression",
operator = "==",
left = { type = "Identifier", name = stateVar },
right = { type = "Literal", kind = "boolean", value = true }
}
local trapBody = {
{
type = "WhileStatement",
condition = { type = "Literal", kind = "boolean", value = true },
body = {}
}
}
local ifStat = {
type = "IfStatement",
clauses = { { condition = condition, body = node.body } },
elseBody = trapBody
}
node.body = { timeDef, stateDef, ifStat }
end
for k, v in pairs(node) do
if type(v) == "table" then
applyASTFunctionEncryption(v)
end
end
end
return node
end
ast = applyASTFunctionEncryption(ast)
local ok2b, proto_or_err = pcall(function() return compileAST(ast,OC) end)
if not ok2b then OutputBox.Text="Compile error: "..tostring(proto_or_err); return end
local proto = proto_or_err
local superMap = peepholeOptimize(proto, OC)
local mathProxy = newVar()
local stringChar = newVar()
local extremeMath = newVar()
local function genMathProxyCall(v, mp)
local a = math.random(2, 6)
local b = math.random(2, 8)
local c = math.random(2, 4)
local d = math.random(5, 15)
local ac = a^c
local ac_mod_d = ac % d
local bc = b * c
local s = ac_mod_d + bc - v
return "("..mp.."("..a..")^"..mp.."("..c..")%"..mp.."("..d..")+"..mp.."("..b..")*"..mp.."("..c..")-"..mp.."("..s.."))()"
end
local opVarDecls={}
local opVarNames={}
local opValMap={}
for name,val in pairs(OC) do
local vn=newVar()
local R=math.random(1,255)
local A=bit32.bxor(val,R)
opVarDecls[#opVarDecls+1]="local "..vn.."=bit32.bxor("..genMathProxyCall(A, mathProxy)..","..genMathProxyCall(R, mathProxy)..")"
opVarNames[name]=vn
opValMap[val]=tostring(val)
end
local pk = {
c = newVar(), k = newVar(), pr = newVar(), np = newVar(), va = newVar(), mr = newVar(),
p = newVar(), e = newVar(), cl = newVar(), hash = newVar(), seed = newVar(),
ec1 = newVar(), ec2 = newVar(), ec3 = newVar(), dKey = newVar()
}
local v = {
P = newVar(), E = newVar(), a = newVar(), r = newVar(),
pc = newVar(), bc = newVar(), k = newVar(), pr = newVar(),
mk = newVar(), p = newVar(), e = newVar(), cl = newVar(),
i = newVar(), op = newVar(), x = newVar(), t = newVar(),
key = newVar(), d = newVar(), val = newVar(), ps = newVar(),
ci = newVar(), fn = newVar(), na = newVar(), nrv = newVar(),
a2 = newVar(), ai = newVar(), rv = newVar(), ok = newVar(),
r1 = newVar(), r2 = newVar(), r3 = newVar(), r4 = newVar(), r5 = newVar(),
n = newVar(), ri = newVar(), idx = newVar(), state = newVar(),
dynState = newVar(), handlers = newVar(), res = newVar(),
rk = newVar(), rks = newVar(), tmp = newVar(), top = newVar(),
U = newVar()
}
local _IllI11I=false;local _00O1OO,_O11O0O=pcall(function()local _1IO0=game;local _O001I=workspace;local _II11O0="\71\101\116\68\101\98\117\103\73\100";local _01O1I=_1IO0[_II11O0](_1IO0,0);if type(_01O1I)~="\115\116\114\105\110\103"or #_01O1I==0 then return false end;local _I10O1=_O001I[_II11O0](_O001I,0);local _1OOI0=_1IO0:GetService("\80\108\97\121\101\114\115")[_II11O0](_1IO0:GetService("\80\108\97\121\101\114\115"),0);if _01O1I==_I10O1 or _01O1I==_1OOI0 or _I10O1==_1OOI0 then return false end;return true end)if not _00O1OO or not _O11O0O then _IllI11I=true end;local function _O1I0O()local _0I1I0=os.clock();for _=1,500 do local _1O0I1="\97\120";local _00I1O="\97\120";local _II00O=_1O0I1==_00I1O end;local _I100I=os.clock()-_0I1I0;local _0O10I=os.clock();for _1I0O1=1,500 do local _1O0I1="\97\120".._1I0O1;local _00I1O="\97\120".._1I0O1;local _II00O=_1O0I1==_00I1O end;local _O00O1=os.clock()-_0O10I;return _I100I<_O00O1*2 end;local function _11I0O()local _I0O10=0/0;local _01I01=math.max;local _10I1O=math.min;return _01I01(_I0O10,1)~=_01I01(_I0O10,1)and _10I1O(_I0O10,1)~=_10I1O(_I0O10,1)and not(_I0O10==_I0O10)end;local function _O01I1()local _II00O=0;local _0I10O=function()_II00O=_II00O+1 end;local _11O0I=function()return _II00O end;local _0I1I0=os.clock();for _=1,1000 do _0I10O()end;local _I100I=os.clock()-_0I1I0;local _0O10I=os.clock();for _=1,1000 do _11O0I()end;local _O00O1=os.clock()-_0O10I;return _I100I>_O00O1*0.3 and _I100I<_O00O1*10 end;local function _00O1I1()local _I0I01=setmetatable({},{["\95\95\109\111\100\101"]="\118"});for _1I0O1=1,100 do _I0I01[_1I0O1]={a=_1I0O1}end;local _O11I0=0;for _ in pairs(_I0I01)do _O11I0=_O11I0+1 end;local _0I1I0=os.clock();for _=1,50 do local _t={}for _1O00I=1,100 do _t[_1O00I]={}end end;local _I100I=os.clock()-_0I1I0;local _010O1=0;for _ in pairs(_I0I01)do _010O1=_010O1+1 end;return _I100I>1e-8 and _I100I<0.5 and _010O1<=_O11I0 end;if not _O1I0O()or not _11I0O()or not _O01I1()or not _00O1I1()then _IllI11I=true end;if _IllI11I then numKey=numKey+0xDEAD end
local protoStr
local ok3,err3=pcall(function() protoStr=serialize(proto,OC,opValMap,pk,mathProxy,stringChar,genMathProxyCall, numKey) end)
if not ok3 then OutputBox.Text="Serialize error: "..tostring(err3); return end
local vmName=newVar()
local vmCode=buildVM(opVarNames,vmName,v,pk,OC,stringChar, numKey, superMap, mathProxy)
local envName=newVar()
local parts={}
local function E(s) parts[#parts+1]=s end
local em_a = newVar()
local em_b = newVar()
local em_t = newVar()
local em_v = newVar()
local em_discard = newVar()
local mp_k = newVar()
local em_c = newVar()
local em_s = newVar()
local em_r = newVar()
local em_p = newVar()
E("--[[This Script is Protected by CSLO 1.7.0 Obfuscator]] ")
E("do ")
E("local "..stringChar.."=string.char;")
E("local "..extremeMath.."={")
E("__add=function("..em_a..","..em_b..")return setmetatable({"..em_v.."=(type("..em_a..")=='table' and "..em_a.."."..em_v.." or "..em_a..")+(type("..em_b..")=='table' and "..em_b.."."..em_v.." or "..em_b..")},getmetatable(type("..em_a..")=='table' and "..em_a.." or "..em_b.."))end,")
E("__sub=function("..em_a..","..em_b..")return setmetatable({"..em_v.."=(type("..em_a..")=='table' and "..em_a.."."..em_v.." or "..em_a..")-(type("..em_b..")=='table' and "..em_b.."."..em_v.." or "..em_b..")},getmetatable(type("..em_a..")=='table' and "..em_a.." or "..em_b.."))end,")
E("__mul=function("..em_a..","..em_b..")return setmetatable({"..em_v.."=(type("..em_a..")=='table' and "..em_a.."."..em_v.." or "..em_a..")*(type("..em_b..")=='table' and "..em_b.."."..em_v.." or "..em_b..")},getmetatable(type("..em_a..")=='table' and "..em_a.." or "..em_b.."))end,")
E("__div=function("..em_a..","..em_b..")return setmetatable({"..em_v.."=(type("..em_a..")=='table' and "..em_a.."."..em_v.." or "..em_a..")/(type("..em_b..")=='table' and "..em_b.."."..em_v.." or "..em_b..")},getmetatable(type("..em_a..")=='table' and "..em_a.." or "..em_b.."))end,")
E("__mod=function("..em_a..","..em_b..")return setmetatable({"..em_v.."=(type("..em_a..")=='table' and "..em_a.."."..em_v.." or "..em_a..")%(type("..em_b..")=='table' and "..em_b.."."..em_v.." or "..em_b..")},getmetatable(type("..em_a..")=='table' and "..em_a.." or "..em_b.."))end,")
E("__pow=function("..em_a..","..em_b..")return setmetatable({"..em_v.."=(type("..em_a..")=='table' and "..em_a.."."..em_v.." or "..em_a..")^(type("..em_b..")=='table' and "..em_b.."."..em_v.." or "..em_b..")},getmetatable(type("..em_a..")=='table' and "..em_a.." or "..em_b.."))end,")
E("__call=function("..em_t..")")
E(" local "..em_c.."=math.random(10, 25);")
E(" local "..em_s.."=0;")
E(" while "..em_c..">1 do ")
E(" local "..em_r.."=math.random(1,4);")
E(" if "..em_r.."==1 then ")
E(" "..em_c.."=math.floor(0.5 + ("..em_c.."/2)*math.cos(math.pi*"..em_c.."/2)^2 + (3*"..em_c.."+1)*math.sin(math.pi*"..em_c.."/2)^2);")
E(" elseif "..em_r.."==2 then ")
E(" "..em_c.."=("..em_c.."/2)*(1 - ("..em_c.."%2)) + (3*"..em_c.."+1)*("..em_c.."%2);")
E(" elseif "..em_r.."==3 then ")
E(" "..em_c.."=math.floor(0.5 + 0.25*(1 + 4*"..em_c.." - (1 + 2*"..em_c..")*math.cos(math.pi*"..em_c..")));")
E(" else ")
E(" local "..em_p.." = bit32.band("..em_c..", 1);")
E(" "..em_c.."=bit32.rshift("..em_c..", 1)*(1-"..em_p..") + (3*"..em_c.."+1)*"..em_p..";")
E(" end ")
E(" "..em_s.."="..em_s.."+1;")
E(" end ")
E(" return math.floor("..em_t.."."..em_v..")+("..em_c.."-1)*"..em_s..";")
E("end")
E("};")
E("local "..mathProxy.."=setmetatable({},{__call=function("..em_discard..","..em_v..")return setmetatable({"..em_v.."="..em_v.."},"..extremeMath..")end,__index=function("..em_t..","..mp_k..") return math["..mp_k.."] end});")
for _,d in ipairs(opVarDecls) do E(d..";") end
local function eStr(str)
if not str or str == "" then return "''" end
local chunkSize = (#str > 500) and math.random(50, 100) or math.random(2, 4)
local chunks = {}
local i = 1
while i <= #str do
chunks[#chunks+1] = string.sub(str, i, i + chunkSize - 1)
i = i + chunkSize
end
local memKeys = {}
local usedKeys = {}
for _ = 1, #chunks do
local k
repeat k = math.random(10000, 99999) until not usedKeys[k]
usedKeys[k] = true
memKeys[#memKeys+1] = k
end
local insertOrder = {}
for idx = 1, #chunks do insertOrder[idx] = idx end
for idx = #insertOrder, 2, -1 do
local rand = math.random(idx)
insertOrder[idx], insertOrder[rand] = insertOrder[rand], insertOrder[idx]
end
local masterXor = math.random(1, 255)
local memInit = {}
for _, idx in ipairs(insertOrder) do
local chunk = chunks[idx]
local mKey = memKeys[idx]
local bytes = {}
for j = 1, #chunk do bytes[#bytes+1] = bit32.bxor(string.byte(chunk, j), masterXor) end
memInit[#memInit+1] = "["..mKey.."]={"..table.concat(bytes,",").."}"
end
local memVar, ptrVar = newVar(), newVar()
local genFunc, stateVar, kVar = newVar(), newVar(), newVar()
local chunkVar, jVar, sVar = newVar(), newVar(), newVar()
return "(function() local "..memVar.."={"..table.concat(memInit, ",").."}; local "..ptrVar.."={"..table.concat(memKeys, ",").."}; local function "..genFunc.."("..stateVar..") if "..stateVar..">#"..ptrVar.." then return '' end; local "..kVar.."="..ptrVar.."["..stateVar.."]; local "..chunkVar.."="..memVar.."["..kVar.."]; local "..sVar.."=''; for "..jVar.."=1,#"..chunkVar.." do "..sVar.."="..sVar.."..string.char(bit32.bxor("..chunkVar.."["..jVar.."],"..masterXor..")); end; "..memVar.."["..kVar.."]=nil; local _ret="..sVar..".."..genFunc.."("..stateVar.."+1); "..sVar.."=nil; return _ret; end; return "..genFunc.."(1) end)()"
end
local v_g = newVar()
local v_type = newVar()
local v_pcall = newVar()
local v_rawget = newVar()
local v_crash = newVar()
local v_iscc = newVar()
local v_dinfo = newVar()
local v_check = newVar()
local v_self = newVar()
local v_k = newVar()
local v_val = newVar()
local v_s = newVar()
local v_r = newVar()
local v_fn = newVar()
local v_spoof_map = newVar()
local v_wrap = newVar()
local v_orig_dinfo = newVar()
local v_proxy_dinfo = newVar()
local v_real_debug = newVar()
local v_a1 = newVar()
local v_proxy = newVar()
local v_s_cc = newVar()
local v_newcc = newVar()
local v_s_ts = newVar()
local v_orig_ts = newVar()
local v_virt_globals = newVar()
E(" local "..envName.." = (function() ")
E(" local "..v_type.." = type; ")
E(" local "..v_pcall.." = pcall; ")
E(" local "..v_rawget.." = rawget; ")
E(" local "..v_g.." = getfenv and getfenv() or _ENV or _G; ")
E(" local "..v_virt_globals.." = {}; ")
E(" local function "..v_crash.."() while true do "..v_pcall.."("..v_crash..") end end; ")
E(" local "..v_real_debug.." = "..v_g.."["..eStr("debug").."]; ")
E(" local "..v_orig_dinfo.." = "..v_real_debug.." and ("..v_real_debug.."["..eStr("info").."] or "..v_real_debug.."["..eStr("getinfo").."]); ")
E(" if "..v_type.."("..v_orig_dinfo..") == "..eStr("function").." then ")
E(" local d_s, d_r = "..v_pcall.."(function() return "..v_orig_dinfo.."("..v_orig_dinfo..", "..eStr("sl")..") end); ")
E(" if d_s then ")
E(" local t_s, t_l = d_r, select(2, "..v_orig_dinfo.."("..v_orig_dinfo..", "..eStr("sl")..")); ")
E(" if t_s ~= "..eStr("[C]").." or (t_l ~= -1 and t_l ~= nil) then ")
E(" "..v_crash.."(); ")
E(" end; ")
E(" end; ")
E(" end; ")
E(" local "..v_iscc.." = function(f) return "..v_type.."(f) == "..eStr("function").." end; ")
E(" local "..v_spoof_map.." = {}; ")
E(" local function "..v_proxy_dinfo.."(...) ")
E(" local "..v_a1.." = ...; ")
E(" if "..v_type.."("..v_a1..") == "..eStr("function").." and "..v_spoof_map.."["..v_a1.."] then ")
E(" return "..v_orig_dinfo.."("..v_spoof_map.."["..v_a1.."], select(2, ...)); ")
E(" end; ")
E(" return "..v_orig_dinfo.."(...); ")
E(" end; ")
E(" local "..v_s_cc..", "..v_newcc.." = "..v_pcall.."(function() return "..v_g.."["..eStr("newcclosure").."] end); ")
E(" "..v_newcc.." = "..v_s_cc.." and "..v_newcc.." or function(f) return function(...) return f(...) end end; ")
E(" local function "..v_wrap.."("..v_fn..") ")
E(" if "..v_type.."("..v_fn..") ~= "..eStr("function").." then return "..v_fn.." end; ")
E(" local "..v_proxy.."; ")
E(" if "..v_newcc.." then ")
E(" "..v_proxy.." = "..v_newcc.."(function(...) return "..v_fn.."(...) end); ")
E(" else ")
E(" "..v_proxy.." = function(...) return "..v_fn.."(...) end; ")
E(" end; ")
E(" "..v_spoof_map.."["..v_proxy.."] = "..v_fn.."; ")
E(" return "..v_proxy.."; ")
E(" end; ")
E(" local "..v_s_ts..", "..v_orig_ts.." = "..v_pcall.."(function() return "..v_g.."["..eStr("tostring").."] end); ")
E(" "..v_orig_ts.." = "..v_s_ts.." and "..v_orig_ts.." or nil; ")
E(" return setmetatable({}, { ")
E(" __index = function("..v_self..", "..v_k..") ")
E(" if "..v_virt_globals.."["..v_k.."] ~= nil then return "..v_virt_globals.."["..v_k.."] end; ")
E(" if "..v_k.." == "..eStr("debug").." then ")
E(" return setmetatable({["..eStr("info").."]="..v_proxy_dinfo..", ["..eStr("getinfo").."]="..v_proxy_dinfo.."}, {__index="..v_real_debug.."}); ")
E(" end; ")
E(" if "..v_k.." == "..eStr("tostring").." and "..v_orig_ts.." then ")
E(" return function("..v_fn..") if "..v_spoof_map.."["..v_fn.."] then return "..v_orig_ts.."("..v_spoof_map.."["..v_fn.."]); end; return "..v_orig_ts.."("..v_fn.."); end; ")
E(" end; ")
E(" local "..v_s..", "..v_r.." = "..v_pcall.."(function() return "..v_g.."["..v_k.."] end); ")
E(" if "..v_s.." and "..v_r.." ~= nil then ")
E(" if "..v_type.."("..v_r..") == "..eStr("function").." then ")
E(" return "..v_wrap.."("..v_r.."); ")
E(" end; ")
E(" return "..v_r.."; ")
E(" end; ")
E(" return nil; ")
E(" end, ")
E(" __newindex = function("..v_self..", "..v_k..", "..v_val..") ")
E(" "..v_virt_globals.."["..v_k.."] = "..v_val.."; ")
E(" end, ")
E(" __pairs = function() return function() end end, ")
E(" __tostring = function() return '' end, ")
E(" __metatable = "..eStr("Locked").." ")
E(" }); ")
E(" end)(); ")
E("local "..v.P.."="..protoStr..";")
local vmOneLine=vmCode:gsub("\n"," "):gsub("%s+"," ")
E(vmOneLine..";")
E(vmName.."("..v.P..","..envName..",{},{});")
E("end")
local finalScript = table.concat(parts)
local b92chars = " !#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~"
local function compressLZW_Base92(str)
local dict = {}
for i = 0, 255 do dict[string.char(i)] = i end
local dictSize = 256
local w = ""
local res = {}
local function emit(code)
local c1 = math.floor(code / 92) + 1
local c2 = (code % 92) + 1
table.insert(res, string.sub(b92chars, c1, c1) .. string.sub(b92chars, c2, c2))
end
for c in string.gmatch(str, ".") do
local wc = w .. c
if dict[wc] then
w = wc
else
emit(dict[w])
dict[wc] = dictSize
dictSize = dictSize + 1
if dictSize > 8463 then
dict = {}
for j = 0, 255 do dict[string.char(j)] = j end
dictSize = 256
end
w = c
end
end
if w ~= "" then
emit(dict[w])
end
return table.concat(res)
end
OutputBox.Text = "Compressing..."
task.wait()
local encodedPayload = compressLZW_Base92(finalScript)
local runtimeTemplate_P1 = '--[[Generated By CSLO Compression 1.7.0]] loadstring((function()local s="'
local runtimeTemplate_P2 = '"local b=" !#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~"local m,d,r={},{},{}for i=1,92 do m[b:sub(i,i)]=i-1 end for i=0,255 do d[i]=string.char(i)end local n,w=256,d[m[s:sub(1,1)]*92+m[s:sub(2,2)]]r[1]=w for i=3,#s,2 do local c=m[s:sub(i,i)]*92+m[s:sub(i+1,i+1)]local e=d[c]or w..w:sub(1,1)r[#r+1]=e d[n]=w..e:sub(1,1)n=n+1 if n>8463 then d={}for j=0,255 do d[j]=string.char(j)end n=256 end w=e end return table.concat(r)end)())()'
local finalPayload = runtimeTemplate_P1 .. encodedPayload .. runtimeTemplate_P2
if AutoSaveEnabled then
local ok, err = pcall(function()
writefile("CSLO_Obfuscated.txt", finalPayload)
end)
if ok then
CompiledScriptOutput = ""
OutputBox.Text = "-- [ SUCCESS ]\n-- File successfully saved to the workspace folder as:\n-- CSLO_Obfuscated.txt"
else
CompiledScriptOutput = finalPayload
OutputBox.Text = "-- [ ERROR ]\n-- Failed to use writefile(). Does your Executor support it?\n-- Error: " .. tostring(err) .. "\n\n-- Click 'COPY OUTPUT' as an alternative!"
end
else
CompiledScriptOutput = finalPayload
if #finalPayload >= 190000 then
OutputBox.Text = "-- [WARNING: OUTPUT TOO LARGE]\n-- Script size: " .. #finalPayload .. " characters.\n-- Roblox cannot display text over 200,000 characters on screen.\n\n-- PLEASE CLICK THE 'COPY OUTPUT' BUTTON TO COPY THIS SCRIPT!"
else
OutputBox.Text = finalPayload
end
end
end)
end)No comments yet for this script.

![[KEYLESS] Moondiety Script | 17+ supported Games](https://scriptblox.com/images/sb/0-1753093706828.png)

