python基础教程之获取本机ip数据包示例


Posted in Python onFebruary 10, 2014

这几天用到了raw socket,用python写了些demo程序,这里记录下。

首先我们看一个简单的sniffer程序:

#! /usr/bin/python
# code for linux
import socket
#s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_UDP)
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
while True:
    print s.recvfrom(65535)

这里直接用raw socket接收数据,直接print操作。这个就几行代码,也没什么好解释的了,不懂的google下。

得到IP数据包后,接下来的工作就是对IP头进行解析,在这之前,我们先看看RFC中是怎么定义的(RFC791 : http://www.ietf.org/rfc/rfc791.txt ):

python基础教程之获取本机ip数据包示例

即对应的图:

python基础教程之获取本机ip数据包示例

从RFC和上图中可以看到IP数据包头各个字段所占的位数,我们可以根据这些定义去解析IP数据包头,然后根据相应的策略处理数据。
这里给出一段用python实现的解析IP头的代码(呵呵,是demo中的代码,只解析了前20个字节):

def decodeIpHeader(packet):
        mapRet = {}
        mapRet["version"] = (int(ord(packet[0])) & 0xF0)>>4
        mapRet["headerLen"] = (int(ord(packet[0])) & 0x0F)<<2
        mapRet["serviceType"] = hex(int(ord(packet[1])))
        mapRet["totalLen"] = (int(ord(packet[2])<<8))+(int(ord(packet[3])))
        mapRet["identification"] = (int( ord(packet[4])>>8 )) + (int( ord(packet[5])))
        mapRet["id"] = int(ord(packet[6]) & 0xE0)>>5
        mapRet["fragOff"] = int(ord(packet[6]) & 0x1F)<<8 + int(ord(packet[7]))
        mapRet["ttl"] = int(ord(packet[8]))
        mapRet["protocol"] = int(ord(packet[9]))
        mapRet["checkSum"] = int(ord(packet[10])<<8)+int(ord(packet[11]))
        mapRet["srcaddr"] = "%d.%d.%d.%d" % (int(ord(packet[12])),int(ord(packet[13])),int(ord(packet[14])), int(ord(packet[15])))
        mapRet["dstaddr"] = "%d.%d.%d.%d" % (int(ord(packet[16])),int(ord(packet[17])),int(ord(packet[18])), int(ord(packet[19])))
        return mapRet

调用代码:

proto = socket.getprotobyname('tcp') # only tcp
sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, proto)
while True:
        packet = sock.recvfrom(65535)[0]
        if len(packet) == 0:
                sck.close()
        else:
                #print str(packet)
                mapIpTmp = decodeIpHeader(packet)
                for k,v in mapIpTmp.items():
                        print k,"\t:\t",v
        print ""
Python 相关文章推荐
python数据结构之二叉树的统计与转换实例
Apr 29 Python
python基于pygame实现响应游戏中事件的方法(附源码)
Nov 11 Python
python实现简单socket通信的方法
Apr 19 Python
Python的Django框架中消息通知的计数器实现教程
Jun 13 Python
Python利用matplotlib生成图片背景及图例透明的效果
Apr 27 Python
Python获取当前函数名称方法实例分享
Jan 18 Python
在Python 2.7即将停止支持时,我们为你带来了一份python 3.x迁移指南
Jan 30 Python
python3+PyQt5重新实现QT事件处理程序
Apr 19 Python
python实现pdf转换成word/txt纯文本文件
Jun 07 Python
Python实现的网页截图功能【PyQt4与selenium组件】
Jul 12 Python
python爬虫自动创建文件夹的功能
Aug 01 Python
python 字典中取值的两种方法小结
Aug 02 Python
python基础教程之udp端口扫描
Feb 10 #Python
python网页请求urllib2模块简单封装代码
Feb 07 #Python
python解析xml模块封装代码
Feb 07 #Python
python 解析XML python模块xml.dom解析xml实例代码
Feb 07 #Python
python合并文本文件示例
Feb 07 #Python
python实现哈希表
Feb 07 #Python
python处理cookie详解
Feb 07 #Python
You might like
WordPress中设置Post Type自定义文章类型的实例教程
2016/05/10 PHP
利用PHPExcel实现Excel文件的写入和读取
2017/04/26 PHP
jQuery中使用了document和window哪些属性和方法小结
2011/09/13 Javascript
动态加载script文件的两种方法
2013/08/15 Javascript
jQuery的选择器中的通配符使用介绍
2014/03/20 Javascript
简介AngularJS中$http服务的用法
2016/02/06 Javascript
jQuery插件zTree实现获取当前选中节点在同级节点中序号的方法
2017/03/08 Javascript
JS实现的自动打字效果示例
2017/03/10 Javascript
JS匹配日期和时间的正则表达式示例
2017/05/12 Javascript
MvcPager分页控件 适用于Bootstrap
2017/06/03 Javascript
js判断用户是输入的地址请求的路径(实例讲解)
2017/07/18 Javascript
jQuery 实现鼠标画框并对框内数据选中的实例代码
2017/08/29 jQuery
原来JS还可以这样拆箱转换详解
2019/02/01 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
2019/04/26 Javascript
微信小程序开发技巧汇总
2019/07/15 Javascript
[02:28]PWL开团时刻DAY3——Ink Ice与DeMonsTer之间的勾心斗角
2020/11/03 DOTA
python实现在每个独立进程中运行一个函数的方法
2015/04/23 Python
使用Python的Twisted框架编写非阻塞程序的代码示例
2016/05/25 Python
浅谈python中的正则表达式(re模块)
2017/10/17 Python
使用 Python 实现简单的 switch/case 语句的方法
2018/09/17 Python
Python任意字符串转16, 32, 64进制的方法
2019/06/12 Python
pytorch 输出中间层特征的实例
2019/08/17 Python
python xlwt如何设置单元格的自定义背景颜色
2019/09/03 Python
django-csrf使用和禁用方式
2020/03/13 Python
Python selenium页面加载慢超时的解决方案
2020/03/18 Python
澳大利亚小众服装品牌:Maurie & Eve
2018/03/27 全球购物
美国Jeep配件购物网站:Morris 4×4 Center
2019/05/01 全球购物
澳大利亚最受欢迎的美发用品目的地:AMR
2019/08/28 全球购物
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/11/24 面试题
董事长岗位职责
2013/11/30 职场文书
社团文化节策划书
2014/02/01 职场文书
2014幼儿园教师师德师风演讲稿
2014/09/10 职场文书
解除劳动合同协议书范本
2014/09/13 职场文书
公司停电通知
2015/04/15 职场文书
歌咏比赛主持词
2015/06/29 职场文书
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
2022/08/14 MySQL