有没有办法反编译一个dll和/或.pyd文件,以便提取用Python编写的源代码?
提前致谢
答案 0 :(得分:5)
我假设.pyd / .dll文件是在Cython中创建的,而不是Python?
无论如何,通常它是不可能的,除非有专门为该文件最初编译的语言设计的反编译器。虽然我了解C,C ++,Delphi,.NET和其他一些反编译器,但我还没有听说过Cython反编译器。
当然,Cython所做的是首先将你的Python [esque]代码转换为C代码,这意味着你可能更幸运找到一个C反编译器,然后根据反编译的C代码来划分原始的Python代码。至少,通过这种方式,您将处理从一种(相对)高级语言到另一种语言的翻译。
最糟糕的情况是,您必须使用反汇编程序。然而,从反汇编程序的输出重新创建Python代码并不容易(非常类似于将大脑的生物功能与构成它的细胞的蛋白质的化学公式相区别)。
您可以查看有关各种反编译器和反汇编程序的想法和建议的this question,然后从那里继续进行调查。
答案 1 :(得分:3)
我不同意接受的答案,似乎是的,即使在.pyd
中也可以访问源代码的内容。
让我们看一下如果出现错误会发生什么:
1)创建此文件:
A = 6
print 'hello'
print A
print 1/0 # this will generate an error
2)用python setup.py build
编译:
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize("whathappenswhenerror.pyx"), include_dirs=[])
3)现在在标准python文件中导入.pyd文件:
import whathappenswhenerror
4)让我们用python testwhathappenswhenerror.py
运行它。这是输出:
hello
6
Traceback (most recent call last):
File "D:\testwhathappenswhenerror.py", line 1, in <module>
import whathappenswhenerror
File "whathappenswhenerror.pyx", line 4, in init whathappenswhenerror (whathappenswhenerror.c:824)
print 1/0 # this will generate an error
ZeroDivisionError: integer division or modulo by zero
正如您所见,显示了print 1/0 # this will generate an error
源代码中的代码行.pyx
!甚至显示评论!
4 bis)如果我在步骤3)之前删除(或移动到其他地方)原始.pyx文件,则不再显示原始代码print 1/0 # this will generate an error
:
hello
6
Traceback (most recent call last):
File "D:\testwhathappenswhenerror.py", line 1, in <module>
import whathappenswhenerror
File "whathappenswhenerror.pyx", line 4, in init whathappenswhenerror (whathappenswhenerror.c:824)
ZeroDivisionError: integer division or modulo by zero
但这是否意味着它不包含在.pyd中?我不确定。