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统计一个文本中重复行数的方法
Nov 19 Python
Python最基本的数据类型以及对元组的介绍
Apr 14 Python
Python线程的两种编程方式
Apr 14 Python
python获取当前计算机cpu数量的方法
Apr 18 Python
python使用Image处理图片常用技巧分析
Jun 01 Python
利用Python实现在同一网络中的本地文件共享方法
Jun 04 Python
python后端接收前端回传的文件方法
Jan 02 Python
利用Python进行图像的加法,图像混合(附代码)
Jul 14 Python
在keras中model.fit_generator()和model.fit()的区别说明
Jun 17 Python
python爬虫scrapy图书分类实例讲解
Nov 23 Python
如何在向量化NumPy数组上进行移动窗口
May 18 Python
Python进程间的通信之语法学习
Apr 11 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
文件上传的实现
2006/10/09 PHP
FCKeditor添加自定义按钮
2008/03/27 PHP
Laravel模型间关系设置分表的方法示例
2018/04/21 PHP
基于JQuery的简单实现折叠菜单代码
2010/09/15 Javascript
一个封装js代码-----展开收起效果示例
2013/07/03 Javascript
实用的Jquery选项卡TAB示例代码
2013/08/28 Javascript
多选列表框动态添加,移动,删除,全选等操作的简单实例
2014/01/13 Javascript
获取select元素被选中的文本内容的js代码
2014/01/29 Javascript
Jquery实现自定义tooltip示例代码
2014/02/12 Javascript
Jquery对象和Dom对象的区别分析
2014/11/20 Javascript
Javascript常用字符串判断函数代码分享
2014/12/08 Javascript
JavaScript常用判断写法大全(推荐)
2016/05/30 Javascript
gulp-uglify 与gulp.watch()配合使用时报错(重复压缩问题)
2016/08/24 Javascript
新版vue-cli模板下本地开发环境使用node服务器跨域的方法
2018/04/03 Javascript
通过jquery获取上传文件名称、类型和大小的实现代码
2018/04/19 jQuery
微信小程序支付PHP代码
2018/08/23 Javascript
解决element ui select下拉框不回显数据问题的解决
2019/02/20 Javascript
LayUi使用switch开关,动态的去控制它是否被启用的方法
2019/09/21 Javascript
[01:03:47]VP vs NewBee Supermajor 胜者组 BO3 第一场 6.5
2018/06/06 DOTA
Python数据类型详解(四)字典:dict
2016/05/12 Python
在python中按照特定顺序访问字典的方法详解
2018/12/14 Python
Python3实现的简单三级菜单功能示例
2019/03/12 Python
Python 二叉树的层序建立与三种遍历实现详解
2019/07/29 Python
从numpy数组中取出满足条件的元素示例
2019/11/26 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
2020/01/07 Python
python使用matplotlib绘制折线图的示例代码
2020/09/22 Python
Python实现淘宝秒杀功能的示例代码
2021/01/19 Python
移动HTML5前端框架—MUI的使用
2017/12/18 HTML / CSS
使用PDF.JS插件在HTML中预览PDF文件的方法
2018/08/29 HTML / CSS
幼儿园长自我鉴定
2013/10/17 职场文书
酒店周年庆活动方案
2014/08/21 职场文书
六一文艺汇演开幕词
2015/01/29 职场文书
2015年汽车销售经理工作总结
2015/04/27 职场文书
2015年教学管理工作总结
2015/05/20 职场文书
2016年清明节期间群众祭祀活动工作总结
2016/04/01 职场文书
python 调用js的四种方式
2021/04/11 Python