Decompile compiled python binaries (exe, elf) - Retreive from .pyc
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2088318145-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252Frq9WIQinJaxpWMvakjIQ%252Fuploads%252Fgit-blob-ce4fbfd491ab398bd58639023728b416b0758bc1%252Fi3.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=9b767df6&sv=1)
Astuce de prime de bug: inscrivez-vous à Intigriti, une plateforme de prime de bug premium créée par des pirates informatiques, pour les pirates informatiques**! Rejoignez-nous sur https://go.intigriti.com/hacktricks aujourd'hui, et commencez à gagner des primes allant jusqu'à 100 000 $!
Du binaire compilé à .pyc
À partir d'un binaire compilé ELF, vous pouvez obtenir le .pyc avec:
Dans un binaire exe Python compilé, vous pouvez obtenir le .pyc en exécutant :
De .pyc au code Python
Pour les données .pyc (Python compilé), vous devriez commencer par essayer d'extraire le code Python original :
Assurez-vous que le binaire a l'extension ".pyc" (sinon, uncompyle6 ne fonctionnera pas)
Lors de l'exécution de uncompyle6, vous pourriez rencontrer les erreurs suivantes:
Erreur: Numéro magique inconnu 227
Pour résoudre cela, vous devez ajouter le bon numéro magique au début du fichier généré.
Les numéros magiques varient en fonction de la version de Python, pour obtenir le numéro magique de Python 3.8, vous devrez ouvrir un terminal Python 3.8 et exécuter :
Le nombre magique dans ce cas pour python3.8 est 0x550d0d0a
, puis, pour corriger cette erreur, vous devrez ajouter au début du fichier .pyc les octets suivants : 0x0d550a0d000000000000000000000000
Une fois que vous avez ajouté cet en-tête magique, l'erreur devrait être corrigée.
Voici à quoi ressemblera un en-tête magique .pyc python3.8 correctement ajouté :
Erreur : Décompilation des erreurs génériques
D'autres erreurs telles que : class 'AssertionError'>; co_code should be one of the types (<class 'str'>, <class 'bytes'>, <class 'list'>, <class 'tuple'>); is type <class 'NoneType'>
peuvent apparaître.
Cela signifie probablement que vous n'avez pas correctement ajouté le nombre magique ou que vous n'avez pas utilisé le bon nombre magique, donc assurez-vous d'utiliser le bon (ou essayez-en un nouveau).
Vérifiez la documentation de l'erreur précédente.
Outil Automatique
L'outil python-exe-unpacker sert de combinaison de plusieurs outils disponibles dans la communauté conçus pour aider les chercheurs à déballer et décompiler des exécutables écrits en Python, en particulier ceux créés avec py2exe et pyinstaller. Il inclut des règles YARA pour identifier si un exécutable est basé sur Python et confirme l'outil de création.
ImportError : Nom du fichier : 'unpacked/malware_3.exe/pycache/archive.cpython-35.pyc' n'existe pas
Un problème courant rencontré implique un fichier bytecode Python incomplet résultant du processus de déballage avec unpy2exe ou pyinstxtractor, qui n'est pas reconnu par uncompyle6 en raison de l'absence du numéro de version du bytecode Python. Pour résoudre ce problème, une option de préfixe a été ajoutée, qui ajoute le numéro de version du bytecode Python nécessaire, facilitant le processus de décompilation.
Exemple du problème :
Analyse de l'assemblage Python
Si vous n'avez pas pu extraire le code Python "original" en suivant les étapes précédentes, vous pouvez essayer d'extraire l'assemblage Python (mais il n'est pas très descriptif, donc essayez d'extraire à nouveau le code original). Ici, j'ai trouvé un code très simple pour désassembler le binaire .pyc (bonne chance pour comprendre le flux du code). Si le .pyc est de Python2, utilisez Python2 :
Python vers Exécutable
Pour commencer, nous allons vous montrer comment les charges utiles peuvent être compilées avec py2exe et PyInstaller.
Pour créer une charge utile en utilisant py2exe :
Installez le package py2exe depuis http://www.py2exe.org/
Pour la charge utile (dans ce cas, nous l'appellerons hello.py), utilisez un script comme celui de la Figure 1. L'option "bundle_files" avec la valeur de 1 regroupera tout, y compris l'interpréteur Python, dans un seul exe.
Une fois le script prêt, nous émettrons la commande "python setup.py py2exe". Cela créera l'exécutable, comme dans la Figure 2.
Pour créer une charge utile en utilisant PyInstaller :
Installez PyInstaller en utilisant pip (pip install pyinstaller).
Ensuite, nous allons exécuter la commande "pyinstaller --onefile hello.py" (n'oubliez pas que 'hello.py' est notre charge utile). Cela regroupera tout en un exécutable.
Références
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2088318145-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252Frq9WIQinJaxpWMvakjIQ%252Fuploads%252Fgit-blob-ce4fbfd491ab398bd58639023728b416b0758bc1%252Fi3.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=9b767df6&sv=1)
Astuce de prime de bug: inscrivez-vous à Intigriti, une plateforme de prime de bug premium créée par des hackers, pour des hackers! Rejoignez-nous sur https://go.intigriti.com/hacktricks aujourd'hui, et commencez à gagner des primes allant jusqu'à 100 000 $!
Last updated