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中zfill()方法的使用教程
May 20 Python
python中星号变量的几种特殊用法
Sep 07 Python
python with提前退出遇到的坑与解决方案
Jan 05 Python
python实现日常记账本小程序
Mar 10 Python
Python实现一个服务器监听多个客户端请求
Apr 12 Python
Django 视图层(view)的使用
Nov 09 Python
利用Python实现微信找房机器人实例教程
Mar 10 Python
pandas 层次化索引的实现方法
Jul 06 Python
python编写一个会算账的脚本的示例代码
Jun 02 Python
python基于opencv实现人脸识别
Jan 04 Python
Python中生成ndarray实例讲解
Feb 22 Python
PyTorch的Debug指南
May 07 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
espresso double下 咖啡粉超细时 饼压力对咖啡的影响
2021/03/03 冲泡冲煮
用libTemplate实现静态网页的生成
2006/10/09 PHP
安装apache2.2.22配置php5.4(具体操作步骤)
2013/06/26 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
2019/08/23 PHP
PHP实现的文件浏览器功能简单示例
2019/09/12 PHP
jQuery Validation插件remote验证方式的Bug解决
2010/07/01 Javascript
Dom操作之兼容技巧分享
2011/09/20 Javascript
javascript学习笔记(三) String 字符串类型介绍
2012/06/19 Javascript
javascript学习笔记(十三) js闭包介绍(转)
2012/06/20 Javascript
jquery text(),val(),html()方法区别总结
2013/11/04 Javascript
jquery实现pager控件示例
2014/04/09 Javascript
跟我学Nodejs(三)--- Node.js模块
2014/05/25 NodeJs
javascript实现依次输入input自动定焦
2014/12/23 Javascript
javascript实现复选框超过限制即弹出警告框的方法
2015/02/25 Javascript
nodejs实现获取某宝商品分类
2015/05/28 NodeJs
移动端H5开发 Turn.js实现很棒的翻书效果
2016/06/20 Javascript
遍历js中对象的属性和值的实例
2016/11/21 Javascript
JS禁止浏览器右键查看元素或按F12审查元素自动关闭页面示例代码
2017/09/07 Javascript
vue模块拖拽实现示例代码
2019/03/09 Javascript
Vue CLI 3.x 自动部署项目至服务器的方法
2019/04/02 Javascript
vue 使用axios 数据请求第三方插件的使用教程详解
2019/07/05 Javascript
js实现的在本地预览图片功能示例
2019/11/09 Javascript
python实现哈希表
2014/02/07 Python
Python编程flask使用页面模版的方法
2018/12/28 Python
用python写测试数据文件过程解析
2019/09/25 Python
python线程信号量semaphore使用解析
2019/11/30 Python
Django重设Admin密码过程解析
2020/02/10 Python
使用pyplot.matshow()函数添加绘图标题
2020/06/16 Python
CSS3实现的渐变幻灯片效果
2020/12/07 HTML / CSS
html Table 表头固定的实现
2019/01/22 HTML / CSS
HTMl5的存储方式sessionStorage和localStorage详解
2014/03/18 HTML / CSS
产品质量承诺范本
2014/03/31 职场文书
公司承诺书格式
2014/05/21 职场文书
教师节宣传方案
2014/05/23 职场文书
领导班子三严三实心得体会
2014/10/13 职场文书
出国留学单位推荐信
2015/03/26 职场文书