An in-place obfuscator for python 3.11
Project description
PyObf 2
A python obfuscator that actually understands your program.
What sets it apart?
PyObf actually understands your program, parsing it in the exact same way the python interpreter would. This allows for better protection, compared to most other obfuscators, which just wrap your code in a launcher and hope no one is bored enough to crack it.
With PyObf, your program isn't just wrapped, it is changed fundamentally. Since it can actually parse the python code you write, certain elements of it can be swapped out entirely, which makes obfuscating it way easier and, more importantly, way more secure.
Comparison
Assuming this program:
def hi():
return "Hi"
def print_hi(suffix):
print(hi() + " " + suffix)
if __name__ == "__main__":
print_hi("World")
Obfuscating it with some common obfuscator may result in this program:
import lzma, gzip, zlib, base64
exec(lzma.decompress(gzip.decompress(zlib.decompress(base64.a85decode(b'GanfH!(?i/M[0;*H@\'0(rrJnq>Q=X\\H<=>N!!MH8Zpk)s+TW>Y!!%*ojeL`6JH0.b!&>E_s%a=KI_.BiVuHH@Ze*#DT<W^8FO?SoOTWE,4ZNU`I=A`@,6[Lp^AP2+$I]]Sg+.bi.LDR=1q-\'(Y_]K^crG<0D%=2pb;>5nY[.Fr-F-@W-<MRn<(;S>r1.L$!!)tqp>Q!Ra_(SSIY%S#!!)mYkCKnVBDV`1!!!!%=^(#9?@J[M!!"^a:%J')))))
Whereas obfuscating it with a LIGHT PyObf config results in this:
def method0():
return __๐ถ๐ฎ๐ฑ๐ฐ๐ณ๐ฉ__('base64').b64decode(__๐ถ๐ฎ๐ฑ๐ฐ๐ฟ๐__('zlib').decompress(b'x\xda\x0bv\xcf\xb6\x05\x00\x038\x01C')).decode()
def method1(arg0):
๐ฑ๐ง๐ถ๐ฃ๐(๐ข๐ฒ๐ฉ๐ต๐ค๐0() + __๐๐บ๐ฅ๐ค๐ง๐ต__('base64').b64decode(__๐ถ๐ฎ๐ฑ๐ฐ๐ณ๐__('zlib').decompress(b'x\xda\xf3t\xb4\xb5\x05\x00\x02\xa2\x01\x05')).decode() + ๐ข๐ฟ๐จ0)
if (__๐ฃ๐ฎ๐ข๐ฆ__ == __๐๐บ๐ฑ๐ผ๐ง๐__('base64').b64decode(__๐ถ๐ฎ๐ฅ๐ค๐ง๐ต__('zlib').decompress(b'x\xda\x8b0\xb4,\x89\x0c\xcf)\x8d0\xb4\xb0\x05\x00\x19/\x03\xc6')).decode() or __๐ถ๐ฎ๐ฝ๐ฐ๐ฟ๐ต__(__๐๐ข๐ฅ๐ฐ๐ณ๐ฉ__('base64').b64decode(__๐ช๐ฎ๐ฑ๐ผ๐ณ๐__('zlib').decompress(b'x\xdaK\xceu+\x8dr\xb7,\x01\x00\r+\x02\xda')).decode()).betavariate(18.609942471140883, 73.43725108007276) == 95.35595495280745) << 14 == 16384:
๐ข๐ฒ๐๐ต๐ค๐ฑ1(__๐ช๐บ๐ฑ๐ค๐ง๐ต__('base64').b64decode(__๐ถ๐บ๐ฑ๐ผ๐ฟ๐__('zlib').decompress(b'x\xda\x0b3\xb2\xacLr\x0f\xb4\x05\x00\x0b\x05\x02r')).decode())
if you don't believe this will run, try to run it :troll:
You might notice that the actual program structure is still recognizable, but that can change very fast if you use a more aggressive configuration:
Obfuscated code (very long)
lMIIIMIMllMMNlIINIlIMlIlNllNlMNI = eval(__import__('marshal').loads(b'\xe3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\xf3\x1c\x00\x00\x00\x97\x00\x02\x00G\x00d\x00\x84\x00d\x01\xa6\x02\x00\x00\xab\x02\x00\x00\x00\x00\x00\x00\x00\x00S\x00)\x02c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\xf3\x14\x00\x00\x00\x97\x00d\x00Z\x00d\x00Z\x01d\x01\x84\x00Z\x02d\x02S\x00)\x03\xda\x010c\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x03\x00\x00\x00\xf3\n\x03\x00\x00\x97\x00d\x01d\x00l\x00}\x02d\x01d\x00l\x01}\x03d\x01d\x00l\x02}\x04d\x01d\x00l\x03}\x05d\x01d\x02l\x04m\x05}\x06\x01\x00|\x01}\x07|\x03\xa0\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x03\xa6\x01\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\x00\x00}\x08|\x05\xa0\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x04\xa6\x01\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\x00\x00}\ti\x00}\nd\x04}\x0b\t\x00\t\x00|\x05\xa0\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|\x0b\xa6\x01\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\x00\x00}\x0ci\x00|\x0cj\x08\x00\x00\x00\x00\x00\x00\x00\x00\xa5\x01|\n\xa5\x01}\n|\x0bd\x04z\r\x00\x00}\x0b|\x0cj\t\x00\x00\x00\x00\x00\x00\x00\x00j\n\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x06\xa6\x01\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\x00\x00s\x01n\x12n\x10#\x00t\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$\x00r\x03\x01\x00Y\x00n\x05w\x00x\x03Y\x00w\x01\x8cXi\x00|\tj\r\x00\x00\x00\x00\x00\x00\x00\x00\xa5\x01|\n\xa5\x01}\r|\x07d\x01\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x01k\x02\x00\x00\x00\x00rN\x02\x00t\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|\x04|\x08\xa0\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x07\xa6\x01\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\x00\x00d\x01\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa6\x02\x00\x00\xab\x02\x00\x00\x00\x00\x00\x00\x00\x00|\x02\xa0\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|\x07d\x04d\x00\x85\x02\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa6\x01\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\x00\x00|\r\xa6\x02\x00\x00\xab\x02\x00\x00\x00\x00\x00\x00\x00\x00S\x00|\x07d\x01\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x04k\x02\x00\x00\x00\x00rN\x02\x00t\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|\x04|\x08\xa0\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x08\xa6\x01\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\x00\x00d\x01\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa6\x02\x00\x00\xab\x02\x00\x00\x00\x00\x00\x00\x00\x00|\x02\xa0\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|\x07d\x04d\x00\x85\x02\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa6\x01\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\x00\x00|\r\xa6\x02\x00\x00\xab\x02\x00\x00\x00\x00\x00\x00\x00\x00S\x00|\x02\xa0\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|\x07d\x04d\x00\x85\x02\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa6\x01\x00\x00\xab\x01\x00\x00\x00\x00\x00\x00\x00\x00d\x00d\x00d\t\x85\x03\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00S\x00)\nN\xe9\x00\x00\x00\x00)\x01\xda\tFrameType\xda\x05rot13\xe9\x01\x00\x00\x00T\xfa\x01<\xda\x04riny\xda\x04rkrp\xe9\xff\xff\xff\xff)\x11\xda\x04zlib\xda\x06codecs\xda\x08builtins\xda\x03sys\xda\x05typesr\x06\x00\x00\x00\xda\x06lookup\xda\t_getframe\xda\x08f_locals\xda\x06f_code\xda\x07co_name\xda\nstartswith\xda\nValueError\xda\tf_globals\xda\x07getattr\xda\x06decode\xda\ndecompress)\x0e\xda\x02a0\xda\x02a1\xda\x02v0\xda\x02v1\xda\x02v2\xda\x02v3r\x06\x00\x00\x00\xda\x02v4\xda\x02v5\xda\x02v6\xda\x02v7\xda\x02v8\xda\x02v9\xda\x03v12s\x0e\x00\x00\x00 \xda\x00\xfa\x02m0r+\x00\x00\x00\x01\x00\x00\x00s\xe0\x01\x00\x00\x80\x00\xf0\x14\x00\x05\x19\xd0\x04\x18\xd0\x04\x18\xd0\x04\x18\xd8\x04\x1c\xd0\x04\x1c\xd0\x04\x1c\xd0\x04\x1c\xd8\x04 \xd0\x04 \xd0\x04 \xd0\x04 \xd8\x04\x16\xd0\x04\x16\xd0\x04\x16\xd0\x04\x16\xd8\x04\x1f\xd0\x04\x1f\xd0\x04\x1f\xd0\x04\x1f\xd0\x04\x1f\xd0\x04\x1f\xe0\x13\x17\x80L\xd8\r\x14\x8f^\x8a^\x98G\xd1\r$\xd4\r$\x80F\xd8\x1d!\x9f^\x9a^\xa8A\xd1\x1d.\xd4\x1d.\x80K\xd8\x13\x15\x80L\xd8\x0c\r\x80E\xf0\x02\x08\x05\x12\xf0\x02\x07\t\x12\xd8\'+\xa7~\xa2~\xb0e\xd1\'<\xd4\'<\x88M\xd8\x1bE\x98m\xd4\x1e4\xd0\x1bE\xb8\x0c\xd0\x1bE\x88L\xd8\x0c\x11\x90Q\x89J\x88E\xd8\x13 \xd4\x13\'\xd4\x13/\xd7\x13:\xd2\x13:\xb83\xd1\x13?\xd4\x13?\xf0\x00\x01\r\x16\xd8\x10\x15\xf0\x03\x01\r\x16\xf8\xe5\x0f\x19\xf0\x00\x01\t\x12\xf0\x00\x01\t\x12\xf0\x00\x01\t\x12\xd8\x0c\x11\x88E\xf0\x03\x01\t\x12\xf8\xf8\xf8\xf0\x0f\x08\x05\x12\xf0\x12\x00\r6\x88{\xd4\x0f$\xd0\x0c5\xa8\x0c\xd0\x0c5\x80E\xd8\x07\x13\x90A\x84\x7f\x98$\xd2\x07\x1e\xd0\x07\x1e\xe0\x0f;\x8dw\x90y\xa0&\xa7-\xa2-\xb0\x06\xd1"7\xd4"7\xb8\x01\xd4":\xd1\x0f;\xd4\x0f;\xb8E\xd7<L\xd2<L\xc8\\\xd0Z[\xd0Z\\\xd0Z\\\xd4M]\xd1<^\xd4<^\xd0`e\xd1\x0ff\xd4\x0ff\xd0\x08f\xd8\t\x15\x90a\x8c\x1f\x98D\xd2\t \xd0\t \xe0\x0f;\x8dw\x90y\xa0&\xa7-\xa2-\xb0\x06\xd1"7\xd4"7\xb8\x01\xd4":\xd1\x0f;\xd4\x0f;\xb8E\xd7<L\xd2<L\xc8\\\xd0Z[\xd0Z\\\xd0Z\\\xd4M]\xd1<^\xd4<^\xd0`e\xd1\x0ff\xd4\x0ff\xd0\x08f\xe0\x0f\x14\xd7\x0f\x1f\xd2\x0f\x1f\xa0\x0c\xa8Q\xa8R\xa8R\xd4 0\xd1\x0f1\xd4\x0f1\xb0$\xb0$\xb0B\xb0$\xd4\x0f7\xd0\x087s\x13\x00\x00\x00\xc1\tA\x04B\x0f\x00\xc2\x0f\nB\x1c\x03\xc2\x1b\x01B\x1c\x03N)\x03\xda\n__module__\xda\x0c__qualname__\xda\x0b__getitem__\xa9\x00\xf3\x00\x00\x00\x00\xfa\x05<asm>r*\x00\x00\x00r*\x00\x00\x00\x00\x00\x00\x00r0\x00\x00\x00r0\x00\x00\x00r\x03\x00\x00\x00r/\x00\x00\x00r/\x00\x00\x00r0\x00\x00\x00r1\x00\x00\x00r*\x00\x00\x00r*\x00\x00\x00\x00\x00\x00\x00r0\x00\x00\x00r0\x00\x00\x00'))()
def b():
pass
def NIlMlIlMNIIIMMNIlNlIllNlNMlIIINI():
a = [None] * 18
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:8], ('__import__', 'b64decode', 'decompress', 'decode'), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][9:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:6], b'\x97\x00t\x01\xd0\xcdu\xec{\xc7\x9b\xd4\xf9Vd\x01\xa6\x01\xb7\xb6\xab\x01\xf4\r\x14\x17\r!iZ\xa0\x01;\xc3\xa9s\x8c\xc2,\xd5\x8b&\x81\xfe\xeb\xa7\xb3\xf8\x10R\xe8\x12t\x01\xcb\x0c]+\xf6\xb7\xcdc\t\xf7d\x02\xa6\x01\xd7\xc1\xab\x01\x15\tj\xfa\xbcZ\xe1\x03\xa0\x02=\x1f\xda\x1c\x83\xdaI\r\x08M,8\xcf\xffJ}\x7fT\x14hd\x03\xa6\x01W\xc8\xab\x01\xf2\r\xcf\xb0\xb8R\xe83\xa6\x01"\x17\xab\x01Z!eN\xfb\x91X\xe7\xa0\x03\xcf\x9f+\xbb\xb0T\xde\xc6\xcf\xd6\x06\xc8{XU\x87\xe8\x8c\x9dK\xa6\x00\xe1\x88\xab\x00\xe9\xa3/\xef\x18\x91\xcaxS\x00', *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][7:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:9], (), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][10:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:14], b'', b'', *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][16:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:13], 0, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][14:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:5], 0, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][6:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:0], 0, 0, 0, 0, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][4:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:7], (None, 'base64', 'zlib', b'x\xda\x0bv\xcf\xb6\x05\x00\x038\x01C'), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][8:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:10], '', '', '', *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][13:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:16], (), (), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][18:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:4], 5, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][5:]]
return lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xda+\xa9,H\x05\x00\x04\x84\x01\xc3'](lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x02\x00\x00c\x00c'].__code__)(*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'])
def MMINIIlIlINNlMINMMMNMMlNMIlMlllI():
a = [None] * 18
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:1], 0, 0, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][3:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:3], 1, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][4:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:8], ('print', 'method0', '__import__', 'b64decode', 'decompress', 'decode'), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][9:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:0], 1, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][1:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:6], b"\x97\x00t\x01\xf8_6\x13\xbc@J\x822Wt\x03\x15W\x12\xda\xd6eulM\x04\xa6\x00\xfb\xbf\xab\x00\x8bf\x95\x18\xad\x0bj\x9ct\x05\x1c\x1b\x18\x94W\xe5\xec\xc7\x7f\xe6d\x01\xa6\x01~\xb5\xab\x01\xb8h\xfd\xe6\xdd\xc3\x95c\xa0\x03d\xd1\xaf\x97/9\xc1\x8f&\xe4[W\xf1\x12-\xb8\tw\xa6\xaft\x05\x0b\xf2\xc4\xfd~&x\x82>\xaad\x02\xa6\x01\x07\xea\xab\x01-\xf0\xdfW\x08\xb5*9\xa0\x04je\xd4\xcb \xcb;\xe3\xfbs\xfb\xff\x91/\xf2\xbcT%\xf6Rd\x03\xa6\x014\x1e\xab\x01\xe2]\x84;\xc6\\c1\xa6\x01\xd2\xa8\xab\x01\xa7\xb3S\xc1\x89\xbf\xdb\xfd\xa0\x05\xa0Z\x8b\x1dd\xa3\\*\x02R\x06\x13\xc6\xbe\x01\x87\xa2\x9f\xd5\x12\xa6\x00%\x93\xab\x00*\x15\xf9\xe1.\x075\xfdz\x00'\x1d|\x00z\x00I\xb1\xa6\x01\x11\xa9\xab\x01\xc3\n\xef\xe1\xc2b\x83\xd0\x01\x00d\x00S\x00", *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][7:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:4], 8, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][5:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:9], ('arg0',), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][10:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:5], 0, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][6:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:7], (None, 'base64', 'zlib', b'x\xda\xf3t\xb4\xb5\x05\x00\x02\xa2\x01\x05'), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][8:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:16], (), (), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][18:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:10], '', '', '', *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][13:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:14], b'', b'', *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][16:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:13], 0, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][14:]]
return lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xda+\xa9,H\x05\x00\x04\x84\x01\xc3'](lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x02\x00\x00c\x00c'].__code__)(*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'])
def NMMIlMlNMNlMMIIllIIMlNllNIllNlNI():
a = [None] * 18
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:14], b'', b'', *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][16:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:0], 0, 0, 0, 0, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][4:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:10], '', '', '', *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][13:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:5], 0, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][6:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:16], (), (), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][18:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:9], (), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][10:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:7], (lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b"\x00x\xda\xf3\xf3\xcc\xf1\xcd\x01b?OOO_ \x99\xe3\x07\xe4\x01\t?\xa0\xa8\xa7\xa7\x9f'\x00\xaf)\n\x93"](), lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xda\r\xc6\xb1\t\x00\x00\x0c\x84\xc0\xf9,\xfcI\xdc\xbfN\x90\x03\x95A\xdf\xd6\xbf\xfa\x9ad\xc5\x01\xa8d\n\x7f'](), 'base64', 'zlib', b'x\xda\x8b0\xb4,\x89\x0c\xcf)\x8d0\xb4\xb0\x05\x00\x19/\x03\xc6', b'x\xdaK\xceu+\x8dr\xb7,\x01\x00\r+\x02\xda', 41.61482108994687, 16.285766185599883, 32.3993595971086, 12, 4096, b'x\xda\x0b3\xb2\xacLr\x0f\xb4\x05\x00\x0b\x05\x02r', None), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][8:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:4], 7, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][5:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:8], ('method0', 'method1', '__name__', '__import__', 'b64decode', 'decompress', 'decode', 'betavariate'), *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][9:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:6], b'\x97\x00d\x00\x84\x00Z\x00d\x01\x84\x00Z\x01e\x02\x02\x00e\x03d\x02\xa6\x01\xe2Z\xab\x015d\x98\xc2\x1a\xd7\xc3\xdd\xa0\x04.\x7f\xed\xa2O\xd0\xbb\x16\xfbg\x9a\x12\xaa*\xa4\x05\x19\xe0\x96Q\x02\x00e\x03d\x03\xa6\x01@\xb4\xab\x01\xa1\x16\xf3fAtP;\xa0\x05\x7f7Rt\x07\x1eZ\x81]\x17b#iX;\xcc\x97\x08<\xf8d\x04\xa6\x01\xedV\xab\x01\xd4\x1e;\xf0s\x02\n}\xa6\x01\xa7\xed\xab\x01f\x8bf\x81\xd2>\x88\x8c\xa0\x06\xc6\xf1\x18\xb9*\xd0\x8d=D\xd1\xc9M<%\x9c\x9ca\x17\xf4\x98\xa6\x00\x976\xab\x00\x9b\xbb\x08l\xf5"\xbc\xd5k\x02\xbc\x0f\x97\xfapl\x02\x00e\x03\x02\x00e\x03d\x02\xa6\x01\x8d]\xab\x01\xd8\xa7\xb6Pi\x08\xd2\xec\xa0\x04\xcb\xd9\xc8)\xf0<,\xf8\x17\x87\xe4pUO\xdf\xef\xff\xf8*L\x02\x00e\x03d\x03\xa6\x01g\x19\xab\x01\xb2\xc2\xc0\x05`fU\xbf\xa0\x05\xecz\xde\xe4\xf6\xe4\t\x87\x02\x0f5\x9f\xb1q\'\x1dA\xe5\xd4\xbfd\x05\xa6\x01\xb9\xa1\xab\x01\xccz\xc2L\xa1\xad\x8dL\xa6\x01\xf9\x8f\xab\x01\xb6a\xe1\x0f)\x9b\xfd\x8f\xa0\x06\xfa\xac\x11:\x81T\xd6\xdb\xb0\x1c\xcb*\xa6\x0b\x86\xc9\xa6\x81\x17\xac\xa6\x00=\x9f\xab\x00\xf8\x1e\xe3\xd3\x92F9@\xa6\x01O\x04\xab\x01\xab\xd5\xbb\x19\xc9\xa5\xaf\xf1\xa0\x07Q+F4\x83q\xd9\x87\x14\xea\x99\x99@\x075\xe1\x06I\x11\x1cd\x06d\x07\xa6\x02N\xac\xab\x02a\xa3\xef\xfe\xd3.\x13\x93d\x08k\x02\x99\xc0\xaa\xbdd\tz\x03\xd4[d\nk\x02/\x05\x94.rW\x02\x00e\x01\x02\x00e\x03d\x02\xa6\x01\xb6\x19\xab\x01\xae\xec\x9e\xb3\xaba\xaa\x06\xa0\x04\x04b\xc0\xaf\x16*\xe0s\x90\xd6\x90\x9ae\xbd\xd6\xa1\x8b\x13\\\x10\x02\x00e\x03d\x03\xa6\x01\xdd\xdd\xab\x01\x88\xfdc\x0543\xcex\xa0\x05\x8c2%"\xf8\xd94\x1c\xd4\x1b%\r\xf5a\xa7n\xbbP\x7f\x80d\x0b\xa6\x01\x96\x90\xab\x01oFq\x06\xd6\x01\xb8\xe0\xa6\x01\xb1B\xab\x01\x0e\xda\xcat.D\x99\xfc\xa0\x06n\xc2\xd4\xda\x8c\xaf\x96\xe9g:t{sJ\xcd\xf6-\xce\x81\xfd\xa6\x00\xf7`\xab\x00.\t\x8edr\x14\xb4Y\xa6\x01\xde\xf2\xab\x01T\xe1\x82\x84\xb8\x02\xb1\xc9\x01\x00d\x0cS\x00d\x0cS\x00', *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][7:]]
a = [*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][:13], 0, *lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'][14:]]
return lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xda+\xa9,H\x05\x00\x04\x84\x01\xc3'](lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x02\x00\x00c\x00c'].__code__)(*lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\x04\x00\x00b\x00b'])
lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xdaK\xadHM\x06\x00\x04-\x01\xa6'](lMIIIMIMllMMNlIINIlIMlIlNllNlMNI[b'\x00x\xda\r\xc7\xa1\x11\x00\x00\x00\x82\xc0\xf9\x0c2\t\xfbg-\xdcC\x1b+\xc5+\x9a\xfc\x94\x93w\xb0c\n\xe1']())
Installing
The package now has a pypi! https://pypi.org/project/pyobf2/
Install with python3 -m pip install pyobf2
Usage
The obfuscator has an API, to allow you to integrate it into your own projects. For example, it can be used to obfuscate the output of a code generator automatically. An example usages of the API can be found in examples/api/
. If you end up using the API, please credit this repository.
If you just want to run the obfuscator, run pyobf2
or python3 -m pyobf2
after installing it
API usage
As previously mentioned, the examples/api/
directory contains examples on how the api works. Some notes are required, though:
- When obfuscating multiple files that depend on each other, use
do_obfuscation_batch_ast
, instead of callingdo_obfuscation_single_ast
on all of them separately. This will allow the obfuscator to draw conclusions on which file depends on which other file, and allows it to understand the structure between them. do_obfuscation_batch_ast
is a generator. It will progressively yield each step it does, to allow for progress bar rendering. It will do nothing when not iterated through.- Some transformers (eg.
packInPyz
,compileFinalFiles
) only act on the output files of the obfuscation process, and do nothing in the standard run. To invoke them, usedo_post_run
. This will require you to write the obfuscated AST into a file, though.
Feedback & bugs
The obfuscator is in no way perfect as of now, so feedback is encouraged. Please tell me how bad my code is in the issues tab.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file pyobf2-1.3.1.tar.gz
.
File metadata
- Download URL: pyobf2-1.3.1.tar.gz
- Upload date:
- Size: 39.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.5.1 CPython/3.11.4 Linux/5.15.0-78-generic
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 915ea4b0c4236a900bba0e83530421931600129a05006135e1f82d585c0b79e6 |
|
MD5 | 678bc96195cf13841ce79ba8d20de616 |
|
BLAKE2b-256 | d5c6ef65188d584dd7b8f12aa93b305231b9aa06f15efc4d9dc165a8a781039f |
File details
Details for the file pyobf2-1.3.1-py3-none-any.whl
.
File metadata
- Download URL: pyobf2-1.3.1-py3-none-any.whl
- Upload date:
- Size: 44.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.5.1 CPython/3.11.4 Linux/5.15.0-78-generic
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5d1db0ee58324788aa9c84c896ed4c8090695c861cc87d7d9b9c7258f8771808 |
|
MD5 | 9e65a12b807ed7d6027a5e7577d99da3 |
|
BLAKE2b-256 | 50098c7e11c8ee29ac593a10f15931c0bf92c232d4228df0e5d38e0efe510cbf |