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 相关文章推荐
Python3 正在毁灭 Python的原因分析
Nov 28 Python
详解设计模式中的工厂方法模式在Python程序中的运用
Mar 02 Python
Python数组定义方法
Apr 13 Python
Python中使用装饰器来优化尾递归的示例
Jun 18 Python
全面了解Nginx, WSGI, Flask之间的关系
Jan 09 Python
python OpenCV学习笔记直方图反向投影的实现
Feb 07 Python
kali中python版本的切换方法
Jul 11 Python
Django CBV与FBV原理及实例详解
Aug 12 Python
Python读写文件模式和文件对象方法实例详解
Sep 17 Python
python队列原理及实现方法示例
Nov 27 Python
解决jupyter notebook显示不全出现框框或者乱码问题
Apr 09 Python
python基于Kivy写一个图形桌面时钟程序
Jan 28 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
让这部DC动画新作刷新你的认知
2020/03/03 欧美动漫
phpStudy配置多站点多域名方法及遇到的403错误解决方法
2017/10/19 PHP
Yii2框架中一些折磨人的坑
2019/12/15 PHP
兼容ie和firefox js关闭代码
2008/12/11 Javascript
jQuery的css()方法用法实例
2014/12/24 Javascript
jquery简单的弹出层浮动层代码
2015/04/27 Javascript
jQuery+json实现的简易Ajax调用实例
2015/12/14 Javascript
Bootstrap基本组件学习笔记之按钮组(8)
2016/12/07 Javascript
js仿淘宝商品放大预览功能
2017/03/15 Javascript
JavaScript+HTML5实现的日期比较功能示例
2017/07/12 Javascript
JavaScript实现数值自动增加动画
2017/12/28 Javascript
jQuery发请求传输中文参数乱码问题的解决方案
2018/05/22 jQuery
详解mpvue scroll-view自动回弹bug解决方案
2018/10/01 Javascript
JS中this的4种绑定规则详解
2020/02/04 Javascript
Javascript执行上下文顺序的深入讲解
2020/11/04 Javascript
Windows系统配置python脚本开机启动的3种方法分享
2015/03/10 Python
python 数据的清理行为实例详解
2017/07/12 Python
Python3安装psycopy2以及遇到问题解决方法
2019/07/03 Python
python 模拟贷款卡号生成规则过程解析
2019/08/30 Python
Python如何使用BeautifulSoup爬取网页信息
2019/11/26 Python
Python基于unittest实现测试用例执行
2020/11/25 Python
CSS3文本换行word-wrap解决英文文本超过固定宽度不换行
2013/10/10 HTML / CSS
CSS3实现渐变背景兼容问题
2020/05/06 HTML / CSS
Levi’s美国官网:美国著名的牛仔裤品牌
2016/08/19 全球购物
RealTek面试题
2016/06/28 面试题
周年庆典邀请函范文
2014/01/23 职场文书
《母鸡》教学反思
2014/02/25 职场文书
《蒙娜丽莎之约》教学反思
2014/02/27 职场文书
督导岗位职责
2015/02/04 职场文书
驳回起诉民事裁定书
2015/05/19 职场文书
党支部季度考核意见
2015/06/02 职场文书
党支部考察意见范文
2015/06/02 职场文书
一劳永逸彻底解决pip install慢的办法
2021/05/24 Python
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
2021/06/09 Python
Java spring单点登录系统
2021/09/04 Java/Android
关于MySQL中的 like操作符详情
2021/11/17 MySQL