Are there any ways to decompile a dll and/or a .pyd file in order to extract source code written in Python?
Thanks in advance
Are there any ways to decompile a dll and/or a .pyd file in order to extract source code written in Python?
Thanks in advance
I assume the .pyd/.dll files were created in Cython, not Python?
Anyway, generally it's not possible, unless there's a decompiler designed specifically for the language the file was originally compiled from. And while I know about C, C++, Delphi, .NET and some other decompilers, I've yet to hear about Cython decompiler.
Of course, what Cython does is convert your Python[esque] code into C code first, which means you might have more luck finding a C decompiler and then divining the original Python code based on the decompiled C code. At the very least, this way you'll be dealing with translation from one (relatively) high-level language to another.
Worst-case scenario, you'll have to use a disassembler. However, recreating Python code from disassembler's output isn't going to be easy (pretty similar to divining the biological functions of a brain from chemical formulas of proteins that make up it's cells).
You might look at this question on ideas and suggestions regarding various decompilers and disassemblers, and proceed your investigation from there.
.pyd
files compiled by Cython do not have source code embedded into them after all. If you could show it to be otherwise, I would be really interested, but until then, I'll stand by my answer. –
Subbasement I don't agree with the accepted answer, it seems that yes, the content of the source code is accessible even in a .pyd
.
Let's see for example what happens if an error arrives:
1) Create this file:
A = 6
print 'hello'
print A
print 1/0 # this will generate an error
2) Compile it with python setup.py build
:
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize("whathappenswhenerror.pyx"), include_dirs=[])
3) Now import the .pyd file in a standard python file:
import whathappenswhenerror
4) Let's run it with python testwhathappenswhenerror.py
. Here is the output:
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
As you can see the line of code print 1/0 # this will generate an error
that was in the .pyx
source code is displayed! Even the comment is displayed!
4 bis) If I delete (or move somewhere else) the original .pyx file before step 3), then the original code print 1/0 # this will generate an error
is no longer displayed:
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
But does this mean it's not included in the .pyd? I'm not sure.
pyx
shows that the Traceback uses some sort of link from the pyd
(so
in Linux) to lines in the pyx
. The code is not in the pyd
. –
Petta import whathappenswhenerror
, how do you know it's importing .pyd
and not pyx
? Probably it's importing pyx
and hence the code display on error. –
Estimative pyx
file by looking at the traceback (File "whathappenswhenerror.pyx", line 4
) –
Decennary It is not possible to decompile Python code to the original
: this sentence is wrong. You can, for example with a .pyc file (different context from OP's question). I have already done it. –
Oech © 2022 - 2024 — McMap. All rights reserved.