web-dev-qa-db-fra.com

Est-il possible de décompiler un fichier .dll/.pyd pour extraire le code source Python?

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

7
Youssef Imam

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à.

5
Lav

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:

ce qui se passe quand nous sommes.pyx

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

2) Compilez-le avec 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) Importez maintenant le fichier .pyd dans un fichier python standard:

test whathappenswhenerror.py

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.

2
Basj