能否反编译.dll/.pyd文件以提取Python源代码?

25

有没有办法反编译 DLL 和/或 .pyd 文件以提取用 Python 编写的源代码?

提前致谢。


4
不是同一个问题(dll不是.pyc文件)!我的想法不行!可能需要将其转换为汇编代码,但如何跟踪数据/函数树? - dsgdfg
感谢你的帮助。 - Youssef Imam
2
@Torxed,这确实不是同一个问题,pyd文件是由Cython生成的。与pyc / bytecode不同,pyd文件是不包含原始Python源代码的二进制文件。虽然它不能保护免受逆向工程的攻击,但它确实使攻击变得更加困难,并防止某人获取您代码的完全原始源代码。 - Overdrivr
2个回答

23
我假设.pyd/.dll文件是由Cython创建的,而不是Python?总的来说,除非有一个专门为原始编译语言设计的反编译器,否则通常是不可能的。虽然我了解C,C ++,Delphi,.NET和一些其他的反编译器,但我还没有听说过Cython反编译器。当然,Cython所做的是先将你的Python[esque]代码转换成C代码,这意味着你可能会更有运气找到一个C反编译器,然后根据反编译的C代码推导出原始的Python代码。至少,这样你将处理从一种(相对)高级语言到另一种语言的翻译。最坏的情况是,你将不得不使用反汇编器。然而,从反汇编器的输出中重新创建Python代码并不容易(与根据构成其细胞的蛋白质的化学式推断大脑的生物功能非常相似)。你可以查看this question上的各种反编译器和反汇编器的想法和建议,并从那里开始调查。

感谢您的帮助回复,我会确保进行额外的研究。 - Youssef Imam
@YoussefImam 我不同意这个答案,请看我的答案 https://dev59.com/TVsV5IYBdhLWcg3w8iqr#41075212 - Basj
阅读您更新的答案后,似乎由Cython编译的.pyd文件并没有嵌入源代码。如果您能证明它不同,我会非常感兴趣,但在那之前,我会坚持我的答案。 - Lav
@Basj,能否逆向工程C代码呢?我需要逆向工程一款用Python编写的软件,其中包含.pyd文件。 - Krishnan Venkiteswaran

1

我不同意被接受的答案,因为看起来即使在.pyd中,源代码的内容也是可以访问的。

举个例子:如果出现错误,我们来看下会发生什么:

1)创建这个文件:

whathappenswhenerror.pyx

A = 6 
print 'hello'
print A
print 1/0 # this will generate an error

2)使用命令 python setup.py build 进行编译:

setup.py

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize("whathappenswhenerror.pyx"), include_dirs=[])

3) 现在在标准的Python文件中导入.pyd文件:

testwhathappenswhenerror.py

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

正如您所看到的,位于.pyx源代码中的代码行print 1/0 # this will generate an error被显示出来了!甚至连注释也被显示了!

4 bis) 如果我在第三步之前删除(或将其移动到其他位置)原始的.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中?我不确定。

9
移动pyx文件会显示Traceback使用了某种链接从pyd(在Linux中是so)到pyx中的行。代码不在pyd中。 - hpaulj
4
如果.pyx文件和import whathappenswhenerror在同一个位置,那么如何知道它导入的是.pyd而不是.pyx?很可能它正在导入.pyx,因此会显示在错误上的代码。 - krsoni
2
你可以通过查看回溯信息(File "whathappenswhenerror.pyx", line 4)来判断它是否使用了 pyx 文件。 - Minion Jim
2
准确地说,这个答案是不正确的。看起来,它正在从.pyx文件中导入。 - kursun
3
这是对一个不同问题的答案,令人信服地表明这个答案是错误的。 - DavidW
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接