2024-03-29 08:57:12 发布
网友
我正在寻找如何隐藏我的Python源代码。
print "Hello World!"
如何对这个示例进行编码,使其不可读?我被告知要用base64,但我不知道怎么用。
您可以使用^{} 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中。所以看起来像这样:
compile()
eval()
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>的运行方式与程序类似,但不包含源代码。
.pyo
.py
python <your program.py>
PS:您得到的“有限”级别的混淆可以恢复代码(使用一些变量名,但不使用注释和docstring)。请参阅第一条注释,了解如何执行此操作。然而,在某些情况下,这种程度的混淆可能被认为是足够的。
PPS:如果您的程序导入的模块像这样模糊不清,那么您需要用.pyc后缀重命名它们(我不确定这不会有一天中断),或者您可以使用.pyo并用python -O ….pyo运行它们(导入应该可以工作)。这将允许Python查找模块(否则,Python将查找.py模块)。
.pyc
python -O ….pyo
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
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绑定到受保护的代码。
您可以使用^{} module 对字符串进行编码以停止shoulder surfing,但如果有人可以访问您的文件,则不会停止他们查找您的代码。
然后,您可以使用^{} function 和^{} function 来执行解码后的代码。
因此,如果您有30行代码,您可能需要对其进行加密,方法如下:
然后,您需要编写第二个脚本来执行
compile()
和eval()
,这两个脚本可能将编码后的脚本作为字符串文字包含在triple quotes中。所以看起来像这样:这只是一个有限的一级混淆解决方案,但它是内置的:Python有一个字节码编译器:
生成包含字节码的
.pyo
文件,以及删除docstring的位置等。您可以使用.py
扩展名重命名.pyo
文件,并且python <your program.py>
的运行方式与程序类似,但不包含源代码。PS:您得到的“有限”级别的混淆可以恢复代码(使用一些变量名,但不使用注释和docstring)。请参阅第一条注释,了解如何执行此操作。然而,在某些情况下,这种程度的混淆可能被认为是足够的。
PPS:如果您的程序导入的模块像这样模糊不清,那么您需要用
.pyc
后缀重命名它们(我不确定这不会有一天中断),或者您可以使用.pyo
并用python -O ….pyo
运行它们(导入应该可以工作)。这将允许Python查找模块(否则,Python将查找.py
模块)。作为最大值,您可以将源代码编译为字节码,然后仅分发字节码。但即使这样也是可逆的。字节码可以反编译成半可读的源代码。
Base64对于任何人来说都是微不足道的解码,因此它不能作为实际的保护,只能对完全不懂PC的人“隐藏”源代码。此外,如果您计划以任何方式实际运行该代码,则必须在脚本中包含解码器(或发行版中的另一个脚本,该脚本需要由合法用户运行),这将立即泄漏您的编码/加密。
混淆技术通常涉及注释/文档剥离、名称损坏、垃圾代码插入等,因此即使您反编译字节码,也无法获得非常可读的源代码。但它们仍然是Python的源代码,Python不擅长成为不可读的混乱。
如果您绝对需要保护一些功能,我建议使用编译语言,如C++或C++,编译和分发.so,dll,然后使用Python绑定到受保护的代码。
相关问题 更多 >
编程相关推荐