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 相关文章推荐
数据挖掘之Apriori算法详解和Python实现代码分享
Nov 07 Python
Python的装饰器模式与面向切面编程详解
Jun 21 Python
python矩阵转换为一维数组的实例
Jun 05 Python
python爬取个性签名的方法
Jun 17 Python
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
Apr 01 Python
在linux下实现 python 监控usb设备信号
Jul 03 Python
django将网络中的图片,保存成model中的ImageField的实例
Aug 07 Python
Python线程条件变量Condition原理解析
Jan 20 Python
Python使用pdb调试代码的技巧
May 03 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
Aug 19 Python
详解python内置模块urllib
Sep 09 Python
python模块内置属性概念及实例
Feb 18 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 多进程 解决难题
2009/06/22 PHP
php数组函数序列之array_flip() 将数组键名与值对调
2011/11/07 PHP
PHP Switch 语句之学习笔记
2013/09/21 PHP
PHP统计nginx访问日志中的搜索引擎抓取404链接页面路径
2014/06/30 PHP
PHPer 需要了解的 5 个 Composer 小技巧
2014/08/18 PHP
Php-Redis安装测试笔记
2015/03/05 PHP
PHP中isset与array_key_exists的区别实例分析
2015/06/02 PHP
了解PHP的返回引用和局部静态变量
2015/06/04 PHP
简单实现PHP留言板功能
2016/12/21 PHP
使用Zookeeper分布式部署PHP应用程序
2019/03/15 PHP
jQuery 无刷新分页实例代码
2013/11/12 Javascript
javascript面向对象之this关键词用法分析
2015/01/13 Javascript
Node.js+Express配置入门教程
2016/05/19 Javascript
JavaScript导航脚本判断当前导航
2016/07/12 Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
2016/12/25 Javascript
element-ui 上传图片后清空图片显示的实例
2018/09/04 Javascript
微信小程序缓存过期时间的使用详情
2019/05/12 Javascript
vue canvas绘制矩形并解决由clearRec带来的闪屏问题
2019/09/02 Javascript
Typescript3.9 常用新特性一览(推荐)
2020/05/14 Javascript
[54:28]EG vs OG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
Python实现的tab文件操作类分享
2014/11/20 Python
Python创建xml的方法
2015/03/10 Python
详解Python中的循环语句的用法
2015/04/09 Python
简单谈谈Python的pycurl模块
2018/04/07 Python
Python画柱状统计图操作示例【基于matplotlib库】
2018/07/04 Python
实例详解Python模块decimal
2019/06/26 Python
python实现代码统计程序
2019/09/19 Python
ALDI奥乐齐官方海外旗舰店:德国百年超市
2017/12/27 全球购物
Kathmandu美国网站:新西兰户外运动品牌
2019/03/23 全球购物
Linux内核的同步机制是什么?主要有哪几种内核锁
2016/07/11 面试题
法律进社区实施方案
2014/03/21 职场文书
应聘护士求职信
2014/07/21 职场文书
小学运动会报道稿
2014/10/04 职场文书
表扬稿表扬信的格式及范文
2019/06/24 职场文书
2019银行员工个人工作自我鉴定
2019/06/27 职场文书
Go语言基础map用法及示例详解
2021/11/17 Golang