From f329f2c77a8fe59dedef88178314b02e4b4d8041 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sat, 31 Jan 2026 14:27:32 +0000 Subject: [PATCH] 15:27 --- core/__pycache__/obfuscator.cpython-311.pyc | Bin 21789 -> 22415 bytes core/obfuscator.py | 57 ++++++++++---------- 2 files changed, 29 insertions(+), 28 deletions(-) diff --git a/core/__pycache__/obfuscator.cpython-311.pyc b/core/__pycache__/obfuscator.cpython-311.pyc index b76d8c67ae918227a2a23bbe27df3baac1643e23..fc7c4f16ff8fbd19725620d7788b38658b766986 100644 GIT binary patch delta 8765 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 diff --git a/core/obfuscator.py b/core/obfuscator.py index 316a9dc..717d755 100644 --- a/core/obfuscator.py +++ b/core/obfuscator.py @@ -16,19 +16,19 @@ class LuauVMObfuscator: "FORLOOP", "FORPREP", "TFORLOOP", "SETLIST", "CLOSE", "CLOSURE", "VARARG" ] - self.k1 = random.randint(100, 500) - self.k2 = random.randint(100, 500) - self.k3 = random.randint(100, 500) + self.k1 = random.randint(1000, 5000) + self.k2 = random.randint(1000, 5000) + self.k3 = random.randint(1000, 5000) - self.op_to_id = {name: (((self.opcodes.index(name) + self.k1) ^ self.k2) + self.k3) % 4096 for name in self.opcodes} + self.op_to_id = {name: (((self.opcodes.index(name) + self.k1) ^ self.k2) + self.k3) % 65536 for name in self.opcodes} self.var_map = {} self.used_vars = set() def get_var(self, hint="var"): if hint in self.var_map: return self.var_map[hint] - chars = "lI" - length = random.randint(8, 16) # Shorter vars for single-line efficiency + chars = "lI1" + length = random.randint(32, 48) new_var = "_" + "".join(random.choice(chars) for _ in range(length)) while new_var in self.used_vars: new_var = "_" + "".join(random.choice(chars) for _ in range(length)) @@ -36,19 +36,19 @@ class LuauVMObfuscator: self.var_map[hint] = new_var return new_var - def to_expr(self, n, depth=0): - if depth > 1 or (depth > 0 and random.random() < 0.5): + def to_expr(self, n, bit32_var="bit32", depth=0): + if depth > 2 or (depth > 0 and random.random() < 0.2): return str(n) - r = random.randint(1, 50) + r = random.randint(1, 1000000) choice = random.choice(['add', 'sub', 'xor']) if choice == 'add': - return f"({self.to_expr(n - r, depth + 1)} + {self.to_expr(r, depth + 1)})" + return f"({self.to_expr(n - r, bit32_var, depth + 1)} + {self.to_expr(r, bit32_var, depth + 1)})" elif choice == 'sub': - return f"({self.to_expr(n + r, depth + 1)} - {self.to_expr(r, depth + 1)})" + return f"({self.to_expr(n + r, bit32_var, depth + 1)} - {self.to_expr(r, bit32_var, depth + 1)})" elif choice == 'xor': - return f"bit32.bxor({self.to_expr(n ^ r, depth + 1)}, {self.to_expr(r, depth + 1)})" + return f"{bit32_var}.bxor({self.to_expr(n ^ r, bit32_var, depth + 1)}, {self.to_expr(r, bit32_var, depth + 1)})" return str(n) @@ -62,18 +62,14 @@ class LuauVMObfuscator: return "".join(res) def minify(self, code): - # Remove comments (though we don't add them, just in case) code = re.sub(r'--.*', '', code) - # Replace multiple spaces with single space code = re.sub(r'\s+', ' ', code) - # Remove spaces around operators and delimiters where safe for op in ['==', '~=', '<=', '>=', '=', r'\+', '-', r'\*', '/', '>', '<', r'\(', r'\)', r'\{', r'\}', r'\[', r'\]', ',', ';', ':']: code = re.sub(r'\s*' + op + r'\s*', op.replace('\\', ''), code) return code.strip() def generate_vm_source(self, bytecode): raw_instructions = bytecode['instructions'] - shuffled = [] indices = list(range(len(raw_instructions))) random.shuffle(indices) @@ -95,7 +91,7 @@ class LuauVMObfuscator: inst_b64 = base64.b64encode(inst_str.encode('latin-1')).decode() encrypted_consts = [] - salt = random.randint(1000, 9999) + salt = random.randint(100000, 999999) for i, c in enumerate(bytecode['constants']): if c['type'] == 'string': key = (i * 149 + salt) % 256 @@ -109,7 +105,7 @@ class LuauVMObfuscator: V_LUA_ENV = self.get_var("lua_env") V_BIT = self.get_var("bit32") - V_B64 = self.get_var("b64") + V_B64 = self.get_var("b64_alpha") V_D = self.get_var("decode") V_INST = self.get_var("inst_raw") V_CONSTS = self.get_var("consts") @@ -127,12 +123,16 @@ class LuauVMObfuscator: 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") 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 local {V_B64}='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' local {V_D}=function(data) - data=string.gsub(data,'[^'..{V_B64}..'=]') + data=data:gsub('[^'..{V_B64}..'=]','') return(data:gsub('.',function(x) if(x=='=')then return''end local r,f='',({V_B64}:find(x)-1) @@ -145,18 +145,18 @@ local {V_D}=function(data) end)) end local {V_INST}={V_D}('{inst_b64}') -local {V_CONSTS}=game:GetService("HttpService"):JSONDecode('{consts_json}') -local {V_SALT}={self.to_expr(salt)} +local {V_CONSTS}=game:GetService("HttpService"):JSONDecode([=[{consts_json}]=]) +local {V_SALT}={self.to_expr(salt, V_BIT)} local function {V_EXEC}() local {V_REGS}={{}} - local {V_CURR}={self.to_expr(start_idx)} + local {V_CURR}={self.to_expr(start_idx, V_BIT)} local {V_RUN}=true local function {V_GETC}(idx) local c={V_CONSTS}[idx+1] if not c then return nil end - if c.t=={self.to_expr(1)} then + if c.t=={self.to_expr(1, V_BIT)} then local raw={V_D}(c.v) - local {V_KEY}=(idx*{self.to_expr(149)}+{V_SALT})%256 + 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 @@ -181,7 +181,7 @@ local function {V_EXEC}() 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)})-{self.to_expr(self.k1)})-{self.to_expr(self.k3)} + 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)} if {V_OP}=={self.opcodes.index('MOVE')} then {V_REGS}[{V_A}]={V_REGS}[{V_B}] elseif {V_OP}=={self.opcodes.index('LOADK')} then @@ -194,14 +194,14 @@ local function {V_EXEC}() 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(unpack(args))}} + 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 elseif {V_OP}=={self.opcodes.index('RETURN')} then {V_RUN}=false end end end -task.spawn({V_EXEC})""" +{V_SPAWN}({V_EXEC})""" return self.minify(vm_lua) def compile_to_bytecode(self, ast): @@ -267,7 +267,8 @@ task.spawn({V_EXEC})""" bytecode = self.compile_to_bytecode(ast) return self.generate_vm_source(bytecode) except Exception: - return "-- Obfuscation Error" + import traceback + return f"-- Obfuscation Error: {traceback.format_exc()}" def obfuscate(code): return LuauVMObfuscator().obfuscate(code) \ No newline at end of file