¿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:
A = 6 print 'hello' print A print 1/0 # this will generate an error
2) python setup.py build
con python setup.py build
:
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:
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.