这篇文章给大家分享的是有关python如何使用原始套接字发送二层包的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
发送端代码:
#!/usr/bin/python # -*- coding: UTF-8 -*- import socket import struct raw_socket = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x1234)) raw_socket.bind(("eth0", 0)) packet = struct.pack("!6s6sH", "\xff\xff\xff\xff\xff\xff", "\xaa\xaa\xaa\xaa\xaa\xaa", 0x1234) while True: print repr(packet) raw_socket.send(packet + "hello,world!")
1.创建套接字使用地址家族PF_PACKET,类型为SOCK_RAW,自定义类型为0x1234,这个和C语言一模一样。自定义类型我们也可以使用0X0800,这个是ETH_P_IP,相当于我们模拟ip包来发送,那么ip包头和mac包头都需要我们自己填写。现在我们使用0x1234,系统定义之外的协议类型。
2.由于是发送二层包,我们默认网卡没有配置网络,也就是ping不通的情况下,直接绑定网卡上。
3.linux内核中定义的mac包头结构
struct ethhdr { unsigned char h_dest[6]; unsigned char h_source[6]; uint16_t h_proto; //0x1234 };
第一个是目的mac地址,第二个是本机mac地址,第三个是自定义类型必须填写,这样对方也关心这个自定义类型时,协议栈收到二层包才能正确给到对方的套接字。通过这个结构体,所以使用了pack,”!6s6sH”。我这里使用的广播地址发送。
接收端代码:
#!/usr/bin/python # -*- coding: UTF-8 -*- import socket import struct raw_socket = socket.socket(socket.PF_PACKET,socket.SOCK_RAW,socket.htons(0x1234)) while True : packet = raw_socket.recv(1024) data = struct.unpack("!6s6sH12s", packet) print repr(data[0]) print repr(data[1]) print repr(data[2]) print repr(data[3])
感谢各位的阅读!关于“python如何使用原始套接字发送二层包”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。