Source de l'image: pixabay.com

Python est un langage de haut niveau. Bien que beaucoup d'entre vous le pensent, ce n'est pas un langage de programmation. C'est un langage de script. Il est loin du code machine ou du langage machine. Alors qu'est-ce qui rend le python si intéressant? Si vous avez de l'expérience dans le pentesting ou si vous avez eu une conversation avec de nombreux experts en sécurité Web ou analyseurs de logiciels malveillants, ils suggèrent toujours le python comme langage principal pour développer des malwares ou des exploits.

Bien que certaines personnes préfèrent C, C ++ ou perl, je voterais personnellement pour python. La raison étant qu'il n'est pas seulement utile comme outil pour écrire un programme, il est également utile de le casser.

Qu'est-ce que la rétro-ingénierie?

L'ingénierie inverse est un concept très large. On ne peut pas réellement le définir avec des syntaxes simples. Le concept approprié de l'ingénierie inverse consiste à décomposer un code en parties plus simples, à le comprendre, à le modifier et à l'améliorer selon notre propre objectif, puis à le réassembler pour l'adapter à nos besoins. Pour le rendre un peu plus simple, permettez-moi de vous donner quelques exemples courants extrêmes.

Prenons un exemple de téléphone portable Android. Les fabricants créent un stock Rom et le vendent à leurs consommateurs. Mais la plupart du temps, il contient beaucoup de bloatware et devient lent. Ainsi, il y a des gens dans des sites Web comme XDA et androidcentral qui font de l'ingénierie inverse dans la ROM, l'améliorent et la rendent à l'épreuve des retards. Un exemple pratique serait CyanogenMod Rom.

Mais ce n'était qu'un exemple pour vous faire comprendre ce que c'est. L'ingénierie inverse a le même concept mais sa manière trop compliquée qui ne fait que modifier une ROM.

Compilation et Python

Si vous avez de l'expérience en Python, vous savez que lors de l'écriture d'un script python, qu'il s'agisse d'un virus, d'une charge utile, d'un cheval de Troie ou de tout autre fichier, il ne fonctionnera que sur les ordinateurs sur lesquels python est installé. Donc, disons, j'ai écrit un excellent cheval de Troie informatique qui peut contourner n'importe quel antivirus, et je commence à le déployer dans un système Windows, mais si le système Windows n'a pas l'interpréteur Python installé, alors il ne fonctionnera pas. Donc, il faut compiler tous les fichiers du script python écrit dans un exécutable puis le déployer dans le système Windows.

Reverse Engineering Windows Executables

Maintenant, vous savez que nous devons compiler des scripts python pour les exécuter dans Windows, vous devez également savoir qu'il doit y avoir un compilateur qui convertit les scripts python en un exécutable. Oui il y a. Son nom est Py2exe. Py2exe est un programme d'installation simple qui convertit les scripts python en programmes Windows autonomes. Maintenant, il existe également un autre outil qui convertit les exécutables Windows écrits en python en scripts python. Son nom est Pyinstaller Exe Rebuilder.

Pyinstaller exe rebuilder est un outil pour recompiler / inverser les exécutables générés par pyinstaller sans avoir accès au code source. Lorsque vous lancez EXE - il est décompressé en mémoire. Cela inclut les fichiers .pyc (code python converti en bytecode). Fondamentalement, ce que font des outils comme pyinstaller et py2exe, c'est de regrouper les bibliothèques et les dépendances de manière à pouvoir exécuter le fichier EXE autonome sans avoir à les télécharger ou à préparer la machine avec un interpréteur python.

Il existe également une autre boîte à outils qui vous amène très près du code source. Le nom est PyRetic qui signifie Reverse Engineering Obfuscated Python Bytecode. Cette boîte à outils vous permet de ramener un objet en mémoire au code source, sans avoir besoin d'accéder directement au bytecode sur le disque. Cela peut être utile si les applications pyc sur le disque sont obscurcies de plusieurs manières.

Cours recommandés

  • Formation sur Java Hibernate
  • Formation de certification en ligne à Java Spring
  • Programme WordPress
  • Formation de certification en Ruby

Rétroingénierie à la dure

Maintenant, la partie ci-dessus est facile à comprendre et à faire pratiquement lorsque vous maîtrisez les connaissances de base en python. Mais ce n'est pas toujours le cas. Parfois, vous n'avez pas de documentation ou de commentaires dans le script python, et il y a trop de fichiers pour que vous puissiez tout comprendre par vous-même. Maintenant, il y a un livre génial sur cette partie, mais je ne me concentrerai pas beaucoup sur cela.

Le nom du livre est «Travailler efficacement avec le code hérité». Le livre est indépendant de python ou de tout autre langage, et vous donnera une idée de l'ingénierie inverse dans presque tous les langages. L'objectif principal, lorsque vous essayez de comprendre un morceau de code, est la raison pour laquelle vous voulez le comprendre.

Que vous souhaitiez effectuer une rétro-ingénierie du code pour le modifier ou le porter, l'approche pour les deux serait très différente. Ainsi, l'instrumentation du code hérité, avec des batteries et un échafaudage de tests et de traçage / journalisation est la voie cruciale sur le long et difficile slog pour comprendre et modifier en toute sécurité et de manière responsable.

Outils d'ingénierie inverse

Maintenant, il existe une autre méthode pour le rendre un peu facile que vous pouvez suivre en suivant les étapes ci-dessus. Il existe un site appelé Epydoc. Dans ce site, va vérifier le code et créer une documentation pour celui-ci. Le résultat ne sera pas aussi bon que la documentation d'origine, mais il vous donnera au moins une idée de la façon dont cela fonctionne exactement. Et en faisant cela, vous pouvez commencer à écrire votre propre documentation, et après avoir partiellement écrit le document, vous pouvez à nouveau générer le document partiel restant à partir du site pour la partie restante.

Vous pouvez même utiliser l'outil IDE pour analyser le code. Cela vous donne généralement du code, mais plus important dans ce cas, il vous suffit de cliquer-ctrl sur une variable pour voir d'où elle vient. Cela accélère vraiment les choses lorsque vous voulez comprendre le code des autres peuples.

En outre, vous devez apprendre un débogueur. Vous devrez, dans les parties délicates du code, les parcourir dans un débogueur pour voir ce que le code fait réellement. Pythons pdb fonctionne, mais de nombreux IDE ont des débogueurs intégrés, ce qui facilite le débogage. PyReverse de Logilab et PyNSource d'Andy Bulka sont également utiles pour la génération de diagrammes UML.

Il existe un processus pour produire un modèle de classe UML à partir d'une entrée donnée de code source. Avec cela, vous pouvez inverser un instantané de votre base de code en classes UML et en former un diagramme de classes plus loin. En introduisant le contenu du code dans le modèle UML visuel, cela aide les programmeurs ou les ingénieurs logiciels à examiner une implémentation, à identifier les bogues ou les carences potentiels et à rechercher des améliorations possibles.

En dehors de cela, les développeurs peuvent inverser une bibliothèque de code en tant que classes UML et construire un modèle avec elles, comme pour inverser un cadre de collection générique et développer votre propre cadre en étendant le cadre générique. Dans ce chapitre, nous allons passer par l'inverse instantané de Python.

Objets et amorces

Pour bien comprendre le fonctionnement interne de Python, il faut d'abord se familiariser avec la façon dont Python compile et exécute le code. Lorsque le code est compilé en Python, le résultat est un objet de code. Un objet de code est immuable et contient toutes les informations nécessaires à l'interpréteur pour exécuter le code. Une instruction de code d'octet est représentée comme une valeur d'opcode d'un octet suivie d'arguments si nécessaire. Les données sont référencées à l'aide d'un index dans l'une des autres propriétés de l'objet code.

Une chaîne de code d'octet ressemble à ceci:

\ x64 \ x02 \ x64 \ x08 \ x66 \ x02

Le code d'octet Python fonctionne sur une pile d'éléments. Une extension plus entreprenante serait de tenter de décompiler le code d'octet en code source Python lisible, avec les noms d'objet et de fonction. Le code Python peut être distribué sous forme binaire en utilisant le module marshal. Ce module permet de sérialiser et de désérialiser des objets de code à l'aide des fonctions de stockage et de chargement.

Le format binaire le plus couramment rencontré est un fichier Python compilé (.pyc) qui contient un nombre magique, un horodatage et un objet sérialisé. Ce type de fichier est généralement produit par l'interpréteur Python en tant que cache de l'objet compilé pour éviter d'avoir à analyser la source plusieurs fois. Ces techniques reposent sur la facilité d'accès au code octet et aux informations de type.

Avec le code octet d'un objet de code, la logique du code peut être modifiée ou même entièrement remplacée. L'extraction des informations de type peut aider à la compréhension de la conception du programme et à l'identification des fonctions et des objets.

L'obscurcissement et le durcissement du code d'octet d'application seront toujours une course entre les implémenteurs et ceux qui cherchent à le casser. Pour tenter de se défendre contre la récupération de code octet, la première étape logique est vers une solution de traduction d'exécution.

Les propriétés d'un objet de code peuvent être stockées dans n'importe quel format signé, chiffré ou autrement obscurci qui est désobscurci ou traduit pendant l'exécution et utilisé pour instancier un nouvel objet. On pourrait même changer la façon dont les recherches de nom de variable fonctionnent dans l'interpréteur pour masquer les informations de nommage. En ajoutant une couche de traduction entre la recherche des noms réels et les noms dans le code source, un développeur pourrait atténuer davantage les tentatives d'inversion.

Conclusion

Maintenant, après avoir lu tout cela, vous pouvez ressentir le besoin d'aller expérimenter quelques-uns des péages. Voici donc quelques outils qui peuvent vous aider à effectuer une rétro-ingénierie dans votre code python:

  1. Paimei
  1. Sulley
  1. La collection Carrera
  1. PyEmu
  1. IDAPython
  1. ImmDbg

Ce sont tous d'excellents morceaux de code, mais ce qui les rend vraiment remarquables, c'est lorsqu'ils sont utilisés ensemble. Gardez à l'esprit qu'il ne s'agit en aucun cas d'une liste complète, juste celles que j'utilise le plus et je pense montrer comment la flexibilité de python peut rendre une tâche aussi complexe telle que la rétro-ingénierie gérable.

Articles recommandés

Voici quelques articles qui vous aideront à obtenir plus de détails sur la rétro-ingénierie avec Python, alors suivez simplement le lien.

  1. 25 questions et réponses d'entrevue les plus étonnantes sur Python
  2. Premiers pas avec Python et Django pour le développement Web
  3. Quels sont les avantages et les limites de l'utilisation de Python?
  4. Carrières en Python
  5. Outils d'ingénierie inverse