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正则表达式 re模块使用说明
May 19 Python
Python简单获取自身外网IP的方法
Sep 18 Python
python扫描proxy并获取可用代理ip的实例
Aug 07 Python
Python实现扣除个人税后的工资计算器示例
Mar 26 Python
python读取LMDB中图像的方法
Jul 02 Python
对python读取zip压缩文件里面的csv数据实例详解
Feb 08 Python
python整合ffmpeg实现视频文件的批量转换
May 31 Python
Python中字典与恒等运算符的用法分析
Aug 22 Python
Python猴子补丁Monkey Patch用法实例解析
Mar 23 Python
python里的单引号和双引号的有什么作用
Jun 17 Python
Django和Ueditor自定义存储上传文件的文件名
Feb 25 Python
Python实战之大鱼吃小鱼游戏的实现
Apr 01 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
Thinkphp搭建包括JS多语言的多语言项目实现方法
2014/11/24 PHP
php+mysql数据库查询实例
2015/01/21 PHP
php微信开发之上传临时素材
2016/06/24 PHP
详解php实现页面静态化原理
2017/06/21 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
PHP查找一列有序数组是否包含某值的方法
2020/02/07 PHP
JavaScript 闭包在封装函数时的简单分析
2009/11/28 Javascript
该如何加载google-analytics(或其他第三方)的JS
2010/05/13 Javascript
基于jQuery的前端数据通用验证库
2011/08/08 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
2015/12/03 Javascript
详解JavaScript基于面向对象之继承实例
2015/12/16 Javascript
Node.js的Koa框架上手及MySQL操作指南
2016/06/13 Javascript
Ajax异步获取html数据中包含js方法无效的解决方法
2017/02/20 Javascript
简单实现js菜单栏切换效果
2017/03/04 Javascript
Vue2.0利用vue-resource上传文件到七牛的实例代码
2017/07/28 Javascript
vue-cli+webpack项目 修改项目名称的方法
2018/02/28 Javascript
bootstrap动态调用select下拉框的实例代码
2018/08/09 Javascript
在小程序中使用canvas的方法示例
2018/09/17 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【凹多边形的分离轴检测算法】
2018/12/13 Javascript
微信小程序时间标签和时间范围的联动效果
2019/02/15 Javascript
利用vue重构有赞商城的思路以及总结整理
2019/02/21 Javascript
vue缓存的keepalive页面刷新数据的方法
2019/04/23 Javascript
vue增加强缓存和版本号的实现方法
2019/05/01 Javascript
JS通用方法触发点击事件代码实例
2020/02/17 Javascript
Vue使用轮询定时发送请求代码
2020/08/10 Javascript
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
2021/01/05 Vue.js
Python3之读取连接过的网络并定位的方法
2018/04/22 Python
python使用epoll实现服务端的方法
2018/10/16 Python
python实现测试工具(二)——简单的ui测试工具
2020/10/19 Python
html5本地存储_动力节点Java学院整理
2017/07/12 HTML / CSS
购买英国原创艺术:Art Gallery
2018/08/25 全球购物
英国领先的票务代理商之一:The Ticket Factory
2019/02/09 全球购物
sort命令的作用和用法
2012/11/04 面试题
农救科工作职责
2013/11/27 职场文书
厨师长岗位职责范本
2014/08/25 职场文书
2014年团支部工作总结
2014/11/17 职场文书