
📦 La lib de manipulation de paquets la plus rapide et la plus simple pour Python
Voici Pypacker : la bibliothèque de manipulation de paquets bas niveau la plus rapide et la plus simple pour Python. Voir les exemples ci-dessous pour ce que vous pouvez en faire.
Si vous souhaitez soutenir ce projet, vous pouvez
via PayPal.
Quelques exemples :
pip/pypi n'est plus pris en charge en raison de leur mécanisme d'authentification compliqué, désolé.
Voir :
Les protocoles eux-mêmes (voir layerXYZ) n'ont généralement pas beaucoup de documentation car ils sont documentés par leurs RFC/standards officiels respectifs.
Les tests sont exécutés comme suit :
cd pypackerexport PYTHONPATH=$(pwd):$PYTHONPATHpython tests/test_pypacker.pyRésultats des tests de performance :
Hardware: Intel CPU, 4 Cores @ 3.2 GHz
Python: CPython v3.10
nr = new results on this machine
Rounds per test: 10000
=====================================
>>> Packet parsing (Ethernet + IP + UDP + DNS): Search UDP port
Time diff: 0.1409761905670166s
nr = 70933 p/s
>>> Packet parsing (Ethernet + IP + TCP + HTTP): Search TCP port
Time diff: 0.3157649040222168s
nr = 31669 p/s
>>> Packet parsing (Ethernet + IP + TCP + HTTP): Reading all header
Time diff: 0.5989120006561279s
nr = 16696 p/s
>>> Parsing first layer (IP + ICMP)
Time diff: 0.014587163925170898s
nr = 685534 p/s
>>> Creating/direct assigning (IP only header)
Time diff: 0.02884364128112793s
nr = 346696 p/s
>>> bin() without change (IP)
Time diff: 0.013646364212036133s
nr = 732795 p/s
>>> Output with change/checksum recalculation (IP)
Time diff: 0.07719659805297852s
nr = 129539 p/s
>>> Basic/first layer parsing (Ethernet + IP + TCP + HTTP)
Time diff: 0.019113540649414062s
nr = 523189 p/s
>>> Changing Triggerlist element value (Ethernet + IP + TCP + HTTP)
Time diff: 0.017654895782470703s
nr = 566415 p/s
>>> Changing dynamic field (Ethernet + IP + TCP + HTTP)
Time diff: 0.006037473678588867s
nr = 1656321 p/s
>>> Direct assigning and concatination (Ethernet + IP + TCP + HTTP)
Time diff: 0.2050457000732422s
nr = 48769 p/s
.>>> Performance test pypacker vs. dpkt vs. scapy
Comparing pypacker, dpkt and scapy performance (parsing Ethernet + IP + TCP + HTTP)
nr = new results on this machine
Rounds per test: 10000
>> Testing pypacker parsing speed
nr = 194382 p/s
>> Testing dpkt parsing speed
Could not execute dpkt tests: ModuleNotFoundError("No module named 'dpkt'")
>> Testing scapy parsing speed
nr = 2775 p/s
Pour toute question restante, veuillez créer un rapport de bug (il sera étiqueté « questions »).
Q: Quelle est la vitesse de pypacker ?
A: Voir les résultats ci-dessus. Pour des résultats détaillés sur votre machine, exécutez les tests :
python tests/test_pypacker.py PerfTestCase
Q: Quels protocoles sont pris en charge ?
A: Actuellement, les protocoles minimum pris en charge sont : 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
Q: Y a-t-il des projets pour prendre en charge [xyz] ?
A: Les nouvelles fonctionnalités sont ajoutées à Pypacker parce que j'en ai besoin ou que des personnes y contribuent - il n'existe pas de plans formels pour ajouter la prise en charge de fonctionnalités particulières dans les versions futures. Une directive générale pour la contribution se trouve dans le fichier HACKING.
Q: Comment puis-je contribuer à ce projet ?
A: Veuillez utiliser le suivi de bugs Gitlab pour les bugs/demandes de fonctionnalités. Veuillez lire le suivi de bugs pour les bugs déjà connus avant d'en signaler un nouveau. Les correctifs peuvent être envoyés via une demande de tirage (pull request).
Q: Il y a un problème xyz avec Pypacker utilisant Windows 3.11/XP/7/8/mobile, etc. Pouvez-vous le corriger ?
A: Les fonctionnalités de base devraient fonctionner avec n'importe quel système d'exploitation. Les fonctionnalités optionnelles peuvent poser problème (par exemple l'intercepteur).
Q: Sous quelle licence Pypacker est-il publié ?
A: C'est la licence GPLv2 (voir le fichier LICENSE pour plus d'informations).
Q: L'appel de copy.deepcopy(some_packet) lève une exception "TypeError: can't pickle Struct objects".
A: Essayez la solution de contournement suivante pour pouvoir sérialiser (pickle) les objets 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()
# This parses ALL layers
packet_print = "%s" % pkt
packet_found = pkt[Telnet]
# Alternative: Use multi-value index-notation. This will stop parsing at any non-matching layer:
packet_found = pkt[Ethernet,IP,TCP,Telnet]
Utilisez pypy (~3 fois plus rapide que CPython en ce qui concerne l'analyse complète des paquets)
Pour encore plus de performances, désactivez les champs automatiques (affecte l'appel de bin(...)) :
pkt = ip.IP(src_s="1.2.3.4", dst_s="1.2.3.5") + tcp.TCP()
# Disable checksum calculation (and any other update) for IP and TCP (only THIS packet instance)
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