From a998fae926f99c7f602e70c892afdd7f118b217f Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sat, 31 Jan 2026 13:48:46 +0000 Subject: [PATCH] 14:48 --- core/__pycache__/obfuscator.cpython-311.pyc | Bin 10103 -> 12057 bytes core/obfuscator.py | 179 +++++++++++--------- fixer.py | 82 --------- test_obfuscator.py | 10 -- 4 files changed, 98 insertions(+), 173 deletions(-) delete mode 100644 fixer.py delete mode 100644 test_obfuscator.py diff --git a/core/__pycache__/obfuscator.cpython-311.pyc b/core/__pycache__/obfuscator.cpython-311.pyc index cea59a10923d75656cdd46f4fbe0e8c9ba7c6d74..a5a306811a9196929842a6e55825e7f584a58605 100644 GIT binary patch literal 12057 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 B4%h$y literal 10103 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 1 then for i=1, b-1 do args[i] = get_r(a+i) end end - local res = {{f(unpack(args))}} - if c > 1 then for i=1, c-1 do set_r(a+i-1, res[i]) end end - end - - dispatch[op_map[{self.opcodes.index("RETURN")+1}]] = function() - vip = #insts + 1 + local function get_const(idx) + local c = _CONSTS[idx + 1] + if not c then return nil end + if c.t == 1 then + local raw = _D(c.v) + local key = (idx * 137 + 42) % 256 + local res = "" + for i=1, #raw do + res = res .. string.char(bit32.bxor(string.byte(raw, i), (key + i - 1) % 256)) + end + return res + end + return c.v end - while vip <= #insts do - local inst = insts[vip] - local f = dispatch[inst[1]] - if f then f(inst[2], inst[3], inst[4]) end - vip = vip + 1 + while running and vip <= #_INST_RAW do + local op_raw = string.byte(_INST_RAW, vip) + local a = string.byte(_INST_RAW, vip + 1) + local b = string.byte(_INST_RAW, vip + 2) + local c = string.byte(_INST_RAW, vip + 3) + vip = vip + 4 + + -- Arithmetic Opcode Decoding + local op = bit32.bxor(op_raw, {self.k2}) - {self.k1} + + if op == {self.opcodes.index('MOVE')} then + registers[a] = registers[b] + elseif op == {self.opcodes.index('LOADK')} then + registers[a] = get_const(b) + elseif op == {self.opcodes.index('GETGLOBAL')} then + registers[a] = _ENV[get_const(b)] + elseif op == {self.opcodes.index('SETGLOBAL')} then + _ENV[get_const(b)] = registers[a] + elseif op == {self.opcodes.index('CALL')} then + local f = registers[a] + local args = {{}} + if b > 1 then for i=1, b-1 do args[i] = registers[a+i] end end + local res = {{f(unpack(args))}} + if c > 1 then for i=1, c-1 do registers[a+i-1] = res[i] end end + elseif op == {self.opcodes.index('RETURN')} then + running = false + end end end -task.spawn(_VM_LIFECYCLE) +task.spawn(_EXECUTE) """ return vm_lua @@ -115,34 +128,38 @@ task.spawn(_VM_LIFECYCLE) next_reg = 0 def add_const(val): - enc = self.encrypt_constant(val) + if isinstance(val, str): + if (val.startswith('"') and val.endswith('"')) or (val.startswith("'" ) and val.endswith("'" )): + val = val[1:-1] + for i, c in enumerate(constants): - if c == enc: return i - constants.append(enc) + if c['value'] == val: return i + + t = 'string' if isinstance(val, str) else 'number' + constants.append({'type': t, 'value': val}) return len(constants) - 1 def load_expr_to_reg(expr, reg): if expr['type'] == 'IDENT': if expr['value'] in locals_map: - instructions.append([self.op_to_id["MOVE"], reg, locals_map[expr['value']]]) + instructions.append([self.op_to_id["MOVE"], reg, locals_map[expr['value']], 0]) else: - instructions.append([self.op_to_id["GETGLOBAL"], reg, add_const(expr['value'])]) + instructions.append([self.op_to_id["GETGLOBAL"], reg, add_const(expr['value']), 0]) elif expr['type'] in ['STRING', 'NUMBER']: - instructions.append([self.op_to_id["LOADK"], reg, add_const(expr['value'])]) + val = expr['value'] + if expr['type'] == 'NUMBER': + try: val = float(val) + except: pass + instructions.append([self.op_to_id["LOADK"], reg, add_const(val), 0]) for node in ast: if node['type'] == 'call': func_reg = next_reg - # func_reg might be used, so we need to be careful if we have many locals - # For this simple obfuscator, we use registers above the current locals - - # Load function if node['name'] in locals_map: - instructions.append([self.op_to_id["MOVE"], func_reg, locals_map[node['name']]]) + instructions.append([self.op_to_id["MOVE"], func_reg, locals_map[node['name']], 0]) else: - instructions.append([self.op_to_id["GETGLOBAL"], func_reg, add_const(node['name'])]) + instructions.append([self.op_to_id["GETGLOBAL"], func_reg, add_const(node['name']), 0]) - # Load args for i, arg_expr in enumerate(node['args']): load_expr_to_reg(arg_expr, func_reg + 1 + i) @@ -156,10 +173,10 @@ task.spawn(_VM_LIFECYCLE) locals_map[node['name']] = val_reg next_reg += 1 else: - instructions.append([self.op_to_id["SETGLOBAL"], val_reg, add_const(node['name'])]) + instructions.append([self.op_to_id["SETGLOBAL"], val_reg, add_const(node['name']), 0]) - instructions.append([self.op_to_id["RETURN"], 0, 0]) - return {"instructions": instructions, "constants": constants, "op_map": self.op_map} + instructions.append([self.op_to_id["RETURN"], 0, 0, 0]) + return {"instructions": instructions, "constants": constants} def obfuscate(self, code): if not code.strip(): return "-- No input" @@ -170,10 +187,10 @@ task.spawn(_VM_LIFECYCLE) ast = parser.parse() if not ast: return "-- VM Parser: No valid structures found." bytecode = self.compile_to_bytecode(ast) - return self.generate_vm_source(json.dumps(bytecode)) + return self.generate_vm_source(bytecode) except Exception as e: import traceback return f"-- Error: {str(e)}\n{traceback.format_exc()}" def obfuscate(code): - return LuauVMObfuscator().obfuscate(code) + return LuauVMObfuscator().obfuscate(code) \ No newline at end of file diff --git a/fixer.py b/fixer.py deleted file mode 100644 index 51caef8..0000000 --- a/fixer.py +++ /dev/null @@ -1,82 +0,0 @@ -# fixer.py -content = """import re - -class Lexer: - def __init__(self, code): - self.code = code - self.tokens = [] - self.pos = 0 - self.rules = [ - ('COMMENT', r'--\[\[.*?\].*?--.*'), - ('STRING', r'\"(?:\\.|[^\"\\])*\"|\'(?:\\.|[^\'\])*\'|\\[\\[.*?\\]\\].*?'), - ('NUMBER', r'\d+\.?\d*'), - ('KEYWORD', r'\b(and|break|do|else|elseif|end|false|for|function|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b'), - ('IDENT', r'[a-zA-Z_][a-zA-Z0-9_]*'), - ('OP', r'==|~=|<=|>=|\.\.\.|\.\.|>>|<<|[\+\-\*/%^#=\<\>\(\)\{\}\[\];:,.\.]'), - ('SPACE', r'\s+') - ] - - def tokenize(self): - while self.pos < len(self.code): - match = None - for name, pattern in self.rules: - regex = re.compile(pattern, re.DOTALL) - match = regex.match(self.code, self.pos) - if match: - if name != 'SPACE' and name != 'COMMENT': - self.tokens.append((name, match.group(0))) - self.pos = match.end() - break - if not match: - self.pos += 1 - return self.tokens - -class Parser: - def __init__(self, tokens): - self.tokens = tokens - self.pos = 0 - - def peek(self): - return self.tokens[self.pos] if self.pos < len(self.tokens) else (None, None) - - def consume(self, expected_type=None): - token = self.peek() - if expected_type and token[0] != expected_type: - return None - self.pos += 1 - return token - - def parse(self): - nodes = [] - while self.pos < len(self.tokens): - node = self.parse_statement() - if node: - nodes.append(node) - else: - self.pos += 1 - return nodes - - def parse_statement(self): - token = self.peek() - if token[0] == 'IDENT': - ident = self.consume()[1] - next_token = self.peek() - if next_token[1] == '(': - self.consume() - args = [] - while self.peek()[1] != ')': - args.append(self.peek()[1]) - self.consume() - if self.peek()[1] == ',': - self.consume() - self.consume() - return {'type': 'call', 'name': ident, 'args': args} - elif next_token[1] == '=': - self.consume() - value = self.consume()[1] - return {'type': 'assign', 'name': ident, 'value': value} - return None -""" -with open("core/parser.py", "w") as f: - f.write(content) - diff --git a/test_obfuscator.py b/test_obfuscator.py deleted file mode 100644 index 832877c..0000000 --- a/test_obfuscator.py +++ /dev/null @@ -1,10 +0,0 @@ -from core.obfuscator import obfuscate - -test_code = """ -local x = 10 -print(x) -print("Hello, Luau!") -""" - -result = obfuscate(test_code) -print(result)