Existe-t-il un moyen de décompiler une dll et/ou un fichier .pyd afin d’extraire le code source écrit en Python?
Merci d'avance
Je suppose que les fichiers .pyd/.dll ont été créés en Cython, pas en Python?
Quoi qu’il en soit, c’est généralement impossible, sauf s’il existe un décompilateur spécialement conçu pour le langage à partir duquel le fichier a été compilé. Et même si je connais C, C++, Delphi, .NET et d'autres décompileurs, je n'ai pas encore entendu parler du décompilateur Cython.
Bien entendu, Cython convertit d'abord votre code Python [esque] en code C, ce qui signifie que vous aurez peut-être plus de chance de trouver un décompilateur C, puis de diviser le code Python d'origine en fonction du code C décompilé. À tout le moins, vous vous occuperez ainsi de la traduction d'une langue (relativement) de haut niveau à une autre.
Dans le pire des cas, vous devrez utiliser un désassembleur. Cependant, recréer le code Python à partir de la sortie du désassembleur ne sera pas facile (assez similaire à la divinisation des fonctions biologiques d'un cerveau à partir de formules chimiques de protéines qui composent ses cellules).
Vous pouvez regarder cette question sur des idées et des suggestions concernant divers décompilateurs et désassembleurs, et procéder à votre enquête à partir de là.
Je ne suis pas d'accord avec la réponse acceptée, il semble que oui, le contenu du code source est accessible même dans un .pyd
.
Voyons par exemple ce qui se passe si une erreur survient:
1) Créez ce fichier:
A = 6
print 'hello'
print A
print 1/0 # this will generate an error
2) Compilez-le avec python setup.py build
:
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize("whathappenswhenerror.pyx"), include_dirs=[])
3) Importez maintenant le fichier .pyd dans un fichier python standard:
import whathappenswhenerror
4) Lançons-le avec python testwhathappenswhenerror.py
. Voici la sortie:
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
Comme vous pouvez le voir, la ligne de code print 1/0 # this will generate an error
qui était dans le code source .pyx
est affichée! Même le commentaire est affiché!
4 bis) Si je supprime (ou déplace ailleurs) le fichier .pyx d'origine avant l'étape 3), le code d'origine print 1/0 # this will generate an error
n'est plus affiché:
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
Mais cela signifie-t-il qu'il n'est pas inclus dans le .pyd? Je ne suis pas sûr.