我正在尝试使用Cython并探索代码混淆的可能性 (文章)。特别注意到该文章中提到:
当编译完成后,没有办法将编译后的库反向回到可读的Python源代码!
我使用了这个问题的信息来将我的代码编译成独立的可执行文件。依据我的理解和在文章1中提到的,Cython将Python代码转换为C代码,并调用相应的Python库(这是正确的吗?)。换句话说,我们只有C文件作为输出,它无法像.pyc文件那样被反编译。
我的测试代码非常简单:
def my_crashing_function():
x = "1"
y = 2
test = x + y # we will crash here
if __name__ == "__main__":
my_crashing_function()
但是当我运行这个可执行文件(在执行cython --embed -o test.c main.py
和gcc -Os -I /usr/include/python3.5m -o test test.c -lpython3.5m -lpthread -lm -lutil -ldl -s
之后),我会得到如下错误:
user@debian:~# ./hello
Traceback (most recent call last):
File "main.py", line 7, in init main
my_crashing_function()
File "main.py", line 4, in main.my_crashing_function
test = x + y # we will crash here
TypeError: Can't convert 'int' object to str implicitly
正如您所见,我们有一条带有所有方法名称、正确变量名称和行数的回溯信息,甚至包括原始源代码注释。如果我们重命名变量或更改注释,回溯信息也会相应更改。 我不明白回溯信息是如何显示所有这些信息的。它只有在完整的源代码也存储在可执行文件中时才能以这种方式工作。 请告诉我,我错在哪里了?
更新。我的情况下,回溯信息是从原始.py文件生成的。这个文件与编译后的可执行文件在同一个文件夹中,只因为这样我才得到了回溯信息中所有的源代码和注释。删除原始.py文件后,回溯信息将只包含异常类型和行号,没有其他信息。