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 相关文章推荐
web.py中调用文件夹内模板的方法
Aug 26 Python
Python中用于返回绝对值的abs()方法
May 14 Python
Python科学计算包numpy用法实例详解
Feb 08 Python
Java编程迭代地删除文件夹及其下的所有文件实例
Feb 10 Python
Python 元类实例解析
Apr 04 Python
基于pandas将类别属性转化为数值属性的方法
Jul 25 Python
解决python 自动安装缺少模块的问题
Oct 22 Python
Python类的继承用法示例
Jan 31 Python
django-rest-swagger对API接口注释的方法
Aug 29 Python
Python PyQt5整理介绍
Apr 01 Python
Mac PyCharm中的.gitignore 安装设置教程
Apr 16 Python
python实现一次性封装多条sql语句(begin end)
Jun 06 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
用PHP调用Oracle存储过程
2006/10/09 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
取得一定长度的内容,处理中文
2006/12/20 Javascript
javascript 网页跳转的方法
2008/12/24 Javascript
js获取图片长和宽度的代码
2009/11/24 Javascript
Javascript实现CheckBox的全选与取消全选的代码
2010/07/20 Javascript
JS多物体 任意值 链式 缓冲运动
2012/08/10 Javascript
深入理解JavaScript系列(38):设计模式之职责链模式详解
2015/03/04 Javascript
jQuery简单实现禁用右键菜单
2015/03/10 Javascript
js实现同一页面多个不同运动效果的方法
2015/04/10 Javascript
Jquery attr()方法 属性赋值和属性获取详解
2016/04/15 Javascript
简单理解vue中Props属性
2016/10/27 Javascript
解决Window10系统下Node安装报错的问题分析
2016/12/13 Javascript
jQuery validate插件功能与用法详解
2016/12/15 Javascript
详解使用vscode+es6写nodejs服务端调试配置
2017/09/21 NodeJs
浅谈React前后端同构防止重复渲染
2018/01/05 Javascript
webpack项目调试以及独立打包配置文件的方法
2018/02/28 Javascript
微信小程序实现人脸识别
2018/05/25 Javascript
玩转vue的slot内容分发
2018/09/22 Javascript
bootstrap table合并行数据并居中对齐效果
2018/10/17 Javascript
用node开发并发布一个cli工具的方法步骤
2019/01/03 Javascript
js回调函数原理与用法案例分析
2020/03/04 Javascript
js对象简介与基本用法示例
2020/03/13 Javascript
ant-design-vue中的select选择器,对输入值的进行筛选操作
2020/10/24 Javascript
vue3.0+vue-router+element-plus初实践
2020/12/02 Vue.js
python字符串中的单双引
2017/02/16 Python
python2.7 mayavi 安装图文教程(推荐)
2017/06/22 Python
用Pycharm实现鼠标滚轮控制字体大小的方法
2019/01/15 Python
深度辨析Python的eval()与exec()的方法
2019/03/26 Python
Python3 io文本及原始流I/O工具用法详解
2020/03/23 Python
CSS3 制作旋转的大风车(充满童年回忆)
2013/01/30 HTML / CSS
CSS3实现的闪烁跳跃进度条示例(附源码)
2013/08/19 HTML / CSS
css3实现椭圆轨迹旋转的示例代码
2018/10/29 HTML / CSS
Giuseppe Zanotti美国官方网站:将鞋履视为高级时装般精心制作
2018/02/06 全球购物
《夜莺的歌声》教学反思
2016/02/22 职场文书
python xlwt模块的使用解析
2021/04/13 Python