如何有效地混淆Python代码?

2024-03-29 08:57:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找如何隐藏我的Python源代码。

print "Hello World!" 

如何对这个示例进行编码,使其不可读?我被告知要用base64,但我不知道怎么用。


Tags: 示例hello编码world源代码printbase64
3条回答

您可以使用^{} module对字符串进行编码以停止shoulder surfing,但如果有人可以访问您的文件,则不会停止他们查找您的代码。

然后,您可以使用^{} function^{} function来执行解码后的代码。

>>> import base64
>>> mycode = "print 'Hello World!'"
>>> secret = base64.b64encode(mycode)
>>> secret
'cHJpbnQgJ2hlbGxvIFdvcmxkICEn'
>>> mydecode = base64.b64decode(secret)
>>> eval(compile(mydecode,'<string>','exec'))
Hello World!

因此,如果您有30行代码,您可能需要对其进行加密,方法如下:

>>> f = open('myscript.py')
>>> encoded = base64.b64encode(f.read())

然后,您需要编写第二个脚本来执行compile()eval(),这两个脚本可能将编码后的脚本作为字符串文字包含在triple quotes中。所以看起来像这样:

import base64
myscript = """IyBUaGlzIGlzIGEgc2FtcGxlIFB5d
              GhvbiBzY3JpcHQKcHJpbnQgIkhlbG
              xvIiwKcHJpbnQgIldvcmxkISIK"""
eval(compile(base64.b64decode(myscript),'<string>','exec'))

这只是一个有限的一级混淆解决方案,但它是内置的:Python有一个字节码编译器:

python -OO -m py_compile <your program.py>

生成包含字节码的.pyo文件,以及删除docstring的位置等。您可以使用.py扩展名重命名.pyo文件,并且python <your program.py>的运行方式与程序类似,但不包含源代码。

PS:您得到的“有限”级别的混淆可以恢复代码(使用一些变量名,但不使用注释和docstring)。请参阅第一条注释,了解如何执行此操作。然而,在某些情况下,这种程度的混淆可能被认为是足够的。

PPS:如果您的程序导入的模块像这样模糊不清,那么您需要用.pyc后缀重命名它们(我不确定这不会有一天中断),或者您可以使用.pyo并用python -O ….pyo运行它们(导入应该可以工作)。这将允许Python查找模块(否则,Python将查找.py模块)。

so that it isn't human-readable?

i mean all the file is encoded !! when you open it you can't understand anything .. ! that what i want

作为最大值,您可以将源代码编译为字节码,然后仅分发字节码。但即使这样也是可逆的。字节码可以反编译成半可读的源代码。

Base64对于任何人来说都是微不足道的解码,因此它不能作为实际的保护,只能对完全不懂PC的人“隐藏”源代码。此外,如果您计划以任何方式实际运行该代码,则必须在脚本中包含解码器(或发行版中的另一个脚本,该脚本需要由合法用户运行),这将立即泄漏您的编码/加密。

混淆技术通常涉及注释/文档剥离、名称损坏、垃圾代码插入等,因此即使您反编译字节码,也无法获得非常可读的源代码。但它们仍然是Python的源代码,Python不擅长成为不可读的混乱。

如果您绝对需要保护一些功能,我建议使用编译语言,如C++或C++,编译和分发.so,dll,然后使用Python绑定到受保护的代码。

相关问题 更多 >