
📦 La libreria di manipolazione dei pacchetti più veloce e semplice per Python
Questo è Pypacker: la libreria di manipolazione di pacchetti di basso livello più veloce e semplice per Python. Vedi gli esempi qui sotto per cosa puoi farci.
Se vuoi supportare questo progetto puoi
tramite PayPal.
Alcuni esempi:
pip/pypi NON è più supportato a causa del loro complicato meccanismo di autenticazione, spiacenti.
Vedi:
I protocolli stessi (vedi layerXYZ) generalmente non hanno molta documentazione perché sono documentati dai rispettivi RFC/standard ufficiali.
I test vengono eseguiti come segue:
cd pypackerexport PYTHONPATH=$(pwd):$PYTHONPATHpython tests/test_pypacker.pyRisultati dei test di performance:
Hardware: Intel CPU, 4 Cores @ 3.2 GHz
Python: CPython v3.10
nr = nuovi risultati su questa macchina
Round per test: 10000
=====================================
>>> Parsing dei pacchetti (Ethernet + IP + UDP + DNS): Ricerca porta UDP
Time diff: 0.1409761905670166s
nr = 70933 p/s
>>> Parsing dei pacchetti (Ethernet + IP + TCP + HTTP): Ricerca porta TCP
Time diff: 0.3157649040222168s
nr = 31669 p/s
>>> Parsing dei pacchetti (Ethernet + IP + TCP + HTTP): Lettura di tutti gli header
Time diff: 0.5989120006561279s
nr = 16696 p/s
>>> Parsing del primo livello (IP + ICMP)
Time diff: 0.014587163925170898s
nr = 685534 p/s
>>> Creazione/assegnazione diretta (solo header IP)
Time diff: 0.02884364128112793s
nr = 346696 p/s
>>> bin() senza modifiche (IP)
Time diff: 0.013646364212036133s
nr = 732795 p/s
>>> Output con modifica/ricalcolo del checksum (IP)
Time diff: 0.07719659805297852s
nr = 129539 p/s
>>> Parsing di base/primo livello (Ethernet + IP + TCP + HTTP)
Time diff: 0.019113540649414062s
nr = 523189 p/s
>>> Modifica del valore di un elemento Triggerlist (Ethernet + IP + TCP + HTTP)
Time diff: 0.017654895782470703s
nr = 566415 p/s
>>> Modifica di un campo dinamico (Ethernet + IP + TCP + HTTP)
Time diff: 0.006037473678588867s
nr = 1656321 p/s
>>> Assegnazione diretta e concatenazione (Ethernet + IP + TCP + HTTP)
Time diff: 0.2050457000732422s
nr = 48769 p/s
.>>> Test di performance pypacker vs. dpkt vs. scapy
Confronto delle performance tra pypacker, dpkt e scapy (parsing di Ethernet + IP + TCP + HTTP)
nr = nuovi risultati su questa macchina
Round per test: 10000
>> Test della velocità di parsing di pypacker
nr = 194382 p/s
>> Test della velocità di parsing di dpkt
Non è stato possibile eseguire i test dpkt: ModuleNotFoundError("No module named 'dpkt'")
>> Test della velocità di parsing di scapy
nr = 2775 p/s
Per qualsiasi domanda rimasta, apri una segnalazione di bug (verrà taggata come "questions").
D: Quanto è veloce pypacker?
R: Vedi i risultati sopra. Per risultati dettagliati sulla tua macchina esegui i test:
python tests/test_pypacker.py PerfTestCase
D: Quali protocolli sono supportati?
R: Attualmente i protocolli minimi supportati sono: 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
D: Ci sono piani per supportare [xyz]?
R: Le nuove funzionalità vengono aggiunte a Pypacker perché mi servono o perché le persone le contribuiscono - non ci sono piani formali per aggiungere il supporto a particolari funzionalità in release future. Una linea guida generale per i contributi si trova nel file HACKING.
D: Come posso contribuire a questo progetto?
R: Per favore usa il bug-tracker di Gitlab per bug/richieste di funzionalità. Leggi il bugtracker per i bug già noti prima di aprirne uno nuovo. Le patch possono essere inviate tramite pull request.
D: C'è il problema xyz con Pypacker su Windows 3.11/XP/7/8/mobile ecc. Puoi sistemarlo?
R: Le funzionalità di base dovrebbero funzionare con qualsiasi sistema operativo. Quelle opzionali possono causare problemi (ad es. l'interceptor).
D: Sotto quale licenza è rilasciato Pypacker?
R: È la licenza GPLv2 (vedi il file LICENSE per maggiori informazioni).
D: La chiamata copy.deepcopy(some_packet) solleva un'eccezione "TypeError: can't pickle Struct objects".
R: Prova il seguente workaround per poter fare il pickle degli oggetti Struct:
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()
# Questo esegue il parsing di TUTTI i livelli
packet_print = "%s" % pkt
packet_found = pkt[Telnet]
# Alternativa: usa la notazione a indici multipli. Questo interromperà il parsing a qualsiasi livello non corrispondente:
packet_found = pkt[Ethernet,IP,TCP,Telnet]
Usa pypy (~3 volte più veloce di CPython per quanto riguarda il parsing completo dei pacchetti)
Per ancora più performance disabilita i campi automatici (influisce sulla chiamata a bin(...)):
pkt = ip.IP(src_s="1.2.3.4", dst_s="1.2.3.5") + tcp.TCP()
# Disabilita il calcolo del checksum (e qualsiasi altro aggiornamento) per IP e TCP (solo QUESTA istanza di pacchetto)
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