Skip to main content

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 calling do_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, use do_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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyobf2-1.3.1.tar.gz (39.7 kB view details)

Uploaded Source

Built Distribution

pyobf2-1.3.1-py3-none-any.whl (44.2 kB view details)

Uploaded Python 3

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

Hashes for pyobf2-1.3.1.tar.gz
Algorithm Hash digest
SHA256 915ea4b0c4236a900bba0e83530421931600129a05006135e1f82d585c0b79e6
MD5 678bc96195cf13841ce79ba8d20de616
BLAKE2b-256 d5c6ef65188d584dd7b8f12aa93b305231b9aa06f15efc4d9dc165a8a781039f

See more details on using hashes here.

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

Hashes for pyobf2-1.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 5d1db0ee58324788aa9c84c896ed4c8090695c861cc87d7d9b9c7258f8771808
MD5 9e65a12b807ed7d6027a5e7577d99da3
BLAKE2b-256 50098c7e11c8ee29ac593a10f15931c0bf92c232d4228df0e5d38e0efe510cbf

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page