-
-
[翻译]python dpkt库文档翻译之ICMP Echo(小菜一枚,请大家多多指正错误)
-
发表于: 2016-10-5 23:55 6109
-
Dpkt教程#1:ICMP Echo
https://jon.oberheide.org/blog/2008/08/25/dpkt-tutorial-1-icmp-echo/
在本手册中,我将会展示如何创建并发送一个简单的ICMP echo数据包
Dpkt框架在创建和解析数据包方面酷毙了,一旦你熟悉使用这个模块,其余方面就相当容易了。我将会用一些简单的小任务作为dpkt教程,希望能提供一些文档的例子。
如果你有任何项目想要用dpkt库完成,就写信给我。
在这个文档中,我们将会创建一个ICMP echo数据包,又叫做ping。对于用一些简单的例子开始了解如何构建一个使用各个模块的跨多层次的数据包。让我们开始吧!
看一下dpkt/icmp.py,我们可以看到下面的ICMP类,和echo 的Payload(载荷):
class ICMP(dpkt.Packet):
__hdr__ = (
('type', 'B', 8),
('code', 'B', 0),
('sum', 'H', 0)
)
class Echo(dpkt.Packet):
__hdr__ = (('id', 'H', 0), ('seq', 'H', 0))
因为我们将会通过标准的socket接口发送一个ICMP echo出去,所以我们不必关心自身较低的层,像IP层或链路层(我们会保存为另一个教程)。
当用dpkt库构造数据包时,我通常采取一个从上至下的方法,从最高层次开始并且根据我们的方式进行下去。因为ICMP请求,我们会开始构建echo包的payload,和icmp基本参数(ip包的payload,数据链路包的payload等等。如果我们构建低层次的payload的话)。为了创建echo payload,我们简单的初始化echo类:
echo = dpkt.icmp.ICMP.Echo()
Echo payload属性是id(标识符)和seq(序号),两者都是16进制表示,默认为0。我们可以很容易的改变这些echo payload的值并且可以将他们的值随机变换:
echo.id = random.randint(0, 0xffff)
echo.seq = random.randint(0, 0xffff)
ICMP echo请求经常包括被接受者返回的数据payload。
我们将会通过分配一段字符串给echo的data属性包含一个payload。数据属性在dpkt-land是特殊的, 当ICMP payload的echo payload连接在一起时,我们将看到它的使用。现在我们指定一个假定payload:
echo.data = 'hello world'
我们现在可以打印,16进制输出或打印原始字节的echo payload
>>> print `echo`
Echo(id=24528, seq=11482, data='hello world')
>>> print binascii.hexlify(str(echo))
5fd02cda68656c6c6f20776f726c64
>>> print str(echo)
_?,?hello world
接下来,我们创造ICMP的payload和指定它的属性使用在dpkt/icmp.py发现的常量:
icmp = dpkt.icmp.ICMP()
icmp.type = dpkt.icmp.ICMP_ECHO
为了链接echo payload与ICMP payload,我们再次使用这个数据属性。因为这个echo payload 是ICMP数据包的一个‘子-payload’,我们分配它给ICMP的数据属性:
icmp.data = echo
再次,我们现在可以打印,16进制输出或打印原始字节的整个ICMP/Echo数据包和了解数据包如何嵌套在ICMP payload:
>>> print `icmp`
ICMP(data=Echo(id=24528, seq=11482, data='hello world'))
>>> print binascii.hexlify(str(icmp))
0800d9865fd02cda68656c6c6f20776f726c64
>>> print str(icmp)
??_?,?hello world
现在,全部二进制payload ICMP数据包(str(ICMP)),我们可以通过一个标准ICMP套接字发送:
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, dpkt.ip.IP_PROTO_ICMP)
s.connect(('74.125.67.100', 1))
s.send(str(icmp))
成功!这样就完成了我们的教程,用dpkt库显示一个ICMP echo请求的结构。
本教程的完整python脚本如下:
#!/usr/bin/env python
import dpkt
import socket, random
echo = dpkt.icmp.ICMP.Echo()
echo.id = random.randint(0, 0xffff)
echo.seq = random.randint(0, 0xffff)
echo.data = 'hello world'
icmp = dpkt.icmp.ICMP()
icmp.type = dpkt.icmp.ICMP_ECHO
icmp.data = echo
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, dpkt.ip.IP_PROTO_ICMP)
s.connect(('74.125.67.100', 1))
sent = s.send(str(icmp))
print 'sent %d bytes' % sent
第一次翻译 求大家多多指出错误
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!