
📦 Die schnellste und einfachste Bibliothek zur Paketmanipulation für Python
Dies ist Pypacker: Die schnellste und einfachste Low-Level-Paketmanipulationsbibliothek für Python. Siehe unten Beispiele für das, was Sie damit machen können.
Wenn Sie dieses Projekt unterstützen möchten, können Sie
via PayPal spenden.
Einige Beispiele:
pip/pypi wird aufgrund ihres komplizierten Authentifizierungsmechanismus leider nicht mehr unterstützt.
Siehe:
Die Protokolle selbst (siehe layerXYZ) haben im Allgemeinen nicht viel Dokumentation, da diese durch ihre jeweiligen RFCs/offiziellen Standards dokumentiert sind.
Tests werden wie folgt ausgeführt:
cd pypackerexport PYTHONPATH=$(pwd):$PYTHONPATHpython tests/test_pypacker.pyLeistungstestergebnisse:
Hardware: Intel CPU, 4 Cores @ 3.2 GHz
Python: CPython v3.10
nr = neue Ergebnisse auf diesem Rechner
Runden pro Test: 10000
=====================================
>>> Paketparsen (Ethernet + IP + UDP + DNS): UDP-Port suchen
Zeitdifferenz: 0.1409761905670166s
nr = 70933 p/s
>>> Paketparsen (Ethernet + IP + TCP + HTTP): TCP-Port suchen
Zeitdifferenz: 0.3157649040222168s
nr = 31669 p/s
>>> Paketparsen (Ethernet + IP + TCP + HTTP): Alle Header lesen
Zeitdifferenz: 0.5989120006561279s
nr = 16696 p/s
>>> Parsen der ersten Schicht (IP + ICMP)
Zeitdifferenz: 0.014587163925170898s
nr = 685534 p/s
>>> Erstellen/direktes Zuweisen (nur IP-Header)
Zeitdifferenz: 0.02884364128112793s
nr = 346696 p/s
>>> bin() ohne Änderung (IP)
Zeitdifferenz: 0.013646364212036133s
nr = 732795 p/s
>>> Ausgabe mit Änderung/Prüfsummen-Neuberechnung (IP)
Zeitdifferenz: 0.07719659805297852s
nr = 129539 p/s
>>> Basis-/Erstschichtparsen (Ethernet + IP + TCP + HTTP)
Zeitdifferenz: 0.019113540649414062s
nr = 523189 p/s
>>> Ändern eines Triggerlist-Elementwerts (Ethernet + IP + TCP + HTTP)
Zeitdifferenz: 0.017654895782470703s
nr = 566415 p/s
>>> Ändern eines dynamischen Felds (Ethernet + IP + TCP + HTTP)
Zeitdifferenz: 0.006037473678588867s
nr = 1656321 p/s
>>> Direktes Zuweisen und Verketten (Ethernet + IP + TCP + HTTP)
Zeitdifferenz: 0.2050457000732422s
nr = 48769 p/s
.>>> Leistungstest pypacker vs. dpkt vs. scapy
Vergleich der Leistung von pypacker, dpkt und scapy (Parsen von Ethernet + IP + TCP + HTTP)
nr = neue Ergebnisse auf diesem Rechner
Runden pro Test: 10000
>> Teste pypacker Parsing-Geschwindigkeit
nr = 194382 p/s
>> Teste dpkt Parsing-Geschwindigkeit
Konnte dpkt-Tests nicht ausführen: ModuleNotFoundError("No module named 'dpkt'")
>> Teste scapy Parsing-Geschwindigkeit
nr = 2775 p/s
Bei verbleibenden Fragen bitte einen Fehlerbericht einreichen (wird als "questions" getaggt).
F: Wie schnell ist pypacker?
A: Siehe Ergebnisse oben. Für detaillierte Ergebnisse auf Ihrem Rechner führen Sie die Tests aus:
python tests/test_pypacker.py PerfTestCase
F: Welche Protokolle werden unterstützt?
A: Derzeit werden mindestens folgende Protokolle unterstützt: Ethernet, Radiotap, IEEE80211, ARP, DNS, STP, PPP, OSPF, VRRP, DTP, IP, ICMP, PIM, IGMP, IPX, TCP, UDP, SCTP, HTTP, NTP, RTP, DHCP, RIP, SIP, Telnet, HSRP, Diameter, SSL, TPKT, Pmap, Radius, BGP
F: Gibt es Pläne, [xyz] zu unterstützen?
A: Neue Funktionen werden zu Pypacker hinzugefügt, wenn ich sie benötige oder Leute sie beitragen - es gibt keine formalen Pläne, bestimmte Funktionen in zukünftigen Versionen zu unterstützen. Eine allgemeine Richtlinie für Beiträge finden Sie in der Datei HACKING.
F: Wie kann ich zu diesem Projekt beitragen?
A: Bitte verwenden Sie den Gitlab-Bugtracker für Fehler/Feature-Anfragen. Bitte lesen Sie den Bugtracker für bereits bekannte Fehler, bevor Sie einen neuen einreichen. Patches können per Pull-Request gesendet werden.
F: Es gibt Problem xyz mit Pypacker unter Windows 3.11/XP/7/8/mobile usw. Können Sie das beheben?
A: Die grundlegenden Funktionen sollten mit jedem Betriebssystem funktionieren. Optionale können Probleme bereiten (z. B. Interceptor).
F: Unter welcher Lizenz wird Pypacker veröffentlicht?
A: Es ist die GPLv2-Lizenz (siehe LICENSE-Datei für weitere Informationen).
F: Aufruf von copy.deepcopy(some_packet) löst eine Ausnahme "TypeError: can't pickle Struct objects" aus.
A: Versuchen Sie den folgenden Workaround, um Struct-Objekte pickeln zu können:
import struct, copyreg
def pickle_struct(s):
return struct.Struct, (s.format,)
copyreg.pickle(struct.Struct, pickle_struct)
pkt_eth, pkt_ip, pkt_tcp, pkt_http = pkt[
None,
(None, lambda b: b.__class__ in [ip.IP, ip6.IP6]),
(tcp.TCP, lambda c: c.dport==80),
http.HTTP
]
...
pkt = Ethernet() + IP() + TCP()
# Dies parst ALLE Schichten
packet_print = "%s" % pkt
packet_found = pkt[Telnet]
# Alternative: Verwenden Sie die Mehr-Wert-Indexnotation. Dies stoppt das Parsen bei jeder nicht passenden Schicht:
packet_found = pkt[Ethernet,IP,TCP,Telnet]
Verwenden Sie pypy (~3x schneller als CPython in Bezug auf vollständiges Paketparsen)
Für noch mehr Leistung deaktivieren Sie Auto-Felder (beeinflusst den Aufruf von bin(...)):
pkt = ip.IP(src_s="1.2.3.4", dst_s="1.2.3.5") + tcp.TCP()
# Deaktivieren Sie die Prüfsummenberechnung (und jede andere Aktualisierung) für IP und TCP (nur DIESE Paketinstanz)
pkt.sum_au_active = False
pkt.tcp.sum_au_active = False
bts = pkt.bin(update_auto_fields=False)
sysctl -w net.core.rmem_max=12582912
sysctl -w net.core.rmem_default=12582912
sysctl -w net.core.wmem_max=12582912
sysctl -w net.core.wmem_default=12582912
sysctl -w net.core.optmem_max=2048000
sysctl -w net.core.netdev_max_backlog=5000
sysctl -w net.unix.max_dgram_qlen=1000
sysctl -w net.ipv4.tcp_rmem="10240 87380 12582912"
sysctl -w net.ipv4.tcp_wmem="10240 87380 12582912"
sysctl -w net.ipv4.tcp_mem="21228 87380 12582912"
sysctl -w net.ipv4.udp_mem="21228 87380 12582912"
sysctl -w net.ipv4.tcp_window_scaling=1
sysctl -w net.ipv4.tcp_timestamps=1
sysctl -w net.ipv4.tcp_sack=1