Python Scapy或类似的东西如何在数据包级别创建HTTP GET请求

Python Scapy或类似的东西如何在数据包级别创建HTTP GET请求,python,http,networking,get,scapy,Python,Http,Networking,Get,Scapy,我是一个中等水平的程序员,刚刚进入网络编程领域 为了提高我对网络的总体理解,我尝试从数据包级别执行几个基本的HTTP操作。我的问题是:如何使用SCAPY这样的库在数据包级别构建HTTP GET请求和相关项?我意识到这可能听起来很奇怪,但我似乎找不到任何详细的信息,我自己对帕罗斯和以太灵的尝试已经。。。不太令人满意 谢谢你提供的任何帮助 特里米特你看过吗?只是复制和粘贴,这看起来像是要组装一个HTTP请求: >>> a=Ether()/IP(dst="www.slashdot.

我是一个中等水平的程序员,刚刚进入网络编程领域

为了提高我对网络的总体理解,我尝试从数据包级别执行几个基本的HTTP操作。我的问题是:如何使用SCAPY这样的库在数据包级别构建HTTP GET请求和相关项?我意识到这可能听起来很奇怪,但我似乎找不到任何详细的信息,我自己对帕罗斯和以太灵的尝试已经。。。不太令人满意

谢谢你提供的任何帮助

特里米特你看过吗?只是复制和粘贴,这看起来像是要组装一个HTTP请求:

>>>  a=Ether()/IP(dst="www.slashdot.org")/TCP()/"GET /index.html HTTP/1.0 \n\n"

如果你想做一个完整的三方握手,你必须手动进行

从您的SYN数据包开始:

>>> syn = IP(dst='www.google.com') / TCP(dport=80, flags='S')
>>> syn
<IP  frag=0 proto=tcp dst=Net('www.google.com') |<TCP  dport=www flags=S |>>

FTR,从Scapy 2.4.3开始,在一个名为“TCP_客户端”的UTI中实现了对HTTP数据包的剖析,以自动进行3次握手

虽然它不像上面的答案那样有教育意义,但看一看也无妨:


我建议使用比Python更低级别的语言,比如C/C++。nightcracker:我强烈反对。SCAPI可以让您非常容易地构建和发送包,而不必担心C或C++程序员需要的任何东西。如果你对网络的工作方式感兴趣,Scapy是一个不错的选择。如果您想编写一个实际的服务器,那么可能更适合使用不同的语言。我是以为网络设备编写C代码为生的。@OP:听听nmichaels说的。我只是一个16岁的孩子,对每件事都有(无偏见的)看法。非常感谢!到目前为止,我所看到的最好的信息。是的,我确实计划自己做三向摇动,但那是我仅有的。非常感谢。有没有办法使用sniff捕获http数据包,然后在其中插入http头?@fayyazkl:这应该是它自己的问题。如何打印这个get请求的anwser?我这样做有困难!请注意,当您从服务器获取SYN/ACK时,内核的TCP/IP堆栈可能会在恶意连接和RST连接时崩溃。您可能需要阻止RST。是的。但是像那样发送它似乎不起作用,也不能让我知道它在数据包级别是如何工作的。对我来说也不起作用。问题是如何在数据包级别创建http get请求,这个答案澄清了这一点。假设您需要进行tcp握手。不要认为这个回答有什么问题。不过,不了解tcp握手的人必须参考正确答案。
>>> syn_ack = sr1(syn)
Begin emission:
Finished to send 1 packets.
*
Received 1 packets, got 1 answers, remaining 0 packets

>>> syn_ack
<IP  version=4L ihl=5L tos=0x0 len=44 id=424 flags= frag=0L ttl=55 proto=tcp chksum=0x2caa src=74.125.226.148 dst=10.20.30.40 options=[] |<TCP  sport=www dport=ftp_data seq=3833491143 ack=1 dataofs=6L reserved=0L flags=SA window=5720 chksum=0xd8b6 urgptr=0 options=[('MSS', 1430)] |<Padding  load='\x00\x00' |>>>
getStr = 'GET / HTTP/1.1\r\nHost: www.google.com\r\n\r\n'
request = IP(dst='www.google.com') / TCP(dport=80, sport=syn_ack[TCP].dport,
             seq=syn_ack[TCP].ack, ack=syn_ack[TCP].seq + 1, flags='A') / getStr
reply = sr1(request)
load_layer("http")
req = HTTP()/HTTPRequest(
    Accept_Encoding=b'gzip, deflate',
    Cache_Control=b'no-cache',
    Connection=b'keep-alive',
    Host=b'www.secdev.org',
    Pragma=b'no-cache'
)
a = TCP_client.tcplink(HTTP, "www.secdev.org", 80)
answser = a.sr1(req)
a.close()