
Quellcode für das Buch "Violent Python" von TJ O'Connor. Der Code wurde vollständig zu Python 3 konvertiert, gemäß PEP8-Standards neu formatiert und umstrukturiert, um Abhängigkeitsprobleme durch die Implementierung veralteter Bibliotheken zu beseitigen.
Quellcode für das Buch »Violent Python« von TJ O’Connor. Der Code wurde vollständig nach Python 3 konvertiert, gemäß PEP8-Standards neu formatiert und refaktorisiert, um Abhängigkeitsprobleme durch die Verwendung veralteter Bibliotheken zu beseitigen.
Eine ähnliche Konvertierung habe ich selbst für den Quellcode des Buches »Black Hat Python« von Justin Seitz bereitgestellt. Schauen Sie sich diese hier an, falls Sie es noch nicht getan haben.
Erstellen Sie einfach ein neues Verzeichnis (DIR) für das Projekt, richten Sie eine virtuelle Umgebung oder venv dafür ein (empfohlen), klonen Sie dieses Repository mit git clone und installieren Sie die Abhängigkeiten mit pip install.
user@host:~/DIR$ git clone https://github.com/EONRaider/violent-python3
user@host:~/DIR$ python3 -m venv venv
user@host:~/DIR$ source venv/bin/activate
(venv) user@host:~/DIR$ pip install -r requirements.txt
optparse wurde im gesamten Quellcode durch argparse ersetzt. Die gesamte Argumentanalyse befindet sich nun im __main__-Ausführungsbereich jeder Datei. Alle CLI-Argumente, die für die Ausführung der Skripte zwingend erforderlich waren, aber im Originalcode als optional behandelt wurden, werden nun als Positionsargumente implementiert. Ein usage-Prompt ist nun für alle Skripte verfügbar, die argparse verwenden, indem das Argument -h an die CLI übergeben wird. Die Verantwortlichkeiten sowohl des Boundary- als auch des Controller-Objekts an den CLI-Parser zu delegieren, ist definitiv nicht die beste Wahl in Bezug auf die Softwarearchitektur, wurde aber aufgrund der Notwendigkeit der Übereinstimmung mit der Absicht des ursprünglichen Programmierers so belassen.PEP 8: E722 do not use bare except wurden mit spezifischeren Ausnahmeklauseln umgestaltet.close()-Methode für die geöffneten Datei-/Datenbankobjekte aufzurufen. Aus diesem Grund wurden alle Instanzen der Datei- und Datenbankmanipulation durch die Verwendung von Kontextmanagern umgestaltet.Dateien, die nicht unten aufgeführt sind, können so betrachtet werden, dass sie auf die eine oder andere Weise wie in den »Hinweisen« festgelegt umgestaltet wurden.
chapter01/vuln_scanner.py war so strukturiert, dass eine nicht vorhandene Datei zur Laufzeit zu einer OSError-Ausnahme führen würde. Aus diesem Grund wurde die Iterationssteuerung, die check_vulns() aufruft, in die in der Hauptfunktion definierte Bedingungsanweisung verschoben.chapter02/nmap_scan.py implementierte eine Hauptfunktion ausschließlich zum Zweck des Aufrufs der veralteten Bibliothek optparse, die durch argparse ersetzt wurde. Deshalb wurde die Hauptfunktion entfernt. Eine Iterationssteuerungsstruktur, die im Originalcode Teil des optparse-Aufrufs war, wurde so implementiert, dass ein neuer Aufruf von nmap für jeden gescannten Port ausgeführt wurde. Die Iteration wurde in die Funktion nmap_scan verschoben, um die Verschwendung von Rechenzyklen zu vermeiden.chapter02/ssh_command.py hatte seinen Initialisierungscode in den __main__-Ausführungsbereich verschoben. Die Namen der Variablen im äußeren Gültigkeitsbereich, die früher mit den Namen von Funktionsparametern kollidierten, wurden geändert. Die zurückgegebenen Eingabeaufforderungsinformationen waren ursprünglich kodiert und wurden nun dekodiert, um eine bessere Lesbarkeit zu ermöglichen.Beiträge in anderen Sprachen können hier eingesehen werden:
Als gesunder Menschenverstand gilt: Besprechen Sie zuerst die Änderung, die Sie an diesem Repository vornehmen möchten, über ein Issue.
# -*- coding: utf-8 -*-), wurde aufgrund der Standardisierung von UTF-8 als Standardkodierung für Python 3 (Ersatz von ASCII aus Python 2) eliminiert.chapter02/ssh_brute.py importierte pxssh als eigenständige Bibliothek, aber tatsächlich ist es eine Bibliothek unter der pexpect-Bibliothek. Der Fehler führte zu einem ModuleNotFoundError und wurde korrigiert. Der Code selbst, wie er im Buch präsentiert wird, war mit Einrückungsfehlern übersät, die ihn unbrauchbar machten, und wurde in einen funktionsfähigen Zustand gebracht.chapter02/ssh_brutekey.py erforderte eine Reihe von vorab generierten Schlüsseln, um zu funktionieren; außerdem verweist das Buch den Leser auf eine URL, um solche Schlüssel zu erhalten, die derzeit eine 403-Antwort zurückgibt. Aus diesem Grund wurde ein komprimiertes Archiv, das die Schlüssel enthält, zum Unterverzeichnis chapter02 hinzugefügt.chapter02/ssh_botnet.py hatte eine nicht verwendete Importanweisung für optparse, die entfernt wurde. Es sieht aus wie ein Fragment aus einem abgebrochenen Versuch, ein CLI für dieses Skript zu implementieren. Überraschenderweise wurde es einfach so hängen gelassen, sogar in der gedruckten Version des Buches. Der Code, der das Botnetz initialisiert und seine Befehle ausgibt, wurde aus Gründen der Standardisierung unter den __main__-Ausführungsbereich organisiert. Die beiden an die Bots ausgegebenen Befehle wurden vereinheitlicht, um eine unnötige Anzahl von Rückgabeanweisungen zu vermeiden.chapter02/conficker.py entfernte einen nicht verwendeten Aufruf der sys-Bibliothek.chapter03/discover_networks.py musste neu implementiert werden, anstatt nur umgestaltet zu werden. Es verwendete ursprünglich nicht nur die veraltete Bibliothek mechanize, sondern interagierte auch mit dem WiGLE-Dienst auf eine Weise, die nicht mehr notwendig ist, da WiGLE jetzt eine API bereitstellt. Aus diesem Grund wurde der Code standardisiert und eine neue Funktion wigle_print unter Verwendung der Bibliothek requests implementiert, um eine authentifizierte HTTP-GET-Anfrage an WiGLE zu senden. Die Antwort gibt ein JSON-Objekt zurück, auf das direkt zugegriffen werden kann, wodurch die Verwendung der re-Bibliothek ebenfalls überflüssig wird. Es wurde eine Ausnahmebehandlung hinzugefügt, um das Skript in die Lage zu versetzen, mit Fehlerantwortmeldungen der API umzugehen. Beachten Sie, dass dieses Skript von winreg abhängt, das nur unter Python-Installationen unter Microsoft Windows läuft und während der Ausführung Administratorrechte für den Zugriff auf die Registrierungsschlüssel erfordert. Für den Zugriff auf die API muss ein Konto unter https://wigle.net/account registriert werden.chapter03/pdf_read.py verwendet jetzt die Bibliothek PyPDF4 anstelle des veralteten PyPDF. Das Buch verweist im Text auf eine bestimmte PDF-Datei, und diese wurde zum Unterverzeichnis chapter03 hinzugefügt.chapter03/exif_fetch.py erforderte ein Argument features="html.parser" beim Aufruf des Konstruktors des BeautifulSoup-Objekts. Es wurde in Zeile 15 hinzugefügt. Dieses Skript funktioniert nur bei Webanwendungen, die Bilder zwischen img-HTML-Tags einbetten (eine seltene Praxis bei modernen Webanwendungen, die stark auf JavaScript angewiesen sind).chapter03/skype_parse.py verwendet die Datei main.db als Beispiel. Sie wurde der Einfachheit halber zum Unterverzeichnis chapter03/skype_profile hinzugefügt.chapter03/firefox_parse.py verwendet mehrere .sqlite-Dateien als Beispiele. Sie wurden der Einfachheit halber zum Unterverzeichnis chapter03/firefox_profile hinzugefügt.chapter03/iphone_messages.py referenziert iPhone-Sicherungsdateien, die vom Autor nicht zur Verfügung gestellt wurden. Aus diesem Grund wurde der Code umgestaltet, bleibt aber ungetestet.chapter04/geo_ip.py verwendete die veraltete Bibliothek pygeoip. Wie von seinem Ersteller vorgeschlagen, sollte jetzt geoip2 verwendet werden. Es wurde versucht, den neu implementierten Code so ähnlich wie möglich an die ursprüngliche Implementierung im Buch zu halten, aber einige Änderungen mussten vorgenommen werden, um die neue Paketstruktur von geoip2 und seinen Attributen zu berücksichtigen. Die für die Ausführung des Skripts erforderliche Datenbankdatei wurde von MaxMind heruntergeladen und im Verzeichnis chapter04 bereitgestellt. Ein CLI wurde ebenfalls mit argparse implementiert.chapter04/print_direction.py löste beim Öffnen der Datei in der ursprünglichen Implementierung eine UnicodeDecodeError-Ausnahme aus. Dies wurde behoben, indem dem Kontextmanager, der die Datei verwaltet, ein rb-Argument hinzugefügt wurde.chapter04/find_ddos.py druckte die Quelladresse des Hivemind-Angriffs als dessen Zieladresse, was die Ausgabe unbrauchbar machte. Die korrekte Variable dst wird jetzt auf stdout ausgegeben. Das Buch verweist auf eine Datei namens traffic.pcap, die vom Autor nicht zur Verfügung gestellt wurde, daher wurde der Code umgestaltet, bleibt aber ungetestet.chapter04/test_domain_flux.py gibt zurück, dass bei der Analyse der vom Autor bereitgestellten pcap-Datei keine unbeantworteten Anfragen gestellt wurden. Aus irgendeinem Grund haben die Pakete selbst keinen Wert für das DNS-Resource-Record-Feld gesetzt, sodass die Bedingung in der Funktion dns_QR_test immer als falsch ausgewertet wird. In diesem Fall wurde die Bedingung zur Auswertung des DNSRR-Feldes aus der Bedingungsanweisung entfernt, und alle UDP-Pakete, die als Quelle Port 53 haben, werden jetzt analysiert. Dies führt zu weniger effizientem Code, gibt aber zumindest die Ergebnisse wie im Buch beabsichtigt aus.chapter05/blue_bug.py verwendet die Bibliothek PyBluez, die wiederum die Bibliothek BlueZ und Header-Dateien benötigt, wie in ihren Installationsanweisungen angegeben. Diese Abhängigkeiten müssen vor der Installation von PyBluez als Abhängigkeit installiert werden. Unter Linux kann dies mit dem Befehl apt install bluetooth libbluetooth-dev durchgeführt werden. Der Originalcode verweist auf ein nicht vorhandenes Objekt client_sock, das durch phone_sock ersetzt wurde.chapter05/ftp_sniff.py hatte einen logischen Fehler, der dazu führte, dass ein abgehörter Benutzername, aber kein Passwort angezeigt wurde, aufgrund einer schlechten Implementierung einer if...else-Anweisung. Dies wurde korrigiert, indem die Bedingungsanweisung durch eine verschachtelte if-Klausel ersetzt wurde.chapter05/ninja_print.py benötigt die Bibliothek obexftp, um zu funktionieren. Diese Bibliothek wurde für Python 2 geschrieben und wurde bis heute nicht portiert oder durch eine äquivalente ersetzt, daher bleibt der Code in seiner Python-2-Version, wie vom Autor geschrieben.chapter05/__init__.py und chapter06/__init__.py wurden hinzugefügt, um das Importieren von Modulen aus chapter05/dup.py bzw. chapter06/anon_browser.py zu ermöglichen.chapter06/anon_proxy.py wurde mit der Python-3-Bibliothek MechanicalSoup neu implementiert. Es integriert die Änderungen, die für proxy_test.py, useragent_test.py und print_cookies.py erforderlich waren.chapter06/anon_browser.py wurde ebenfalls mit MechanicalSoup neu implementiert und durchlief einige Code-Änderungen. Die Bibliothek cookielib wurde durch http.cookiejar in der Konstruktormethode für die Klasse AnonBrowser ersetzt, und der Parameter user_agents akzeptiert jetzt eine Liste von Zeichenketten anstelle eines Tupels.chapter06/link_parser.py wurde umgestaltet, indem neue Methoden zur Handhabung der Implementierungen von re und bs4 verwendet wurden.