Можно ли декомпилировать файл.dll/.pyd для извлечения исходного кода Python?

Есть ли способы декомпилировать файл dll и / или.pyd для извлечения исходного кода, написанного на Python?

заранее спасибо

2 ответа

Решение

Я предполагаю, что файлы.pyd/.dll были созданы в Cython, а не в Python?

Во всяком случае, в общем случае это невозможно, если только нет декомпилятора, разработанного специально для языка, из которого изначально был скомпилирован файл. И хотя я знаю о C, C++, Delphi, .NET и некоторых других декомпиляторах, я еще не слышал о декомпиляторе Cython.

Конечно, Cython сначала конвертирует ваш код Python[esque] в код C, что означает, что вам может повезти больше, если вы найдете декомпилятор C, а затем раскроете исходный код Python на основе декомпилированного кода C. По крайней мере, таким образом вы будете иметь дело с переводом с одного (относительно) языка высокого уровня на другой.

В худшем случае вам придется использовать дизассемблер. Однако воссоздание кода Python из вывода дизассемблера не будет легким (очень похоже на разделение биологических функций мозга по химическим формулам белков, из которых состоят его клетки).

Вы можете посмотреть на этот вопрос об идеях и предложениях, касающихся различных декомпиляторов и дизассемблеров, и продолжить расследование оттуда.

Я не согласен с принятым ответом, кажется, что да, содержание исходного кода доступно даже в .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) Теперь импортируйте файл.pyd в стандартный файл python:

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

Как вы можете увидеть строку кода print 1/0 # this will generate an error это было в .pyx Исходный код отображается! Даже комментарий отображается!

4-бис) Если я удаляю (или перемещаю куда-то еще) исходный файл.pyx до шага 3), то исходный код 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? Я не уверен.

Другие вопросы по тегам