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 判断一个进程是否存在
Apr 09 Python
线程和进程的区别及Python代码实例
Feb 04 Python
Python日志模块logging简介
Apr 13 Python
Python实现列表删除重复元素的三种常用方法分析
Nov 24 Python
python实现聊天小程序
Mar 13 Python
Python实现正弦信号的时域波形和频谱图示例【基于matplotlib】
May 04 Python
Python实现读取机器硬件信息的方法示例
Jun 09 Python
python:按行读入,排序然后输出的方法
Jul 20 Python
在PyCharm的 Terminal(终端)切换Python版本的方法
Aug 02 Python
python飞机大战pygame游戏之敌机出场实现方法详解
Dec 17 Python
基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解
Jun 08 Python
python爬虫之selenium库的安装及使用教程
May 23 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函数extension_loaded()用法实例
2015/01/19 PHP
php实现用手机关闭计算机(电脑)的方法
2015/04/22 PHP
Mac环境下php操作mysql数据库的方法分享
2015/05/11 PHP
TP5框架实现的数据库备份功能示例
2020/04/05 PHP
ie 调试javascript的工具
2009/04/29 Javascript
js 设置选中行的样式的实现代码
2010/05/24 Javascript
ExtJs grid行 右键菜单的两种方法
2010/06/19 Javascript
基于jquery的cookie的用法
2011/01/10 Javascript
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮
2013/10/11 Javascript
js实现俄罗斯方块小游戏分享
2014/01/31 Javascript
jQuery实现跨域
2015/02/03 Javascript
你不知道的高性能JAVASCRIPT
2016/01/18 Javascript
基于Bootstrap实现Material Design风格表单插件 附源码下载
2016/04/18 Javascript
AngularJS中的API(接口)简单实现
2016/07/28 Javascript
tablesorter.js表格排序使用方法(支持中文排序)
2017/02/10 Javascript
学习使用Bootstrap页面排版样式
2017/05/11 Javascript
详解微信小程序设置底部导航栏目方法
2017/06/29 Javascript
浅谈react前后端同构渲染
2017/09/20 Javascript
vue中动态绑定表单元素的属性方法
2018/02/23 Javascript
深入理解Vue 组件之间传值
2018/08/16 Javascript
有关vue 开发钉钉 H5 微应用 dd.ready() 不执行问题及快速解决方案
2020/05/09 Javascript
Python的消息队列包SnakeMQ使用初探
2016/06/29 Python
python爬虫入门教程--正则表达式完全指南(五)
2017/05/25 Python
浅谈python标准库--functools.partial
2019/03/13 Python
PyQt5 加载图片和文本文件的实例
2019/06/14 Python
matplotlib实现数据实时刷新的示例代码
2021/01/05 Python
荷兰演唱会和体育比赛订票网站:viagogo荷兰
2018/04/08 全球购物
电子商务专业学生的学习自我评价
2013/10/27 职场文书
考试不及格检讨书
2014/01/09 职场文书
初二物理教学反思
2014/01/29 职场文书
高三体育教学反思
2014/01/29 职场文书
公司财务流程之主管工作流程
2014/03/03 职场文书
校本培训个人总结
2015/02/28 职场文书
党性教育心得体会(共6篇)
2016/01/21 职场文书
js实现上传图片到服务器
2021/04/11 Javascript
Unity连接MySQL并读取表格数据的实现代码
2021/06/20 MySQL