Bildquelle: pixabay.com

Python ist eine Hochsprache. Obwohl viele von Ihnen vielleicht denken, dass es eine Programmiersprache ist, ist dies nicht der Fall. Es ist eine Skriptsprache. Es kommt dem Maschinencode oder der Maschinensprache bei weitem nicht nahe. Was macht dann Python so interessant? Wenn Sie Erfahrung im Pentesting haben oder mit vielen Web-Sicherheitsexperten oder Malware-Analysatoren gesprochen haben, schlagen diese Python immer als ihre Hauptsprache vor, um Malware oder Exploits zu entwickeln.

Während einige Leute C, C ++ oder Perl bevorzugen, würde ich persönlich für Python stimmen. Der Grund dafür ist, dass es nicht nur als Werkzeug zum Schreiben eines Programms nützlich ist, sondern auch, um es zu brechen.

Was ist Reverse Engineering?

Reverse Engineering ist ein sehr umfassendes Konzept. Man kann es nicht mit einfachen Syntaxen definieren. Das richtige Konzept von Reverse Engineering besteht darin, einen Code in einfachere Teile zu zerlegen, ihn zu verstehen, zu modifizieren und zu verbessern, wie es unser eigener Zweck ist, und ihn dann wieder zusammenzusetzen, um ihn an unsere Bedürfnisse anzupassen. Um es ein bisschen einfacher zu machen, möchte ich Ihnen einige extrem häufige Beispiele nennen.

Nehmen wir ein Beispiel für ein Android-Handy. Hersteller erstellen eine Bestandsliste und verkaufen sie an ihre Verbraucher. Aber meistens enthält es viel Bloatware und es wird träge. Es gibt also Leute auf Websites wie XDA und androidcentral, die ihren Weg in das ROM zurückentwickeln, es verbessern und es nacheilungssicher machen. Ein praktisches Beispiel wäre CyanogenMod Rom.

Dies war jedoch nur ein Beispiel, um zu verstehen, was es ist. Reverse Engineering hat das gleiche Konzept, ist aber viel zu kompliziert, als dass nur ein ROM geändert werden müsste.

Compilation und Python

Wenn Sie Erfahrung mit Python haben, wissen Sie, dass es sich beim Schreiben eines Python-Skripts um einen Virus, eine Nutzlast, einen Trojaner oder eine beliebige Datei handelt, die nur auf Computern funktioniert, auf denen Python installiert ist. Nehmen wir an, ich habe einen hervorragenden Computertrojaner geschrieben, der alle Antivirenprogramme umgehen kann, und ich beginne, ihn auf einem Windows-System bereitzustellen. Wenn auf dem Windows-System jedoch kein Python-Interpreter installiert ist, funktioniert er nicht. Man muss also jede Datei des geschriebenen Python-Skripts in eine ausführbare Datei kompilieren und sie dann im Windows-System bereitstellen.

Reverse Engineering von Windows Executables

Jetzt wissen Sie, dass wir Python-Skripte kompilieren müssen, um in Windows ausgeführt zu werden. Sie müssen auch wissen, dass es einen Compiler geben muss, der Python-Skripte in eine ausführbare Datei konvertiert. Ja da ist. Sein Name ist Py2exe. Py2exe ist ein einfaches Installationsprogramm, das Python-Skripte in eigenständige Windows-Programme konvertiert. Jetzt gibt es auch ein anderes Tool, das in Python geschriebene ausführbare Windows-Dateien zurück in Python-Skripte konvertiert. Es heißt Pyinstaller Exe Rebuilder.

Pyinstaller exe rebuilder ist ein Tool zum erneuten Kompilieren / Reverse Engineering von Pyinstaller-generierten ausführbaren Dateien, ohne Zugriff auf den Quellcode zu haben. Wenn Sie die EXE-Datei starten, wird sie im Speicher entpackt. Dies beinhaltet die .pyc-Dateien (Python-Code, der in Bytecode konvertiert wird). Grundsätzlich machen Tools wie pyinstaller und py2exe Paketbibliotheken und Abhängigkeiten zusammen, sodass Sie die eigenständige EXE-Datei ausführen können, ohne sie herunterladen oder den Computer mit einem Python-Interpreter vorbereiten zu müssen.

Es gibt auch ein weiteres Toolkit, mit dem Sie dem Quellcode sehr nahe kommen. Der Name ist PyRetic und steht für Reverse Engineer Obfuscated Python Bytecode. Mit diesem Toolkit können Sie ein Objekt im Speicher zurück in den Quellcode übertragen, ohne dass Sie auf den Bytecode direkt auf der Festplatte zugreifen müssen. Dies kann nützlich sein, wenn die Anwendungs-Pycs auf der Festplatte auf eine von vielen Arten verschleiert sind.

Empfohlene Kurse

  • Training auf Java Hibernate
  • Online-Zertifizierungsschulung in Java Spring
  • WordPress-Programm
  • Zertifizierungsschulung in Ruby

Reverse Engineering auf die harte Tour

Jetzt ist der obige Teil leicht zu verstehen und praktisch zu machen, wenn Sie die Grundkenntnisse in Python beherrschen. Das ist aber nicht immer der Fall. Manchmal enthält das Python-Skript keine Dokumentation oder Kommentare, und es sind möglicherweise auch Dateien vorhanden, die Sie selbst nicht verstehen können. Jetzt gibt es ein großartiges Buch über diesen Teil, aber ich werde mich nicht viel darauf konzentrieren.

Der Name des Buches lautet „Effektiv mit Legacy-Code arbeiten“. Das Buch ist unabhängig von Python oder einer anderen Sprache und gibt Ihnen eine Idee für das Reverse Engineering in fast jeder Sprache. Der Hauptfokus beim Versuch, ein Stück Code zu verstehen, ist der Grund, warum Sie ihn verstehen möchten.

Unabhängig davon, ob Sie den Code zurückentwickeln möchten, um ihn zu ändern oder zu portieren, ist die Vorgehensweise für beide sehr unterschiedlich. Daher ist die Instrumentierung des Legacy-Codes mit Batterien und Gerüsten für Tests und die Verfolgung / Protokollierung der entscheidende Weg auf dem langen, schwierigen Weg zum sicheren und verantwortungsvollen Verstehen und Ändern.

Reverse Engineering-Werkzeuge

Jetzt gibt es eine andere Methode, um es ein bisschen einfacher zu machen, die Sie zusammen mit den obigen Schritten befolgen können. Es gibt eine Site namens Epydoc. Auf dieser Site wird der Code überprüft und eine Dokumentation dafür erstellt. Das Ergebnis ist nicht so gut wie die Originaldokumentation, aber es gibt Ihnen zumindest eine Vorstellung davon, wie es genau funktioniert. Auf diese Weise können Sie mit dem Schreiben Ihrer eigenen Dokumentation beginnen und nach dem teilweisen Schreiben des Dokuments das verbleibende Teildokument für den verbleibenden Teil erneut von der Site generieren.

Sie können sogar das IDE-Tool verwenden, um den Code zu analysieren. Dadurch erhalten Sie in der Regel die Code-Vervollständigung. Noch wichtiger ist jedoch, dass Sie bei gedrückter Strg-Taste auf eine Variable klicken können, um zu sehen, woher sie stammt. Dies beschleunigt die Arbeit erheblich, wenn Sie den Code anderer Leute verstehen möchten.

Außerdem müssen Sie einen Debugger lernen. In kniffligen Teilen des Codes müssen Sie sie in einem Debugger durchgehen, um zu sehen, was der Code tatsächlich tut. Pythons pdb funktioniert, aber viele IDEs haben integrierte Debugger, die das Debuggen erleichtern. PyReverse von Logilab und PyNSource von Andy Bulka sind ebenfalls hilfreich für die Generierung von UML-Diagrammen.

Es gibt einen Prozess zum Erzeugen eines UML-Klassenmodells aus einer gegebenen Eingabe von Quellcode. Mit dieser Option können Sie eine Momentaufnahme Ihrer Codebasis in UML-Klassen umkehren und ein Klassendiagramm erstellen. Durch die Integration von Code-Inhalten in das visuelle UML-Modell können Programmierer oder Software-Ingenieure eine Implementierung überprüfen, potenzielle Fehler oder Mängel identifizieren und nach möglichen Verbesserungen suchen.

Abgesehen davon können Entwickler eine Codebibliothek als UML-Klassen umkehren und mit ihnen ein Modell erstellen. Sie möchten ein generisches Auflistungsframework umkehren und Ihr eigenes Framework entwickeln, indem Sie das generische Framework erweitern. In diesem Kapitel werden wir die sofortige Umkehrung von Python durchgehen.

Objekte und Grundierungen

Um die Funktionsweise von Python vollständig zu verstehen, sollten Sie sich zunächst mit der Kompilierung und Ausführung von Code durch Python vertraut machen. Wenn Code in Python kompiliert wird, ist das Ergebnis ein Codeobjekt. Ein Codeobjekt ist unveränderlich und enthält alle Informationen, die der Interpreter zum Ausführen des Codes benötigt. Ein Bytecode-Befehl wird als 1-Byte-Opcode-Wert dargestellt, gefolgt von Argumenten, falls erforderlich. Daten werden mit einem Index in eine der anderen Eigenschaften des Codeobjekts referenziert.

Eine Bytecode-Zeichenfolge sieht folgendermaßen aus:

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

Python-Bytecode verarbeitet einen Stapel von Elementen. Eine unternehmerischere Erweiterung wäre der Versuch, den Byte-Code wieder in lesbaren Python-Quellcode zu dekompilieren, einschließlich Objekt- und Funktionsnamen. Python-Code kann mithilfe des Marshall-Moduls in binärer Form verteilt werden. Dieses Modul bietet die Möglichkeit, Codeobjekte mithilfe der Funktionen zum Speichern und Laden zu serialisieren und zu deserialisieren.

Das am häufigsten vorkommende Binärformat ist eine kompilierte Python-Datei (.pyc), die eine magische Zahl, einen Zeitstempel und ein serialisiertes Objekt enthält. Dieser Dateityp wird normalerweise vom Python-Interpreter als Cache des kompilierten Objekts erstellt, um zu vermeiden, dass die Quelle mehrmals analysiert werden muss. Diese Techniken basieren auf dem einfachen Zugriff auf Bytecode- und Typinformationen.

Mit dem Bytecode eines Codeobjekts kann die Codelogik geändert oder sogar vollständig ersetzt werden. Das Extrahieren von Typinformationen kann das Verständnis der Programmgestaltung und die Identifizierung von Funktions- und Objektzwecken unterstützen.

Die Verschleierung und Härtung des Anwendungsbytecodes wird immer ein Wettlauf zwischen den Implementierern und denjenigen sein, die versuchen, ihn zu knacken. Der logische erste Schritt zur Abwehr des Bytecode-Abrufs ist eine Laufzeit-Übersetzungslösung.

Die Eigenschaften eines Codeobjekts können in jedem signierten, verschlüsselten oder auf andere Weise verschleierten Format gespeichert werden, das zur Laufzeit entschlüsselt oder übersetzt und zum Instanziieren eines neuen Objekts verwendet wird. Man könnte sogar die Funktionsweise der Variablennamensuche im Interpreter ändern, um Namensinformationen zu verschleiern. Durch Hinzufügen einer Übersetzungsebene zwischen der Suche nach den tatsächlichen Namen und den Namen im Quellcode könnte ein Entwickler Umkehrversuche weiter abschwächen.

Fazit

Nachdem Sie all dies gelesen haben, könnten Sie das Bedürfnis verspüren, ein paar der dortigen Mautgebühren auszuprobieren. Im Folgenden finden Sie einige Tools, mit denen Sie den Weg in Ihren Python-Code zurückverfolgen können:

  1. Paimei
  1. Sulley
  1. Die Carrera Kollektion
  1. PyEmu
  1. IDAPython
  1. ImmDbg

All dies sind großartige Codeteile, aber was sie wirklich auszeichnet, ist, wenn sie zusammen verwendet werden. Denken Sie daran, dies ist keineswegs eine vollständige Liste, nur die, die ich am häufigsten verwende, und zeigen, wie die Flexibilität von Python eine so komplexe Aufgabe wie das Reverse Engineering beherrschbar machen kann.

Empfohlene Artikel

In den folgenden Artikeln erfahren Sie mehr über das Reverse Engineering mit Python. Gehen Sie einfach über den Link.

  1. 25 erstaunlichsten Fragen und Antworten zum Python-Interview
  2. Erste Schritte mit Python und Django für die Webentwicklung
  3. Was sind die Vor- und Nachteile von Python?
  4. Karriere in Python
  5. Reverse Engineering-Werkzeuge