用Python注入原始TCP数据包

用Python注入原始TCP数据包,python,tcp,Python,Tcp,用Python注入原始TCP数据包的合适方法是什么?例如,我的负载由十六进制数组成,我想将十六进制数序列发送到网络守护进程:因此,如果我选择发送'abcdef',我也会在线路上看到'abcdef'。但与下列情况不同的是“6162636566”: new = socket.socket(socket.AF_INET, socket.SOCK_STREAM) new.connect(('127.0.0.1', 9999)) new.send('abcdef') 我可以使用Python的SOCK_R

用Python注入原始TCP数据包的合适方法是什么?例如,我的负载由十六进制数组成,我想将十六进制数序列发送到网络守护进程:因此,如果我选择发送'abcdef',我也会在线路上看到'abcdef'。但与下列情况不同的是“6162636566”:

new = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
new.connect(('127.0.0.1', 9999))
new.send('abcdef')
我可以使用Python的SOCK_RAW实现此目的吗?如果是这样的话,你能给我一个用SOCK_raw发送原始TCP数据包的例子吗(因为我自己没有让它工作)

谢谢


Evgeny听起来像是对python字符串感到困惑。例如,尝试:

new.send('\x0a\x0b\x0c\x0d\x0e\x0f')

为什么不在发送字符串之前将其转换为十六进制

new = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
new.connect(('127.0.0.1', 9999))
mydata = 'abcdef'
new.send(mydata.encode('hex'))
Try,一个强大的交互式数据包处理程序

例如:

%> sudo scapy

>>> packet1 = IP(dst='127.0.0.1')/TCP(dport=9999)
>>> packet1.payload = 'abcdef'
>>> send(packet1)
.
Sent 1 packets.
>>> packet1.show()
###[ IP ]###
  version= 4
  ihl= None
  tos= 0x0
  len= None
  id= 1
  flags= 
  frag= 0
  ttl= 64
  proto= ip
  chksum= None
  src= 127.0.0.1
  dst= 127.0.0.1
  \options\
###[ Raw ]###
     load= 'abcdef'
>>> 

对于原始套接字,SOCK_raw是一个不错的选择。请记住,当您使用SOCK_RAW时,您不能只发送有效负载。你还必须做头球的形成。在你做对了这一点之后,你可能会面临操作系统的问题。在Windows XP上执行原始套接字时,由于安全问题,我们遇到了一些问题

为什么我们总是发送十六进制字符串?