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程序中操作MySQL的基本方法
Jul 29 Python
python删除特定文件的方法
Jul 30 Python
Python编程中使用Pillow来处理图像的基础教程
Nov 20 Python
python下载图片实现方法(超简单)
Jul 21 Python
Python代码实现KNN算法
Dec 20 Python
Python numpy 提取矩阵的某一行或某一列的实例
Apr 03 Python
浅谈利用numpy对矩阵进行归一化处理的方法
Jul 11 Python
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
Dec 14 Python
Python3.5 Pandas模块之DataFrame用法实例分析
Apr 23 Python
django搭建项目配置环境和创建表过程详解
Jul 22 Python
Python Process多进程实现过程
Oct 22 Python
python脚本实现mp4中的音频提取并保存在原目录
Feb 27 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学习 运算符与运算符优先级
2008/06/15 PHP
php 过滤危险html代码
2009/06/29 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(四)
2014/06/23 PHP
PHP合并静态文件详解
2014/11/14 PHP
浅析Laravel5中队列的配置及使用
2016/08/04 PHP
利用PHP获取汉字首字母并且分组排序详解
2017/10/22 PHP
ThinkPHP 5.1 跨域配置方法
2019/10/11 PHP
ExtJS Window 最小化的一种方法
2009/11/18 Javascript
js 编程笔记 无名函数
2011/06/28 Javascript
一个页面元素appendchild追加到另一个页面元素的问题
2013/01/27 Javascript
10个基于浏览器的JavaScript调试工具分享
2013/02/07 Javascript
jqgrid 编辑添加功能详细解析
2013/11/08 Javascript
Extjs的FileUploadField文件上传出现了两个上传按钮
2014/04/29 Javascript
用Jquery.load载入页面后样式没了页面混乱的解决方法
2014/10/20 Javascript
详解JavaScript中jQuery和Ajax以及JSONP的联合使用
2015/08/13 Javascript
JavaScript笔记之数据属性和存储器属性
2016/03/31 Javascript
JS实现简单易用的手机端浮动窗口显示效果
2016/09/07 Javascript
JS中Array数组学习总结
2017/01/18 Javascript
anime.js 实现带有描边动画效果的复选框(推荐)
2017/12/24 Javascript
vue中render函数的使用详解
2018/10/12 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
2019/05/26 Javascript
javascript关于“时间”的一次探索
2019/07/24 Javascript
微信小程序实现限制用户转发功能的实例代码
2020/02/22 Javascript
Python3里的super()和__class__使用介绍
2015/04/23 Python
基于Python实现的微信好友数据分析
2018/02/26 Python
TensorFlow模型保存/载入的两种方法
2018/03/08 Python
TensorFlow tensor的拼接实例
2020/01/19 Python
tensorflow使用range_input_producer多线程读取数据实例
2020/01/20 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
2020/04/14 Python
python numpy库np.percentile用法说明
2020/06/08 Python
英国和世界各地预订便宜的酒店:LateRooms.com
2019/05/05 全球购物
全球领先的全景影像品牌:Insta360
2019/08/21 全球购物
交通专业个人自荐信格式
2013/09/23 职场文书
优秀的2014年两会精神解读
2014/03/17 职场文书
工商行政管理专业求职书
2014/05/23 职场文书
火灾现场处置方案
2014/05/28 职场文书