
📦 La biblioteca de manipulación de paquetes más rápida y simple para Python
Este es Pypacker: la biblioteca de manipulación de paquetes de bajo nivel más rápida y simple para Python. Vea los ejemplos a continuación para ver qué puede hacer con ella.
Si desea apoyar este proyecto puede
a través de PayPal.
Algunos ejemplos:
pip/pypi ya NO tiene soporte debido a su complicado mecanismo de autenticación, lo sentimos.
Vea:
Los protocolos en sí (ver layerXYZ) generalmente no tienen mucha documentación porque están documentados por sus respectivos RFCs/estándares oficiales.
Las pruebas se ejecutan de la siguiente manera:
cd pypackerexport PYTHONPATH=$(pwd):$PYTHONPATHpython tests/test_pypacker.pyResultados de las pruebas de rendimiento:
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
Para cualquier pregunta pendiente, por favor reporte un error (será etiquetado como "questions").
P: ¿Qué tan rápido es pypacker?
R: Vea los resultados anteriores. Para obtener resultados detallados en su máquina, ejecute las pruebas:
python tests/test_pypacker.py PerfTestCase
P: ¿Qué protocolos están soportados?
R: Actualmente los protocolos mínimos soportados son: 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
P: ¿Hay planes para soportar [xyz]?
R: Las nuevas características se agregan a Pypacker como resultado de que yo las necesite o de que la gente las contribuya; no existen planes formales para agregar soporte para características particulares en futuras versiones. Se pueden encontrar pautas generales para contribuir en el archivo HACKING.
P: ¿Cómo puedo contribuir a este proyecto?
R: Por favor, use el rastreador de errores de Gitlab para informar errores/solicitar funciones. Lea el rastreador de errores para conocer los errores ya conocidos antes de reportar uno nuevo. Los parches se pueden enviar mediante pull request.
P: Hay un problema xyz con Pypacker usando Windows 3.11/XP/7/8/mobile etc. ¿Puede solucionarlo?
R: Las funciones básicas deberían funcionar con cualquier sistema operativo. Las opcionales pueden causar problemas (por ejemplo, interceptor).
P: ¿Bajo qué licencia se distribuye Pypacker?
R: Es la licencia GPLv2 (consulte el archivo LICENSE para obtener más información).
P: Llamar a copy.deepcopy(some_packet) lanza una excepción "TypeError: can't pickle Struct objects".
R: Pruebe la siguiente solución alternativa para poder serializar objetos 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]
Use pypy (~3 veces más rápido que CPython en relación con el análisis completo de paquetes)
Para aún más rendimiento, desactive los campos automáticos (afecta la llamada a 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