From 7699f45ec46e5c6542a1ed47c19d8c1b3e6d0254 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sat, 31 Jan 2026 14:18:57 +0000 Subject: [PATCH] 15:18 --- core/__pycache__/obfuscator.cpython-311.pyc | Bin 26498 -> 21789 bytes core/obfuscator.py | 261 +++++++------------- 2 files changed, 86 insertions(+), 175 deletions(-) diff --git a/core/__pycache__/obfuscator.cpython-311.pyc b/core/__pycache__/obfuscator.cpython-311.pyc index fce1ba357785025c1df2df58e8fb26895f6b4890..b76d8c67ae918227a2a23bbe27df3baac1643e23 100644 GIT binary patch literal 21789 zcmcJ13v3%nmRL9clqiW5DT(@7)R&@uwmz0^jU-!N|76M5&$eutrqq-~Nv7l`)QGyNP9o%A_V1aZC9hm6AfstTyYaju*@g|u# z0WPnq`6pXzBb#Qky1L%0SFfsGy{_u_s(+f5l|jH!lk<^dvYsIR6S|2UvT)?h97G-w z6hV>8#FTI)r$~G+nUdhEbV`b^vMCw9%BSR%gpw{RZYZaeH&jz9l8_K52}e8_&sPVt(+>k&^N@*zRCnWHaMakhR$0aBzCBT%F3PKg7hEPpqK$t;gLdn^@c4*DEHhFGj zW^T%8^I-@ey+*w7zPCSd1hQ{lqsA|1NqDd?_L~4g&6!kvq385+hRcs3S0nfOeD* zTdH{3xsk~M=)IAi{%S+Eq4Dr(b(~}Szfwc1@7kTN#@Ht*OJTlHphX#gu zMc>G9Uk}`zId`6y3|!zPL*wut;AP_jW8=IMg-{YN>+2aB;#K24r-yJ%F*-0lF*?jE z2S-MSMn=x#$obKM^MDggf{a6_fr`9uXk=`FSE9?r=m4*n>>2GDJ^7k~W^w!;ge5_Y zPy_4X|Hcc!=j0>8L3oMjqwA!X+>pe&CJ--rfGHea@*7D1E((JjQ8DuX3fxBp%cH^f zQK3O_its@B|4{Pa7<3frAha;Zof#E+#?vH zH+;@7`3-@pCk-zu+V(2io{qB>9b84n?)c9yvK9T$WxrOk~H`nPSI8&rTo$u!HNL0SeHNHdAt7t1hWW~j;dXU&6Q+%RwNA(RscqNGgB3Yv)LeUUdmwKhZYg8`+?;U@jOywWH z%%>gkJOrXzH@?1JX(IO|fjN(&c*#zPd!;axRl~ew`SfcQ+`on~P4J|ZPgFZd4IoK= za{_|T$+H9rPcTqC#&yyiRVM_o7>#cvwd^GEh$M*zg-FMLOAdc4p*w&Qub5p}am?Dk zmC|i+OAn$n`RoD=h=`)VW8tm3bKdT>-&v)*J@qMrVczaWV<>LiN03cG&(#RQ55FaT zOTf@C8-jCJ_Y=jFtQ|XRYU508LRx%?r8q(B{!yz>BRxc)LBSB>FRT%9Md@Kkd9Nx~ zAQJIatUS+Dp5MLjlfftFo>sF}N4ct_kdSoZDq56u7vci-1pNU7ylipB;pF9@#pdnw zag-vpQItiFbrUaJ0M*7TmhH}Y_X4kU+Ha#~r_TYN3k?Vp947?br409p$0*iYB`DVm z2tacMGjlfEwmX^3GB|f+Khr!N=W08c@{XX^;FG`96>J{}kbxFfSHtOQe2QRho?r6k z${#D^JMCZEpAG)=8$Z7RX>8dL2cdC@GY+x2Lq26NJI`-;e1OR|!x_vk^!NVx$seDL zZ<1eDKUe&s@oyR-jjcS-L0EF0D>={RpZA>%Nr{~NSpHWk&4cV0s-itrk^cy*s^nCa zjH)tNT7~rC<~XY=3g+a8RUwVE;B34)LSqc8!YKg35P}Kk5|S>$RSI#55T|Pr1{DJ1 z;~NNL(=AH6gj4C9c=ee4j2|NsXhqdB1=G32Y2~^!0W-=qOjPAxC(RtzWnLMjSi;mm z0V=&j0M|m`GZuoPmwMnKh3bjaXJUzeMo=ozoKn#|>M!ME1eBlgj^#tSqO>yqAIjH6 z%ZJC;KJ|y0lxX?cqB;LS{rB&4OU^KjIuHxsywD%7j=x4T5{r}`g$qnT)@FF=ofR72 zz9nltQd7O@Eoq@I0~l@^P4pCsWzIOlE^+TA98KACyc%C5jpxtb~f6RBxpBK>mxX@qt zlUq;Lzxw#e$GiGHb0=f&e5udhyt&oB-R?X08%^$mVSlrKhSijFnsOhBv_~mZ25KIi ztnM(UJM2@u%G7O6+&}I+9@JmlbU*Sw^agr%$gc)=4nJ-F_841mm@7EU=r6*#TlKFR z{zb#Ho6oD6(XoGRVLQgTj&T8mLe0fsmVR^XzSU>_qmsHFF#NRS>yjPY)ADcaPbYRS z{PktF{5V&BoY7y0^I6-kI=}B^&R<~0E-_cGvSU}-zG<#+T7aTZbNx3txtq-!w;tT` zWeHET=!k}LADzJ>1d7B9X8_^(Im9D$&X$k!s={OfyC)iO6_NniRq0M>_l( zW-|nR5?F!NjN0y8yJ4qoZaXhsp($QrTV1s~DPB6eK-1?Dj!JkMk}h7lWWUQxX;}Km zmTfLKPda#VmM527sCCiP5FNq;G28B(rSGn~tuSaD&UsH+%5yOh0j&UBA3^})pRM&t zgV32{8+U!OmxfZmZEI+IC`3rrwK&-5_x1R026YA)1O@)KtpkBpR$Jrii4BYXpeE$L)chFFLk9-u{@?m^qD^!Dlc>_u1|Hw>MoI-UnVrRV+wNd~Zdi z=Dz@Ej}o6O(WxIiStKAeAZ_18B~EObNJ%MKDlR1lDQj7m#LHo9YDt0IVR=(v*^{J~ zCrU|45}!7y($(dWd<6ea_;+`` zCE;=vV2yC8drKaCOLo5{JK+XY=T!^*KZO4}{I9@&`YqY;mi*u?*?}km`c;dJm(X^s zfnhOeUtNZkFfT_kvkH0}tq^$`T5R)@mDTXXF)Uz;8?gGFyXz@P5i9|40`j_UL2!@w zO^)utt<8Bq9cW{7YPpsRuUpe^$;n9zTTJmyzO>>O`zqA`W*#Z z)bv#H&ocgT#%|lQT=q~ucc}jv#p=&;`m?@%Uw<%1|C#5$M^u*3G7QPbo5^fE6C$a& zW#764X{7l6kJl>h=<*9aSrbS9es`eR;v)&!Ru-!5Y%tR+k6_0rIAON8p5awf zvRE1=_rRDg~CU!o9c3>)y233qY)c{9Q}GN`!x^UC#1Z>Cq_RicIFgB41hexZt9 zqIwm{Et=RP>l$}Xq%UBZiS!UYyqZAVaz2s@HONfNpLiEQuT4^p#4*2~1rnH@ATLpQ zfY-xWiMnMyC!uFaDm&IziDiRk`zGAWTCbMMiQ!S&@O<*NS4ruRym)i4p3B8gWgW~E z;mMbJ02O_VidUD!S*|xbkd>MX+DIzWrn&#W+LSUpP8zN7toDiWr%bF_+T1^Nm&WS0 z7?lxkc4Diq>%H=L*jDF>C8lrv8hGd~G4Ulg+-39~>H)0l*56vZq|!YmZU zEK0&G62&Y|!YmfWEJ?yF5ydP`!YmcVJdlKWKoqkq3A0QT)0Bj162&Y}!YmiXtVqJF z5XG!a!mJdtVzPG5ydnoVVXrTYm+c*#k4xSHLz@v-n>5}wn(ZD zV)-~$53vFqYk-&$#~Pz)P0`pvh!tY!p(tK6#IkT&3&e_WtQBJVXj*YJ2N8%fImHIK zHz$#QjNb+{N^tBj#7c3j9byOmAT>i8YDXYv8P0hWVkR6r1~Gx(4v2~H24+5Z9>=UR zIOhj|FSJr8#A{$58tUbbF$)-YB#WVnWaLLrlm! z5QPp#(@sK6sP!p`l}9NHZFm~egx)+8g`Q25HUw#vIPbYM&|yfc5`~Tcv|1E;J`KGK zY0^d^P2hP9VilO)IK+fDn1Gl_@4*ZC+=!f|>4V9Ab0Ui#KHfX0VV|5AqcymMN?**2 z;0E#|vG^->IZf$PkW&~DS0E-TL}dzw<`($JlUG@&&YqA^DryhTV8Mis&nVoPc8 zmLctZ`u|26K9Q^mI>ZSvK_jnhCBJ#Lzz9U<+?2y>Nu&v@_SIot<8Z?Ad2QD1SaG^i zj5=uGy(xkqY)Dt(sX4hWfdv=|hHf=js|fl>fB?&HWTN6Vu7$O^xn(fhI;cCmY=w5r zCoIJ2qk!c(lCla%CMon*$$IOC)wQxl&)VbcRZ+7xdcou>g8*z*xnsh~)^+YQ?8-LV z{3X#e{AwolhWGW~K^D3ng4gJE&1_i zcWsgPS;Bo%h+D~{T(-F#&c+X2RXeW`Udz4y9E!qz zLcIKzZF$WOK13wE*Sp0lm)C4oyYm(=$8W=V=}dbYub}MsWsC~d+)CSSgFO=w2C6RG zvYS^5ZVh%`P21-kF1MX_@ygjXnzn--O-Zjgo$xAw==OE=7QnavHgHVsUgI_ALj zr1p-bu{lO*ZiO~Ey4o9>8ycHU)QXAjqMMp(=c-$-IT}$|>j3QTLniRpFgKf5X!9Yn zCB7J;XcPSbE*Kz|Fz3}&;xBzg!d!M8it;Tm)ZB11%uRjmoetD!js}MXs@!Y_PE5ep z(ME>_ct4bmn{Z}N$v~Wki*z9=k<^+!YH0khWHfZmg9}c_NxOT@PTvBH zdu_!jw|g~wQ(@^iGd42ZkEIzhYQxzg9c1!kfsn=8-jm(+;d=aiX8cWI7wB7iTuO{g zek~}?SQiP*&31XZu0VQy^EA$c%5lt@oGWhAtSL?kOistLDZYmQX|~A?FJMbBS~PQv zQ5ce49%Jon)2&#cF{nq;h4_K@uJsku_#PDV!BWvca+g=MKK}LfN}K#e$t~reP@+*;9YT zF&&|bMJSpv4e|$FQD{Q3@jZaJ4UZGIZD!ft1ZoUiA8S3WF@o{@MkjTUa@s=6cf&C&9OL~y2Bj#NWvoI6P5%VT9m@fH&BJh}C83L;!WRx(OUG9Abk zSD$dU>iV{1JaABPCvoPfu0Na>Er~HreR~YebE-=qRbPv*3w0oxF>thUNV-v5)Yn3o z7Re(4VapOk0&tKJc_fxbk0#opFotLvJzLOgROkUT-l9O%y>CgdR7`hybg{u{Uv}A1 zKJ*rqzJl`UV%$Z5=#`@<*OHnG-u8oa*)rWlSE5)^YLP+(=ej)gvD}CiA>BsLyOM__ zaO2T-Hw)S#G7LT0g5pORkl=gz>K)Tafg~uA7-6vEb$vKjyXFMpwe(fUU@?L{ z5vB|D1-Rj*;BO-s+?C;}Crv>*wng%a8Jo)vGZ8gRN5FuHEJF(6N=pQ5+$Pvmf)y}T^7;w5W6(ehfwTKAh6U4b|)1YYPbX~$PxHj0)ydc zHLr?Hig_hGh~e=9^PJTc7j|^aglDsD8RNTXG&=-uNSHLE=`;NR-DY7Sk5W*e=C@P4 zFsXtc~V*MUm|edszma1y8Y zO^lAB+@llVDLiQf=i@$fdwzVBmrYv1>laA&pa6W0fgXaL9k`5h3}6C7Jy4Va)&nrN zbk#vckZ`=)AsCf&Qx_GU%6FJ(pMkPmzlPV}U|cS)3=DI{t&GYT)aUtBFLU!hU;A>5 zDQ{*=Te#8|wxE?OXk~NTxZF0M@}(;KLH6ctR#nES${1DIE4)VerTV#)tkj`@_Y3W_)9zH~8_t!!Bv2c8%CZNAKx#Z`feY;hx3+!!L%>M9&;oCWjsouIxl zaEjA6g5mIR*E903ul}-+IdzHczs&Vt-aCAmIegiFGH`0==2t^pNized^}6p|NI~fG zHZN=|{Z(7p0Ykv{q+qA#tCFV%)^r$r$1ud;w>>ThR0VE6F$cA!0U4{U3asyvtohjP zI9t;bQp)nPeS@J4;y{(}te@N%_6@(%=RG>|@QARQ*ja)rTXc$pP!AlQf=1F8a){lZ zj(k1x^fX)5%~f@?`s1Ab_zV5uo_;Wb_o}!Q+Vy2l-h+?)RG^>Dv2ZyS!GymM_>eo$ z${N}@LmT+)s{6pkio&ohKS#Tn|KP6w)Lu>%lT#HeF#21!ZU+ooAMNPb{Dw_wu;{>x zqQ?$t13S1p@d5=mSmiQN0orTj`z~4__@Tl`)XF$d3Eu7xs zQ$;Z5SY0)zs|Jj476+@V<#e^Nge6v2$LZ=~2{DW?W0zU2nbVqqk1&l`mM}()Q?O`z z?|c2wk>y-Yxla~hy_L-_AJGNk}1@k`U%2TDg$yG?{Dsp9Bj38xBJ$q5pJh znvfDyYC=+!H5K6%faK{xFtAjaA*BdVMO2tWY7t;IVJr>hhyYE5Dmzpz3e*|)0UAxB zzzRa84ONPetsuHjlcLZn#8I_K)+$ghSbWD>Z3U;T5JjvZbOj-^2$fnwlN+*#0P7I2 zUKE&D7(bpw5gQ1NF4QPOrHRNZ4jmK$9wKs!Ld_z;HX=74k44*7*>+jzun1Z^VJr?E z5dj`0427X%qQLU%pK89=?2NIdX3o^S58~kuM1dWshz~@H=p+n9p)OHiX@w~81W6Q| zLOrBNUI16ui-W;;5k|>?SnffR$Snw+6a$|EurYL63_OI1pA!R*lSm#W#K4mzq0I|j z+y`ttAP&An66NO5WwG1#w1aR3AH{lGw66g)!`m6p(~7;ykMG>d~NoZBvz8^DlT6g)=~ z8QRdiSZ?s!(;7lc`+(tbu^+hM&|h`_Mdz;U=SsHz1Xq7zUt~1gel_&{5OZOIyAYl| z?wjEnIYYjfcI-_%m_;YIc$1x`xoKKF%Q8u1=|VTessrG>!tJ3KhMGM?P2d)5XyOb_ z;^xSIb*9h zI*n`M5~BuSsL6g{sL6g{sEH^T+ytQ}Yhq;sIIboiu*M^t@rXG3EnJh^V$=W(HQ5h* zz`QTG?$EyA)^>659bD17Vypo;O+`h~!TT?}AoQUaH2@cx_61kg>%nJ z6vI=oH!<*!C)mE2_Cib4NW4Q7)6Sl zPw`N8w!Tvd@m{)e39+G0EF;lkp01n(k7F67j&YTk7c9sH*m$m3S4z-UQzdv@W+4An zFZR<<^hyQ4PvblBpBXF9E06cag?fncB9u#Iq_*0FzlD79{TSK9<%E7zVZPy`4{>Fx zlKJ+^0a@ac5%QjwFNgaH!>*QV+nXy8|J)k8i8*s0=wKq~q^LA(#YmvG1JCP{2r z+8ZxvRI=Acf^R+S>;UTDMauVnU?XX_6O5`nJgTHv1Ic6gyhK<7!H%j~2?^V(ALPGtTT3Vf>F2;@RN{2H7rh}RVmU>}v&e+LJ>g>FBCfLFj4 zs~J0OkTIFC-Ub97~0jd4P9JA7fyQC`m65myP44mwr`T_ zo5X3%m1{4q%o5D*l0#g{Ax7K1soGRMUGVh;HF+;I zC3~8ZfbD4|Q`!zEt2x4Hjxd@dXm{D&t?upaKo6_0W;E5Q4`8%S11p1ngOmaK?gMNR zjEOL8cgE^~zKMoKEPX=`573qkSpc%99vh0d2WXrshYz42p^c*xqe#h96&d;x!8?@^ z_h|Q$pnl=|5AmfWsv@zHl4`Dm8crqBK}sy4byVTjDTr5$$!=Ne5~s3~Ac@O_Q+h{w znYc~9Q=Q@-o#8qqsVcF0;BWL~4C8^z%TM}JcZwBk-|?KB{}q($$`OV&>|@&;eBkxp-pi?Ba%#XB z;a6^V1o%r#hBeG` zhFKG|E~cbUu6%r%O; zY-dO2xRE(#!NJrnvW6wju*4XaURE~jj6bdU*;Tf(gRAU7&#WG_r4+)gvztAecY=m0 z#!wZwv~y>-{9Es?jXijrHJsoKCm4Jt3T!)9-LZS>m$T2Sp5OX)13P$;8@$L&U10~W zFw@tVDl4nK&S|eR_zVw~fN@V}VRV*YQ3bY;GFlTDi|3z|K2@^Xqn!3Aqdkg@j7J|H z^`B(*Rh%9y(=y!>89dm&dB*P!3_kX(DosONeC~MeU@l!{rf0cJ z6gzC^hV9J!0#oZ?4U3#%kufa(uU9I=3sv!+s@OmNczWk3SK0;^R^4t7Q_{_Vd}0chO`Q?Cl>T)QLOmljqpr z^qhV#bs{a;my4!S;UoDoLuj6wem0y$MedagT*2%atr}7euRQV53f~(bL}sf=v*t0P zl5iv45_WcWcxebktrpPz@z(?FPK+`KUZ1VpIGSjHBd6j!* z$?kM`>@?z&m#^Zl3BEya7A2?$?##l6E+8{}QKuaxe~j^#g^v&7+%6vcTF^%b>Hmrl z{t|-7a}4R7@Pst-xih<`C`HReVQ9MP3IG96EAe}*YXZH2-jGDCu6t=H1c!*T+h=_P z!MvhJ*B)MD^QyVLYTw|?ykh_0*0t?xzQJIw@lnIWhOMUUCSPArpU-H@{j{GB78JiI zIJj4E@Trt7XyXdne5YV&ywKO}>Faimvideo-^OU#et4M!Du-0p#e$&T!r(I`g>+DR zE+a7M?@{$?h+kA#ApBmF(OV?_zL11)7`(@O01g*43AAMLDytQJC(df+GpyDdE7Tgy zzOB5*YQ4E;TNWVn2|$f=T*97Be}d9bN6@%S{x^#K2nEMbfIg%^BYDLEnx(k@5d`<5 zzmP;LFAEXTph_(-0Ii%5{lDiU!z)~l(n9VHZGD}}%n)fozJ2E!2k;`mkWQ~|}OQ!HmDYV$5cTj*d z5wBdZxfYfkGqe{ay+wfx1!z>oSV-!-x2jG-7P@H?7(f+seF*^w8A%3-tb6#EE|Pf< v|AIvJJ^Tw2>U;PXB+8j|XGk_6BcVUihrh$=zmJCwt4Oj520%)HTjBo#eMqjM literal 26498 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 h%uaViW|fnW`#ZaTz~O&PhW6%?WHVIu3 3 or (depth > 0 and random.random() < 0.15): + if depth > 1 or (depth > 0 and random.random() < 0.5): return str(n) - r = random.randint(1, 2000) - choice = random.choice(['add', 'sub', 'xor', 'mul', 'shl', 'shr', 'not']) + r = random.randint(1, 50) + choice = random.choice(['add', 'sub', 'xor']) if choice == 'add': return f"({self.to_expr(n - r, depth + 1)} + {self.to_expr(r, depth + 1)})" @@ -55,35 +49,9 @@ class LuauVMObfuscator: return f"({self.to_expr(n + r, depth + 1)} - {self.to_expr(r, depth + 1)})" elif choice == 'xor': return f"bit32.bxor({self.to_expr(n ^ r, depth + 1)}, {self.to_expr(r, depth + 1)})" - elif choice == 'mul': - if n != 0 and n % 2 == 0: - return f"({self.to_expr(n // 2, depth + 1)} * {self.to_expr(2, depth + 1)})" - return f"({self.to_expr(n, depth + 1)})" - elif choice == 'shl': - # n = (n >> 1) << 1 + (n & 1) - return f"bit32.bor(bit32.lshift({self.to_expr(n >> 1, depth + 1)}, {self.to_expr(1, depth + 1)}), {self.to_expr(n & 1, depth + 1)})" - elif choice == 'shr': - return f"bit32.rshift({self.to_expr(n << 1, depth + 1)}, {self.to_expr(1, depth + 1)})" - elif choice == 'not': - return f"bit32.bnot(bit32.bnot({self.to_expr(n, depth + 1)}))" return str(n) - def opaque_predicate(self): - v1 = random.randint(100, 1000) - v2 = random.randint(100, 1000) - preds = [ - f"({self.to_expr(v1)} == {self.to_expr(v1)})", - f"({self.to_expr(v1)} + {self.to_expr(v2)} > {self.to_expr(v1)})", - f"(math.floor(math.pi) == {self.to_expr(3)})", - f"(string.len('SUPREME') == {self.to_expr(7)})", - f"(bit32.bor({v1}, {v1}) == {v1})", - f"(bit32.band({v1}, {v1}) == {v1})", - f"(bit32.bxor({v1}, 0) == {v1})", - f"({self.to_expr(v2)} * 0 == 0)" - ] - return random.choice(preds) - def encrypt_string(self, s, key): res = [] last = key % 256 @@ -93,6 +61,16 @@ class LuauVMObfuscator: res.append(chr(ord(c) ^ k)) 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 = [] @@ -104,12 +82,7 @@ class LuauVMObfuscator: final_insts = [None] * len(raw_instructions) for i, orig_idx in enumerate(indices): inst = raw_instructions[orig_idx] - - if orig_idx + 1 < len(raw_instructions): - next_orig = orig_idx + 1 - next_shuffled = pos_map[next_orig] - else: - next_shuffled = 0 + next_shuffled = pos_map[orig_idx + 1] if orig_idx + 1 < len(raw_instructions) else 0 packed = [ inst[0] & 0xFF, (inst[0] >> 8) & 0xFF, @@ -121,11 +94,8 @@ class LuauVMObfuscator: inst_str = "".join(chr(i) for inst in final_insts for i in inst) inst_b64 = base64.b64encode(inst_str.encode('latin-1')).decode() - # Bytecode Checksum for Integrity - checksum = hashlib.md5(inst_str.encode('latin-1')).hexdigest() - encrypted_consts = [] - salt = random.randint(10000, 99999) + salt = random.randint(1000, 9999) for i, c in enumerate(bytecode['constants']): if c['type'] == 'string': key = (i * 149 + salt) % 256 @@ -137,8 +107,8 @@ class LuauVMObfuscator: consts_json = json.dumps(encrypted_consts) start_idx = pos_map[0] - # Obfuscated Variable Names - V_ENV = self.get_var("env") + V_LUA_ENV = self.get_var("lua_env") + V_BIT = self.get_var("bit32") V_B64 = self.get_var("b64") V_D = self.get_var("decode") V_INST = self.get_var("inst_raw") @@ -154,137 +124,85 @@ class LuauVMObfuscator: V_A = self.get_var("a") V_B = self.get_var("b") V_C = self.get_var("c") - V_BIT = self.get_var("bit32") - V_GS = self.get_var("getservice") - V_TRAP = self.get_var("trap") - V_CHECK = self.get_var("check") - V_IS_HOOKED = self.get_var("is_hooked") - V_PROTECT = self.get_var("protect") - V_METH = self.get_var("meth") - V_LUA_ENV = self.get_var("lua_env") + V_KEY = self.get_var("key") + V_RES = self.get_var("res") + V_LAST = self.get_var("last") - vm_lua = f"""local {V_LUA_ENV} = getfenv() -local {V_BIT} = bit32 -local {V_GS} = game.GetService -local {V_B64} = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' -local {V_D} = function(data) - if not ({self.opaque_predicate()}) then return "" end - data = string.gsub(data, '[^'..{V_B64}..'=]', '') - return (data:gsub('.', function(x) - if (x == '=') then return '' end + vm_lua = f"""local {V_LUA_ENV}=getfenv() +local {V_BIT}=bit32 +local {V_B64}='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' +local {V_D}=function(data) + data=string.gsub(data,'[^'..{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 + 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) + 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 + for i=1,8 do r=r+(x:sub(i,i)=='1'and 2^(8-i)or 0)end return string.char(r) end)) end - -local function {V_IS_HOOKED}(f) - if type(f) ~= "function" then return false end - local s = tostring(f) - if string.find(s, "hook") or string.find(s, "proxy") then return true end - return false -end - -local function {V_TRAP}() - local _ = function() while true do end end - task.spawn(_) -end - -local function {V_CHECK}() - local d = {{ "getgenv", "getrenv", "getreg", "debug", "Drawing", "hookfunction", "setreadonly", "make_writeable" }} - for _, v in ipairs(d) do - if {V_LUA_ENV}[v] then - if {V_IS_HOOKED}({V_LUA_ENV}[v]) then return false end - end - end - if not {V_LUA_ENV}["game"] or not {V_LUA_ENV}["task"] then return false end - return true -end - -local {V_INST} = {V_D}('{inst_b64}') -local {V_CONSTS} = {V_GS}(game, "HttpService"):JSONDecode('{consts_json}') -local {V_SALT} = {self.to_expr(salt)} - +local {V_INST}={V_D}('{inst_b64}') +local {V_CONSTS}=game:GetService("HttpService"):JSONDecode('{consts_json}') +local {V_SALT}={self.to_expr(salt)} local function {V_EXEC}() - if not {V_CHECK}() then {V_TRAP}() return end - - local {V_REGS} = {{}} - local {V_CURR} = {self.to_expr(start_idx)} - local {V_RUN} = true - - local {V_PROTECT} = {{}} - setmetatable({V_PROTECT}, {{ - __index = {V_LUA_ENV}, - __newindex = function(_, k, v) {V_LUA_ENV}[k] = v end, - __metatable = "Locked" - }}) - + local {V_REGS}={{}} + local {V_CURR}={self.to_expr(start_idx)} + local {V_RUN}=true local function {V_GETC}(idx) - local c = {V_CONSTS}[idx + 1] + local c={V_CONSTS}[idx+1] if not c then return nil end - if c.t == {self.to_expr(1)} then - local raw = {V_D}(c.v) - local key = (idx * {self.to_expr(149)} + {V_SALT}) % {self.to_expr(256)} - local res = "" - local last = key % 256 - for i=1, #raw do - local k = (key + i + last - 1) % 256 - local b = string.byte(raw, i) - local char_code = {V_BIT}.bxor(b, k) - res = res .. string.char(char_code) - last = char_code + if c.t=={self.to_expr(1)} then + local raw={V_D}(c.v) + local {V_KEY}=(idx*{self.to_expr(149)}+{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 end - return res + return table.concat({V_RES}) end return c.v end - while {V_RUN} do - if not ({self.opaque_predicate()}) then break end - local {V_PTR} = {V_CURR} * {self.to_expr(7)} + 1 - if {V_PTR} > #{V_INST} then break end - - 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 * {self.to_expr(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)} - - if {V_OP} == {self.to_expr(self.opcodes.index('MOVE'))} then - {V_REGS}[{V_A}] = {V_REGS}[{V_B}] - elseif {V_OP} == {self.to_expr(self.opcodes.index('LOADK'))} then - {V_REGS}[{V_A}] = {V_GETC}({V_B}) - elseif {V_OP} == {self.to_expr(self.opcodes.index('GETGLOBAL'))} then - {V_REGS}[{V_A}] = {V_PROTECT}[{V_GETC}({V_B})] - elseif {V_OP} == {self.to_expr(self.opcodes.index('SETGLOBAL'))} then - {V_PROTECT}[{V_GETC}({V_B})] = {V_REGS}[{V_A}] - elseif {V_OP} == {self.to_expr(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(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.to_expr(self.opcodes.index('RETURN'))} then - {V_RUN} = false + 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)})-{self.to_expr(self.k1)})-{self.to_expr(self.k3)} + 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})] + elseif {V_OP}=={self.opcodes.index('SETGLOBAL')} then + {V_LUA_ENV}[{V_GETC}({V_B})]={V_REGS}[{V_A}] + 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(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 - - if not ({self.opaque_predicate()}) then {V_RUN} = false end end end - task.spawn({V_EXEC})""" - return vm_lua + return self.minify(vm_lua) def compile_to_bytecode(self, ast): constants = [] @@ -294,14 +212,11 @@ task.spawn({V_EXEC})""" def add_const(val): if isinstance(val, str): - s_q = chr(39) - d_q = chr(34) + s_q = chr(39); d_q = chr(34) if (val.startswith(s_q) and val.endswith(s_q)) or (val.startswith(d_q) and val.endswith(d_q)): val = val[1:-1] - for i, c in enumerate(constants): if c['value'] == val: return i - t = 'string' if isinstance(val, str) else 'number' constants.append({'type': t, 'value': val}) return len(constants) - 1 @@ -326,16 +241,12 @@ task.spawn({V_EXEC})""" 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']), 0]) - for i, arg_expr in enumerate(node['args']): load_expr_to_reg(arg_expr, func_reg + 1 + i) - instructions.append([self.op_to_id["CALL"], func_reg, len(node['args']) + 1, 1]) - elif node['type'] == 'assign': val_reg = next_reg load_expr_to_reg(node['value'], val_reg) - if node.get('local'): locals_map[node['name']] = val_reg next_reg += 1 @@ -356,7 +267,7 @@ task.spawn({V_EXEC})""" bytecode = self.compile_to_bytecode(ast) return self.generate_vm_source(bytecode) except Exception: - return "" + return "-- Obfuscation Error" def obfuscate(code): return LuauVMObfuscator().obfuscate(code) \ No newline at end of file