我们以这个简单的例子
test.pyx
为例:import json, time # this will allow to see what happens when we import a library
print(json.dumps({'key': 'hello world'}))
time.sleep(3)
print(1/0) # division error!
那么让我们使用Cython:
cython test.pyx --embed
这会生成一个名为test.c
的文件。现在让我们进行编译:
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64
cl test.c /I C:\Python37\include /link C:\Python37\libs\python37.lib
没问题!它生成了一个大小为140KB的test.exe
可执行文件,很好!
但是在这个答案《如何有效地混淆Python代码?》中,隐含地说这种“编译”将隐藏源代码。如果你运行test.exe
,你会看到: 这似乎不是真的:
Traceback (most recent call last):
File "test.pyx", line 4, in init test
print(1/0) # division error! <-- the source code and even the comments are still there!
ZeroDivisionError: integer division or modulo by zero
这表明可读的人类可读代码仍然存在。
问题:有没有一种通过Cython编译代码的方法,使得声明“源代码不再被揭示”成立?
注意:我正在寻找一种既没有源代码也没有字节码(.pyc)的解决方案(如果嵌入了字节码/.pyc,则使用uncompyle6可以轻松恢复源代码)。
PS:我记得几年前我做了同样的观察,但我找不到它了,在更深入的研究后,它在这里:Is it possible to decompile a .dll/.pyd file to extract Python Source Code?
cythonize -i test.pyx
使用的编译器/链接器标志(它将记录在控制台中) - ead