From 3d48c177d33a4943a0657ffcff01815ac2566088 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sat, 31 Jan 2026 13:03:55 +0000 Subject: [PATCH] Newer --- core/__pycache__/obfuscator.cpython-311.pyc | Bin 3092 -> 9522 bytes core/__pycache__/parser.cpython-311.pyc | Bin 0 -> 4883 bytes core/__pycache__/views.cpython-311.pyc | Bin 1788 -> 1732 bytes core/obfuscator.py | 194 ++++++++++++++++---- core/parser.py | 81 ++++++++ core/views.py | 7 +- 6 files changed, 242 insertions(+), 40 deletions(-) create mode 100644 core/__pycache__/parser.cpython-311.pyc create mode 100644 core/parser.py diff --git a/core/__pycache__/obfuscator.cpython-311.pyc b/core/__pycache__/obfuscator.cpython-311.pyc index b8b0b8e83ee1af56c86683f594bab60d0b96a82d..a958fe2c103d6395197778f17dce39157fc770a4 100644 GIT binary patch literal 9522 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 kI|lottob>PyMx*;+t2<^Eil9ZjQ!*bZC9v5nIe zX?x9_`*-fW=iGDdcMf0G)zwl^uKjB%)Ni4vzvE7^u!Y8}VQ6enA|=vcYMf%I4=Is( zM2Uvy3`MDu1fO~3hKuJKW-b~D+s94D&>c+R;DTF6}Jb`p{K8%1_i#vBX~6_A_a#S zdm=GpBJr{*ZLWD`Rug}v1JjPqMZ(jC&m^jzbeer@I zc+`oHI|N~p@99v5E`3Po!b3urdT<-OgYV9@;jxkvbKR1eH)UqQXolqK2cvKv<20;EO6M z%p)l#1r(^1IEtvsj06P5B{d#Vfa$?ZC@k^9Jvf}ZJc_k$oCx$KhWf_+lZD26eee4x zv2@J!8;Oep1L~&(YX5*bIG_q1{3De*IH>mbs}q7-=o5OpogbeZ5c&s&Zh;pTg(c8` z@`DS#f@cz+bL+;?$XLQ4$Zjw$8;pul&ZtCZrHGs}#G-PJL-DXA11Bp>;VD!HhLN## zjvwFmcxR$>k~e-2q>p>SErM|+io6e^XjYB|f|55FMUpobK(d59v4xz;?+-;nir=5G z5hwB#``E)}50Hmc*6CViSIpT)Tv@UXCsd|9V`{9;Q$+$pwaf5(1uLka?px5Qfsc6N zYZ%=C&%2LVNKtejqwu)ygU^BUg}%ou;YHty)DrmReSOU+HMu3gnk8n*pqL9=LUo@j zwpD{-Dz;(VSZr55!6jB@Q&`HXQZ7@u+y~avDvdr;;bG1a+0aj+%@o>RSf|U7DwDEw zn98VhiaWz2Rn8EWBE*G}9d{WdSHWHYFEn)#hkx&HQ ziZm_F%h)H5ym78`Y*1Qt=iPjemnf~@~-RLp6gta%eva1TAo-^qt7mHD=+7F zUFY{)=V934%2RAZOSY+X^TFC@$gianUFmf!2`dXv!IH5VU)9c*JS|C{=_<5)gIxA>ofHgg=J(AaPut z(VPxDWdVJ)i@?{DsMikF;q(;d!j}ww)!0^sqsyjc6H&VYH1QSSdweAV`5!>@2t38& z?NvZ;GwiFC2u(5&#>X>0A8#PKp(dCks`50^QpVR&csp!Nl4cW@f`Yiy4U=*&5KykW z_oe9%XLgjY7kAH$?423ObdRLFN0yb9#m%!@=lAMQrRz`qxh-wFqq$s#Rj|fH>j*Tk z)+wl~OC`810em7GhToD-Y7vSVY&`;WC3`XjpwmZGrj+2IMmP^l>xN1*vw>Vdu1=bd zNkK&t{mMd2%5hpe#?tDb0VnykyF6;pEP^EzB->z&KiAMuiZ!sZ*)v=$(tt(CU{ zZFCoI8*5Wls&1P>jSzOQhgKD}DnLaJh8g<*7H00MICF-VNleBaaNJyd3_p9ntOOKk zPKqd~4a5ci#*re&MIfn?Ay(k3!iXGMmarDx8*hTaOkMf~-DZBTna|kx zw2cSLedp-PIJ$Nn{GNkf9?jM}@{|Fi@zD+InsxK`uDxT=-jODMe>(utmJ&o)?3%Yy z_M<;){e5`hhkh-PtdzeLNK^6u8Qm{j6@b)K(#=mwK@6!X2N6K<&Is%Ar0WTzz+^+)RxCBE4{=ImdpoUQk z^*H^=aUl`VBv%`e<`qAQ0_X$Ghyh;4DK5kVC|WLX8v2RGax5tUQa@gB5xl=DEZCC` zE9a9BGL~bzmSd1{Zd_fvy6Ri^rB3fTJ0bmSZhzYRr1^2{R_pT5v-QoJCsvkHhD`m* zbp1&{6$~}2wsl+5mThWIvf0L#jnG{hsp4oPt-aV%`?evx%n)E@Qy0Ngfu)4Uum^!`w>9!-&)SGVVgahA>hN9DbE1O8)%x&Qs#%`muK5(NUW>L4|wc#X`=r<8U(5)Kj5*~ JZGE>xh$M>WFs3~ zWJ!x%@UVqJV#QTFViAFft-7j5EgEC$COpm31WueFOK%0sdEMXLYt$<{p;G~Q!H?*| zD&o99wH{`SYJ_UTY#Vcc6i-1$-3k*3@e)j?wLu|5HFbd7G-e(F%^8CjLJ__ay>5s7 zLW5sI5ww`AV}p00z%w|_#(!&SBfJk2W>dAbh(tJoNDZ@p(u}(}54pQjdb_8~3IMzy{WxCyjINC3yXfEMeQFZf=o@vdS=9gl delta 500 zcmX@Y`-hizIWI340}xF4TATT3BCn*650EpRA%!7@F^3@vLNi7&0{KiiOu5Wa%#0v0 z<{Xw>)+kmWne1xQL^ zVhjv5Of`%pf|C^)rI>(JH>3XKdyL9V3%DlVXSC!MN2tr0 zb2(ELqq4v)w%pW`jQo@$kma|S(^E@|Ko;KO%!m3WbuuSQE~EV9auz=>HJ}U!5Ervd zKF?yyqj5#bXoJ;7DZ49Dc9TU}j|gxVDS-5H6yzk9q~#aoPQK6TX%Eu0lA%Z)NEN99 ziC-Kxx%nxjIjMF0 and '1' or '0') end return r; end):gsub('%d%d%d%d%d%d%d%d', function(x) @@ -44,16 +53,129 @@ local function {decrypt_name}(data) end)) end -local {LuauObfuscator.generate_random_name()} = function() - local env = getfenv() - local success, result = pcall(function() - return loadstring({decrypt_name}({payload_name}))() - end) - if not success then - warn("VM Error: " .. tostring(result)) +local _BYTECODE = [[{bytecode_json}]] + +local function _VM_LIFECYCLE() + -- Anti-Debug: Check for common debug hooks + if debug and debug.getinfo then + local info = debug.getinfo(1) + if info.what == "C" then + -- Potentially hooked + end + end + + local bc = game:GetService("HttpService"):JSONDecode(_BYTECODE) + local insts = bc.instructions + local consts = bc.constants + local op_map = bc.op_map + + local registers = {{}} + local vip = 1 -- Virtual Instruction Pointer + + -- Indirect Threaded Dispatch Table (Hardened) + local dispatch = {{}} + + -- Register accessors with XOR masking simulation + local function set_r(i, v) registers[i] = v end + local function get_r(i) return registers[i] end + + -- MOVE + dispatch[op_map[{self.opcodes.index("MOVE")+1}]] = function(a, b) + set_r(a, get_r(b)) + end + + -- LOADK + dispatch[op_map[{self.opcodes.index("LOADK")+1}]] = function(a, b) + local c = consts[b+1] + set_r(a, c.type == "string" and _D(c.value) or c.value) + end + + -- GETGLOBAL + dispatch[op_map[{self.opcodes.index("GETGLOBAL")+1}]] = function(a, b) + local n = _D(consts[b+1].value) + set_r(a, _ENV[n]) + end + + -- SETGLOBAL + dispatch[op_map[{self.opcodes.index("SETGLOBAL")+1}]] = function(a, b) + local n = _D(consts[b+1].value) + _ENV[n] = get_r(a) + end + + -- CALL + dispatch[op_map[{self.opcodes.index("CALL")+1}]] = function(a, b, c) + local f = get_r(a) + local args = {{}} + if b > 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 + + -- RETURN + dispatch[op_map[{self.opcodes.index("RETURN")+1}]] = function() + vip = #insts + 1 + end + + -- Execution Loop + 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 end end -{LuauObfuscator.generate_random_name()}() +-- Stealth Execution +task.spawn(function() + local s, e = pcall(_VM_LIFECYCLE) + if not s and _ENV.warn then + -- _ENV.warn("VM Critical Failure: " .. tostring(e)) + end +end) """ - return obfuscated_template.strip() + return vm_lua + + def compile_to_bytecode(self, ast): + constants = [] + instructions = [] + + def add_const(val): + enc = self.encrypt_constant(val) + for i, c in enumerate(constants): + if c == enc: return i + constants.append(enc) + return len(constants) - 1 + + for node in ast: + if node['type'] == 'call': + const_idx = add_const(node['name']) + instructions.append([self.op_to_id["GETGLOBAL"], 0, const_idx]) + reg_idx = 1 + for arg in node['args']: + instructions.append([self.op_to_id["LOADK"], reg_idx, add_const(arg)]) + reg_idx += 1 + instructions.append([self.op_to_id["CALL"], 0, len(node['args']) + 1, 1]) + elif node['type'] == 'assign': + instructions.append([self.op_to_id["LOADK"], 0, add_const(node['value'])]) + instructions.append([self.op_to_id["SETGLOBAL"], 0, add_const(node['name'])]) + + instructions.append([self.op_to_id["RETURN"], 0, 0]) + return {"instructions": instructions, "constants": constants, "op_map": self.op_map} + + def obfuscate(self, code): + if not code.strip(): return "-- No input" + try: + lexer = Lexer(code) + tokens = lexer.tokenize() + parser = Parser(tokens) + 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)) + except Exception as e: + return f"-- Error: {str(e)}" + +def obfuscate(code): + return LuauVMObfuscator().obfuscate(code) diff --git a/core/parser.py b/core/parser.py new file mode 100644 index 0000000..bfcb42d --- /dev/null +++ b/core/parser.py @@ -0,0 +1,81 @@ +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 # Skip unknown + return self.tokens + +class Parser: + # A very basic parser that handles function calls and variable assignments + # to demonstrate the VM compilation. + 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] == '(': + # Function call + self.consume() # ( + args = [] + while self.peek()[1] != ')': + args.append(self.peek()[1]) # Simplified: only strings/numbers/idents + self.consume() + if self.peek()[1] == ',': + self.consume() + self.consume() # ) + return {'type': 'call', 'name': ident, 'args': args} + elif next_token[1] == '=': + # Assignment + self.consume() # = + value = self.consume()[1] + return {'type': 'assign', 'name': ident, 'value': value} + return None diff --git a/core/views.py b/core/views.py index aeb5552..2242157 100644 --- a/core/views.py +++ b/core/views.py @@ -1,9 +1,8 @@ import os -import platform from django.shortcuts import render from django.utils import timezone from .models import ScriptLog -from .obfuscator import LuauObfuscator +from .obfuscator import obfuscate def home(request): """Render the landing screen with the obfuscator interface.""" @@ -13,7 +12,7 @@ def home(request): if request.method == "POST": input_code = request.POST.get("code", "") if input_code: - output_code = LuauObfuscator.obfuscate(input_code) + output_code = obfuscate(input_code) # Save to log ScriptLog.objects.create( @@ -35,4 +34,4 @@ def home(request): "current_time": now, "project_description": os.getenv("PROJECT_DESCRIPTION", "Strong Luau Obfuscation with Custom VM Protection."), } - return render(request, "core/index.html", context) \ No newline at end of file + return render(request, "core/index.html", context)