¿Es posible descomstackr un archivo .dll / .pyd para extraer el código fuente de Python?

¿Hay alguna forma de descomstackr un archivo dll y / o un archivo .pyd para extraer el código fuente escrito en Python?

Gracias por adelantado

Supongo que los archivos .pyd / .dll se crearon en Cython, no en Python?

De todos modos, generalmente no es posible, a menos que haya un descomstackdor diseñado específicamente para el idioma en el que se compiló originalmente el archivo. Y mientras sé sobre C, C ++, Delphi, .NET y algunos otros descomstackdores, aún no he oído hablar sobre el descomstackdor Cython.

Por supuesto, lo que Cython hace es convertir primero su código Python [esque] en código C, lo que significa que podría tener más suerte al encontrar un descomstackdor C y luego adivinar el código Python original basándose en el código C descomstackdo. Como mínimo, de esta manera, se ocupará de la traducción de un idioma (relativamente) de alto nivel a otro.

En el peor de los casos, tendrás que usar un desensamblador. Sin embargo, recrear el código de Python a partir de la salida del desensamblador no va a ser fácil (de manera muy similar a adivinar las funciones biológicas de un cerebro a partir de fórmulas químicas de proteínas que forman sus células).

Puede consultar esta pregunta sobre ideas y sugerencias con respecto a varios descomstackdores y desensambladores, y proceder a su investigación desde allí.

No estoy de acuerdo con la respuesta aceptada, parece que sí, el contenido del código fuente es accesible incluso en un .pyd .

Veamos, por ejemplo, qué pasa si llega un error:

1) Crea este archivo:

lo que sucedewhenerror.pyx

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

2) python setup.py build con 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) Ahora importe el archivo .pyd en un archivo estándar de Python:

testwhathappenswhenerror.py

 import whathappenswhenerror 

4) Vamos a ejecutarlo con python testwhathappenswhenerror.py . Aquí está la salida:

 hello 6 Traceback (most recent call last): File "D:\testwhathappenswhenerror.py", line 1, in  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 

Como puede ver, la línea de código de print 1/0 # this will generate an error que estaba en el código fuente de .pyx que se muestra! Incluso se muestra el comentario!

4 bis) Si elimino (o muevo a otra parte) el archivo .pyx original antes del paso 3), el código original print 1/0 # this will generate an error que ya no se muestra:

 hello 6 Traceback (most recent call last): File "D:\testwhathappenswhenerror.py", line 1, in  import whathappenswhenerror File "whathappenswhenerror.pyx", line 4, in init whathappenswhenerror (whathappenswhenerror.c:824) ZeroDivisionError: integer division or modulo by zero 

¿Pero esto significa que no está incluido en el .pyd? No estoy seguro.