From ca3f7c81d2b2bc151251cd9fa96934d5aa772d78 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sat, 31 Jan 2026 14:40:29 +0000 Subject: [PATCH] 15:40 --- core/__pycache__/obfuscator.cpython-311.pyc | Bin 22415 -> 22734 bytes core/obfuscator.py | 124 +++++++++++--------- 2 files changed, 66 insertions(+), 58 deletions(-) diff --git a/core/__pycache__/obfuscator.cpython-311.pyc b/core/__pycache__/obfuscator.cpython-311.pyc index fc7c4f16ff8fbd19725620d7788b38658b766986..64053a7b1b399c6f18b9399bb183401010383ca7 100644 GIT binary patch delta 7531 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 MA#jg2d^>dWKdEN-B>(^b delta 7350 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 lc}gt1Uc+CH8j%_s$J`x 2 or (depth > 0 and random.random() < 0.2): return str(n) - r = random.randint(1, 1000000) + r = random.randint(1, 100000) choice = random.choice(['add', 'sub', 'xor']) if choice == 'add': @@ -82,7 +81,7 @@ class LuauVMObfuscator: packed = [ inst[0] & 0xFF, (inst[0] >> 8) & 0xFF, - inst[1], inst[2], inst[3], + inst[1] & 0xFF, inst[2] & 0xFF, inst[3] & 0xFF, next_shuffled & 0xFF, (next_shuffled >> 8) & 0xFF ] final_insts[i] = packed @@ -103,48 +102,52 @@ class LuauVMObfuscator: consts_json = json.dumps(encrypted_consts) start_idx = pos_map[0] - V_LUA_ENV = self.get_var("lua_env") - V_BIT = self.get_var("bit32") - V_B64 = self.get_var("b64_alpha") - V_D = self.get_var("decode") - V_INST = self.get_var("inst_raw") + V_ENV = self.get_var("env") + V_BIT = self.get_var("bit") + V_B64 = self.get_var("b64") + V_DEC = self.get_var("dec") + V_INST = self.get_var("inst") V_CONSTS = self.get_var("consts") V_SALT = self.get_var("salt") - V_EXEC = self.get_var("execute") - V_REGS = self.get_var("registers") - V_CURR = self.get_var("current") - V_RUN = self.get_var("running") - V_GETC = self.get_var("get_const") + V_EXEC = self.get_var("exec") + V_REGS = self.get_var("regs") + V_CURR = self.get_var("curr") + V_RUN = self.get_var("run") + V_GETC = self.get_var("getc") V_PTR = self.get_var("ptr") V_OP = self.get_var("op") V_A = self.get_var("a") V_B = self.get_var("b") V_C = self.get_var("c") + V_UNP = self.get_var("unp") + V_SPW = self.get_var("spw") + V_RAW = self.get_var("raw") V_KEY = self.get_var("key") V_RES = self.get_var("res") - V_LAST = self.get_var("last") - V_UNPACK = self.get_var("unpack") - V_SPAWN = self.get_var("spawn") + V_LST = self.get_var("lst") - vm_lua = f"""local {V_LUA_ENV}=getfenv() -local {V_BIT}=bit32 -local {V_UNPACK}=unpack or table.unpack -local {V_SPAWN}=task and task.spawn or spawn + vm_lua = f"""local {V_BIT}=bit32 +local {V_ENV}=setmetatable({{}},{{__index=getfenv()}}) +local {V_UNP}=unpack or table.unpack +local {V_SPW}=task and task.spawn or spawn local {V_B64}='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' -local {V_D}=function(data) +local {V_DEC}=function(data) data=data:gsub('[^'..{V_B64}..'=]','') - return(data:gsub('.',function(x) - if(x=='=')then return''end - local r,f='',({V_B64}:find(x)-1) - for i=6,1,-1 do r=r..(f%2^i-f%2^(i-1)>0 and'1'or'0')end - return r; - end):gsub('%d%d%d%d%d%d%d%d',function(x) - local r=0 - for i=1,8 do r=r+(x:sub(i,i)=='1'and 2^(8-i)or 0)end - return string.char(r) - end)) + local res,bits={{}},'' + for i=1,#data do + local c=data:sub(i,i) + if c=='=' then break end + local f={V_B64}:find(c)-1 + for j=5,0,-1 do bits=bits..({V_BIT}.extract(f,j,1)) end + end + for i=1,#bits-7,8 do + local b=0 + for j=1,8 do b=b+(bits:sub(i+j-1,i+j-1)=='1' and 2^(8-j) or 0) end + res[#res+1]=string.char(b) + end + return table.concat(res) end -local {V_INST}={V_D}('{inst_b64}') +local {V_INST}={V_DEC}('{inst_b64}') local {V_CONSTS}=game:GetService("HttpService"):JSONDecode([=[{consts_json}]=]) local {V_SALT}={self.to_expr(salt, V_BIT)} local function {V_EXEC}() @@ -152,19 +155,20 @@ local function {V_EXEC}() local {V_CURR}={self.to_expr(start_idx, V_BIT)} local {V_RUN}=true local function {V_GETC}(idx) + if not idx then return nil end local c={V_CONSTS}[idx+1] if not c then return nil end if c.t=={self.to_expr(1, V_BIT)} then - local raw={V_D}(c.v) + local {V_RAW}={V_DEC}(c.v) local {V_KEY}=(idx*{self.to_expr(149, V_BIT)}+{V_SALT})%256 local {V_RES}={{}} - local {V_LAST}={V_KEY}%256 - for i=1,#raw do - local k=({V_KEY}+i+{V_LAST}-1)%256 - local b=string.byte(raw,i) - local char_code={V_BIT}.bxor(b,k) - {V_RES}[i]=string.char(char_code) - {V_LAST}=char_code + local {V_LST}={V_KEY}%256 + for i=1,#{V_RAW} do + local k=({V_KEY}+i+{V_LST}-1)%256 + local b=string.byte({V_RAW},i) + local char={V_BIT}.bxor(b,k) + {V_RES}[i]=string.char(char) + {V_LST}=char end return table.concat({V_RES}) end @@ -172,36 +176,40 @@ local function {V_EXEC}() end while {V_RUN} do local {V_PTR}={V_CURR}*7+1 - local op_l=string.byte({V_INST},{V_PTR}) - local op_h=string.byte({V_INST},{V_PTR}+1) - local {V_A}=string.byte({V_INST},{V_PTR}+2) - local {V_B}=string.byte({V_INST},{V_PTR}+3) - local {V_C}=string.byte({V_INST},{V_PTR}+4) - local next_l=string.byte({V_INST},{V_PTR}+5) - local next_h=string.byte({V_INST},{V_PTR}+6) - {V_CURR}=next_l+(next_h*256) - local op_raw=op_l+(op_h*256) - local {V_OP}=({V_BIT}.bxor(op_raw,{self.to_expr(self.k2, V_BIT)})-{self.to_expr(self.k1, V_BIT)})-{self.to_expr(self.k3, V_BIT)} + local op_l=string.byte({V_INST},{V_PTR}) or 0 + local op_h=string.byte({V_INST},{V_PTR}+1) or 0 + local {V_A}=string.byte({V_INST},{V_PTR}+2) or 0 + local {V_B}=string.byte({V_INST},{V_PTR}+3) or 0 + local {V_C}=string.byte({V_INST},{V_PTR}+4) or 0 + local n_l=string.byte({V_INST},{V_PTR}+5) or 0 + local n_h=string.byte({V_INST},{V_PTR}+6) or 0 + {V_CURR}=n_l+({V_BIT}.lshift(n_h,8)) + local op_raw=op_l+({V_BIT}.lshift(op_h,8)) + local {V_OP}={V_BIT}.bxor(op_raw,{self.to_expr(self.k2, V_BIT)})-{self.to_expr(self.k1, V_BIT)} if {V_OP}=={self.opcodes.index('MOVE')} then {V_REGS}[{V_A}]={V_REGS}[{V_B}] elseif {V_OP}=={self.opcodes.index('LOADK')} then {V_REGS}[{V_A}]={V_GETC}({V_B}) elseif {V_OP}=={self.opcodes.index('GETGLOBAL')} then - {V_REGS}[{V_A}]={V_LUA_ENV}[{V_GETC}({V_B})] + local n={V_GETC}({V_B}) + if n then {V_REGS}[{V_A}]={V_ENV}[n] end elseif {V_OP}=={self.opcodes.index('SETGLOBAL')} then - {V_LUA_ENV}[{V_GETC}({V_B})]={V_REGS}[{V_A}] + local n={V_GETC}({V_B}) + if n then {V_ENV}[n]={V_REGS}[{V_A}] end elseif {V_OP}=={self.opcodes.index('CALL')} then local f={V_REGS}[{V_A}] - local args={{}} - if {V_B}>1 then for i=1,{V_B}-1 do args[i]={V_REGS}[{V_A}+i] end end - local res={{f({V_UNPACK}(args))}} - if {V_C}>1 then for i=1,{V_C}-1 do {V_REGS}[{V_A}+i-1]=res[i] end end + if f then + local args={{}} + if {V_B}>1 then for i=1,{V_B}-1 do args[i]={V_REGS}[{V_A}+i] end end + local res={{f({V_UNP}(args))}} + if {V_C}>1 then for i=1,{V_C}-1 do {V_REGS}[{V_A}+i-1]=res[i] end end + end elseif {V_OP}=={self.opcodes.index('RETURN')} then {V_RUN}=false end end end -{V_SPAWN}({V_EXEC})""" +{V_SPW}({V_EXEC})""" return self.minify(vm_lua) def compile_to_bytecode(self, ast):