Python中利用原始套接字进行网络编程的示例

   这篇文章主要介绍了Python中利用原始套接字进行网络编程的示例,使用sock_raw接受和发送数据包可以避开网络协议的诸多限制,需要的朋友可以参考下

  在实验中需要自己构造单独的HTTP数据报文,而使用SOCK_STREAM进行发送数据包,需要进行完整的TCP交互。

  因此想使用原始套接字进行编程,直接构造数据包,并在IP层进行发送,即采用SOCK_RAW进行数据发送。

  使用SOCK_RAW的优势是,可以对数据包进行完整的修改,可以处理IP层上的所有数据包,对各字段进行修改,而不受UDP和TCP的限制。

  下面开始构造HTTP数据包,

  IP层和TCP层使用python的Impacket库,http内容自行填写。

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

#!/usr/bin/env python
 
#-------------------------------------------------------------------------------
# Name: raw_http.py
# Purpose: construct a raw http get packet
#
# Author: Yangjun
#
# Created: 08/02/2014
# Copyright: (c) Yangjun 2014
# Licence: <your licence>
#-------------------------------------------------------------------------------
 
import sys
import socket
from impacket import ImpactDecoder, ImpactPacket
 
def main():
 
if len(sys.argv) < 3:
print "Use: %s <src ip> <dst ip>" % sys.argv[0]
print "Use: %s <src ip> <dst ip> <cnt>" % sys.argv[0]
sys.exit(1)
elif len(sys.argv) == 3:
src = sys.argv[1]
dst = sys.argv[2]
cnt = 1
elif len(sys.argv) ==4:
src = sys.argv[1]
dst = sys.argv[2]
cnt = sys.argv[3]
else:
print "Input error!"
sys.exit(1)
#print src, dst
ip = ImpactPacket.IP()
ip.set_ip_src(src)
ip.set_ip_dst(dst)
 
# Create a new ICMP packet of type ECHO.
icmp = ImpactPacket.ICMP()
tcp = ImpactPacket.TCP()
tcp.set_th_sport(55968)
tcp.set_th_dport(80)
tcp.set_th_seq(1)
tcp.set_th_ack(1)
tcp.set_th_flags(0x18)
tcp.set_th_win(64)
 
tcp.contains( ImpactPacket.Data("GET /att/DIYLife/41264/528 HTTP/1.1rnHost: 192.168.111.1rnAccept-Encoding: identityrnrn"))
 
ip.contains(tcp)
 
# Open a raw socket. Special permissions are usually required.
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
seq_id = 0
while cnt >= 1:
# Calculate its checksum.
seq_id = seq_id + 1
tcp.set_th_seq(seq_id)
tcp.calculate_checksum()
 
# Send it to the target host.
s.sendto(ip.get_packet(), (dst,80))
cnt= cnt -1
 
if __name__ == '__main__':
main()

时间: 2024-12-03 03:20:41

Python中利用原始套接字进行网络编程的示例的相关文章

用原始套接字实现网络监听

1.引言 网络监听工具(sinff)是提供给网络管理员的一类管理工具.在以太网中(Ethernet),当网络上连接多台计算机时,某瞬间只能有一台计算机可以传送数据.以太网中,数据是以被称为帧的数据结构为单位进行交换的.通常,在计算机网络上交换的数据结构体的单位是数据包.而在以太网中则称为帧.这种数据包是由记录着数据包发送给对方所必需信息的报头部分和记录着发送信息的报文部分构成.报头部分包含接收端的地址.发送端的地址.数据校验码等信息. 在以太网上,帧(数据包)是被称为带碰撞检测的载波侦听多址访问

Java套接字(Socket)网络编程入门_java

网络应用模式主要有: 主机/终端模式:集中计算,集中管理: 客户机/服务器(Client/Server,简称C/S)模式:分布计算,分布管理: 浏览器/服务器模式:利用Internet跨平台. www(万维网)就是建立在客户机/服务器模式上,以HTML语言和HTTP协议为基础,能够提供各种Internet服务的信息浏览系统.网络信息放在主机的不同位置,www服务器利用超文本链路链接各项信息.www客户机(浏览器Brower)负责与服务器建立联系,向服务器发送请求,处理HTML超媒体,提供图形用户

数据在协议栈中的传递-用原始套接字截取数据链路层数据,那这包数还会在TCP/IP协议栈中传递吗

问题描述 用原始套接字截取数据链路层数据,那这包数还会在TCP/IP协议栈中传递吗 用原始套接字写了一个小程序,装在本机后,能够截取本机的发送/接收数据,想问一下,比如原始套接字程序在数据链路层截取到一个别人发给本机的数据,原始套接字程序截取到后,这包数还会向网络层上传,一步步再送到截取这包数的真正端口进程吗?会不会我一截取,该收到这包数的进程就收不到了呢? 解决方案 看你怎么截取的,一般是拦截,不影响数据包的发送. 解决方案二: 如果你不是通过驱动等,很可能你拿到的只是一份拷贝,所以数据还是继

sock-怎么用python和原始套接字发送一tcp数据包?

问题描述 怎么用python和原始套接字发送一tcp数据包? 这段代码直接把数据packet_base作为ip的载荷了,怎么才能是packet_base作为tcp的载荷呢?谢谢 sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP) sock.sendto(packet_base, 0, (IP_PACKET_IN, 12321)) sock.close() 解决方案 把你的代码修改成如下就是TCP啦:

原始套接字发送自己封装的TCP/IP包,加线程后速度也上不去是什么原因

问题描述 原始套接字发送自己封装的TCP/IP包,加线程后速度也上不去是什么原因 情况是这样,我需要发送自己构造的数据包,将数据封在TCP包中,然后再封在IP包中,最后再发送出去 现在要尽可能达到最快的发送速度,我的方案是先创建一个字符串数组,用于存放已经构造好的数据包,然后程序运行时先把数据包构造好并保存在数组中,然后在启动发包的线程 我的带宽是1000M,当启动一个线程时,发包速度大约是170M,CPU占用率40%左右,但是加到10个进程时速度也就是190M,cpu 50%---60%,加到

原始套接字 tcp-用原始套接字发送TCP数据包,显示发送成功但是接收不到,求教

问题描述 用原始套接字发送TCP数据包,显示发送成功但是接收不到,求教 我需要自己构建IP数据包,在IP选项部分添加一些数据,因此用原始套接字发送TCP数据包,但是发送成功了,另一台主机接收不到,用的2003系统,不知道哪位好心人能帮助下,万分感激,谢谢 解决方案 你这个问题说的比较笼统,你是用的无连接发送吧,发送成功了,但是主机没收到,可能:1.IP包或者TCP包创建的有问题2.发送过程中,数据有丢失3.服务器的程序,在接受数据的程序上存在一些问题 解决方法:1.在客户端断点检测,查看IP和T

原始套接字-VPN到底是什么东西,有几个问题请教一下网络编程大神

问题描述 VPN到底是什么东西,有几个问题请教一下网络编程大神 1.有人说VPN能把系统的所有流量代理走,那么包不包括使用RAW Socket(原始套接字)发送的链路层数据帧呢? 2.VPN究竟是什么鬼?那PPTP协议是什么鬼?我能用原始套接字模拟PPTP连接吗,PPTP协议到底是什么协议,百度上有人说PPTP是第二层协议,那不就是链路层协议吗,还有人说PPTP基于TCP,我也是醉了.请问有没有关于VPN协议的书籍? 解决方案 vpn工作在ip层,RAW Socket的包不能保留,必须做修改,对

socket-python原始套接字的问题

问题描述 python原始套接字的问题 代码如下: import socket addr='localhost' serversocket=socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_IP) serversocket.bind((addr,0)) serversocket.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) serversocket.ioctl(sock

一个基于原始套接字的嗅探器

嗅探器这个代码我去年的时候就已经写过了,这个学期并不是非常忙,顺手复习网络,就又尝试着写了一遍. 其实在写嗅探器的时候,最主要的还是要将网卡设置为混杂模式.在此基础之上,对抓到的数据包进行分析. 这个是我写出来的效果图,目前只是方便于查看,连菜单都没添加: 左面的界面显示的是主机和主机之间的链接信息,而右面则是选中主机信息之间的数据交互情况. 我觉得我这个嗅探器应该是个失败品,或者说,没能够真正的将网卡设置为混杂模式.因为可以看到,上面的源地址全部都是本地主机地址,我在下载视频文件的时候,每秒几