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中基本的日期时间处理的学习教程
Oct 16 Python
简单解决Python文件中文编码问题
Nov 22 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
Nov 23 Python
Python3多线程操作简单示例
May 22 Python
基于python实现学生管理系统
Oct 17 Python
Django框架之DRF 基于mixins来封装的视图详解
Jul 23 Python
将tensorflow模型打包成PB文件及PB文件读取方式
Jan 23 Python
python支持多继承吗
Jun 19 Python
Python基于内置函数type创建新类型
Oct 22 Python
python 基于selectors库实现文件上传与下载
Dec 31 Python
opencv实现图像平移效果
Mar 24 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
简单介绍下 PHP5 中引入的 MYSQLI的用途
2007/03/19 PHP
PHP快速生成各种信息提示框的方法
2016/02/03 PHP
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
jQuery powerFloat万能浮动层下拉层插件使用介绍
2010/12/27 Javascript
Ajax搜索结果页面下方的分页按钮的生成
2012/04/05 Javascript
将json对象转换为字符串的方法
2014/02/20 Javascript
jquery实现在页面加载完毕后获取图片高度或宽度
2014/06/16 Javascript
JavaScript声明变量时为什么要加var关键字
2014/09/29 Javascript
JQuery设置时间段下拉选择实例
2014/12/30 Javascript
jQuery Uploadify 上传插件出现Http Error 302 错误的解决办法
2015/12/12 Javascript
Bootstrap树形组件jqTree的简单封装
2016/01/25 Javascript
JS组件Bootstrap Select2使用方法解析
2016/05/30 Javascript
前端js实现文件的断点续传 后端PHP文件接收
2016/10/14 Javascript
使用bootstrap-paginator.js 分页来进行ajax 异步分页请求示例
2017/03/09 Javascript
js时间查询插件使用详解
2017/04/07 Javascript
Vue的Flux框架之Vuex状态管理器
2017/07/30 Javascript
vue.js路由跳转详解
2017/08/28 Javascript
原生JS实现$.param() 函数的方法
2018/08/10 Javascript
JavaScript函数定义方法实例详解
2019/03/05 Javascript
Vue开发中遇到的跨域问题及解决方法
2020/02/11 Javascript
JavaScript实现表单验证功能
2020/12/09 Javascript
[08:53]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS 选手采访
2021/03/11 DOTA
Python如何生成树形图案
2018/01/03 Python
python飞机大战 pygame游戏创建快速入门详解
2019/12/17 Python
css 省略号 css3让多余的字符串消失并附加省略号的实现代码
2013/02/07 HTML / CSS
详解CSS 3 中的 calc() 方法
2018/01/12 HTML / CSS
HTML 5 标签、属性、事件及浏览器兼容性速查表 附打包下载
2012/10/20 HTML / CSS
Lookfantastic阿联酋官网:英国知名美妆护肤购物网站
2020/05/26 全球购物
机电一体化专业应届本科生求职信
2013/09/27 职场文书
《哪吒闹海》教学反思
2014/02/28 职场文书
教师考察材料范文
2014/06/03 职场文书
小学音乐教师个人工作总结
2015/02/05 职场文书
干货:企业内部人才推荐奖励方案!
2019/07/09 职场文书
创业计划书之干洗店
2019/09/10 职场文书
在JavaScript中如何使用宏详解
2021/05/06 Javascript