Jak mám používat RAW socketů v Pythonu?

hlasů
31

Píši aplikaci otestovat síťový ovladač pro manipulaci poškozená data. A já si myslel, odesílání těchto dat pomocí raw socket, takže to nebude opraven TCP-IP stack odesílajícího zařízení.

Píši tuto aplikaci pouze na Linuxu. Mám příklady kódu využití surových sokety System-volání, ale já bych opravdu rád, aby můj test, tak dynamické, jak je to možné, a psát většinu, ne-li všechno v Pythonu.

I googled webové trochu pro vysvětlení a příklady využití surových zásuvek v Pythonu, ale nenašli nic opravdu poučný. Jen aa velmi starý příklad kódu, který ukazuje na myšlenku, ale v žádném případě pracovat.

Z toho, co jsem pochopil, využití Raw Socket v Pythonu je v sémantice na surový zásuvky UNIX téměř totožný, ale bez structsekund, které definují strukturu paketů.

Napadlo mě, jestli by to ještě lepší nepsat raw socket část testu v jazyce Python, ale v C SYSTEM-volání a volání z hlavního Pythonu?

Položena 13/07/2009 v 07:36
zdroj uživatelem
V jiných jazycích...                            


8 odpovědí

hlasů
0

Třída zásuvka by měla pomoci. Pokud tomu tak není, budete muset buď napsat modul Python v C nebo stačí použít C. Viz http://mail.python.org/pipermail/python-list/2001-April/077454.html .

Základní Googling zjištěno, že.

Vlastně jsem se snažil příklad kódu, který „odpočinout“ poukázal. AF_PACKET dělal práci pro mě v Pythonu 2.7.4

Odpovězeno 13/07/2009 v 07:49
zdroj uživatelem

hlasů
2

Je to starý kód, který jste zmínil najít? Vypadá to rozumné, ale já nebyly testovány to sám (nebo používat syrové zásuvek moc). Tento příklad z dokumentace ukazuje, jak používat raw socket čichat paketů, a vypadá to dost podobné.

Odpovězeno 13/07/2009 v 07:50
zdroj uživatelem

hlasů
8

Zásuvky systémová volání (nebo Winsocks, Windows), jsou již zabaleny do standardního modulu socket: intro , reference .

Nikdy jsem nebral raw socket, ale vypadá to, že mohou být použity s tímto modulem:

Poslední příklad ukazuje, jak napsat velmi jednoduchý sítě cvičenými syrového zásuvek na systému Windows. Tento příklad vyžaduje administrátorská práva ke změně rozhraní:

import socket

# the public network interface
HOST = socket.gethostbyname(socket.gethostname())

# create a raw socket and bind it to the public interface
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
s.bind((HOST, 0))

# Include IP headers
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

# receive all packages
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

# receive a package
print s.recvfrom(65565)

# disabled promiscuous mode
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)
Odpovězeno 13/07/2009 v 07:52
zdroj uživatelem

hlasů
4

Nakonec to nejlepší řešení pro tento případ bylo napsat celou věc C, protože to není velký aplikace, takže by už vznikly větší trest psát takovou drobnost u více než 1 jazyka.

Po mnoho hraje s oběma C a python zásuvek RAW, nakonec jsem přednost zásuvky C RAW. RAW sokety vyžadovat úpravy na úrovni bitů méně než 8-bitových skupin pro zápis hlavičky paketů. Někdy se psát pouze 4 bity nebo méně. python definuje žádnou pomoc pro toto, zatímco Linux C má plný API pro toto.

Ale určitě se domnívají, že i kdyby jen to trochu inicializace záhlaví byla ovládal pohodlně v pythonu, bych si nikdy nepoužíval C zde.

Odpovězeno 27/07/2009 v 07:58
zdroj uživatelem

hlasů
39

Udělej to takhle:

První zakázat automatické kontrolní součet síťové karty je:

sudo ethtool -K eth1 tx off

A pak poslat svůj riskantní rám z python:

#!/usr/bin/env python
from socket import socket, AF_PACKET, SOCK_RAW
s = socket(AF_PACKET, SOCK_RAW)
s.bind(("eth1", 0))

# We're putting together an ethernet frame here, 
# but you could have anything you want instead
# Have a look at the 'struct' module for more 
# flexible packing/unpacking of binary data
# and 'binascii' for 32 bit CRC
src_addr = "\x01\x02\x03\x04\x05\x06"
dst_addr = "\x01\x02\x03\x04\x05\x06"
payload = ("["*30)+"PAYLOAD"+("]"*30)
checksum = "\x1a\x2b\x3c\x4d"
ethertype = "\x08\x01"

s.send(dst_addr+src_addr+ethertype+payload+checksum)

Hotovo.

Odpovězeno 16/06/2011 v 16:57
zdroj uživatelem

hlasů
1
s = socket(AF_PACKET, SOCK_RAW)
s = socket(PF_PACKET, SOCK_RAW)

výsledek:

[root@localhost python]# tcpdump -i eth0

capture size 96 bytes
11:01:46.850438 

01:02:03:04:05:06 (oui Unknown) > 01:02:03:04:05:06 (oui Unknown), ethertype Unknown (0x0801), length 85:

        0x0000:  5b5b 5b5b 5b5b 5b5b 5b5b 5b5b 5b5b 5b5b  [[[[[[[[[[[[[[[[
        0x0010:  5b5b 5b5b 5b5b 5b5b 5b5b 5b5b 5b5b 5041  [[[[[[[[[[[[[[PA
        0x0020:  594c 4f41 445d 5d5d 5d5d 5d5d 5d5d 5d5d  YLOAD]]]]]]]]]]]
        0x0030:  5d5d 5d5d 5d5d 5d5d 5d5d 5d5d 5d5d 5d5d  ]]]]]]]]]]]]]]]]
        0x0040:  5d5d 5d00 0000 00                        ]]]....
Odpovězeno 28/09/2012 v 04:15
zdroj uživatelem

hlasů
0

Můžete použít tuto knihovnu v jazyce Python: rawsocketpy umožňuje používat syrové zásuvek na vrstvě 2 => Ne IP / TCP / UDP hlavičky.

#!/usr/bin/env python
from rawsocketpy import RawSocket

sock = RawSocket("wlp2s0", 0xEEFA)
sock.send("some data")
sock.send("personal data", dest="\xAA\xBB\xCC\xDD\xEE\xFF")

nebo forma server:

#!/usr/bin/env python
from rawsocketpy import RawRequestHandler, RawAsyncServerCallback
import time

def callback(handler, server):
    print("Testing")
    handler.setup()
    handler.handle()
    handler.finish()

class LongTaskTest(RawRequestHandler):
    def handle(self):
        time.sleep(1)
        print(self.packet)

    def finish(self):
        print("End")

    def setup(self):
        print("Begin") 

def main():
    rs = RawAsyncServerCallback("wlp2s0", 0xEEFA, LongTaskTest, callback)
    rs.spin()

if __name__ == '__main__':
    main()
Odpovězeno 09/08/2018 v 10:54
zdroj uživatelem

hlasů
0

FTR, pokud chcete level 2 přístupu (Ethernet, RadioTap ...), že nebude možné nativně na Windows (k dnešnímu dni).

Pokud chcete přístup k těm s metodou cross platformě, go-to volba je libpcapi jeho Pythonu (jak to bude používat Npcap/WinPcappro práci v systému Windows).

Máte řadu Pythonu k dispozici pro libpcap, na všech možných úrovních (velmi vysoké nebo velmi nízké).

Moje rada by bylo použití zásuvek scapy( i když jste ji nepoužíváte pitvat ), které implementují jak Native a Libpcap volá, (a nechat si vybrali proti nim conf.use_pcap = True)

from scapy.all import conf
# conf.use_pcap = True (will be automatic if required)
socket = conf.L2socket(iface="eth0")
# On any platforms, you have `get_if_list()` in `scapy.all` available, to see the ifaces available. You could also ignore it to use the default one
Odpovězeno 08/06/2019 v 14:48
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more