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简单实现安全开关文件的两种方式
Sep 19 Python
Python实现屏幕截图的代码及函数详解
Oct 01 Python
python3.6+opencv3.4实现鼠标交互查看图片像素
Feb 26 Python
python逆序打印各位数字的方法
Jun 25 Python
python遍历文件夹找出文件夹后缀为py的文件方法
Oct 21 Python
解决使用PyCharm时无法启动控制台的问题
Jan 19 Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
Feb 21 Python
Pytorch之卷积层的使用详解
Dec 31 Python
20行Python代码实现一款永久免费PDF编辑工具的实现
Aug 27 Python
python3中确保枚举值代码分析
Dec 02 Python
python如何利用cv2模块读取显示保存图片
Jun 04 Python
python运行脚本文件的三种方法实例
Jun 25 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 visitFile()遍历指定文件夹函数
2010/08/21 PHP
PHP中其实也可以用方法链
2011/11/10 PHP
PHP之图片上传类实例代码(加了缩略图)
2016/06/30 PHP
Laravel框架实现文件上传的方法分析
2019/09/29 PHP
PHP常量及变量区别原理详解
2020/08/14 PHP
表单内同名元素的控制
2006/11/22 Javascript
JavaScript Sort 表格排序
2009/10/31 Javascript
xss文件页面内容读取(解决)
2010/11/28 Javascript
Js参数值中含有单引号或双引号问题的解决方法
2013/11/06 Javascript
Nodejs Express4.x开发框架随手笔记
2015/11/23 NodeJs
浅谈JS中的三种字符串连接方式及其性能比较
2016/09/02 Javascript
JavaScript实现DOM对象选择器
2016/09/24 Javascript
Javascript同时声明一连串(多个)变量的方法
2017/01/23 Javascript
nodejs的路径问题的解决
2018/06/30 NodeJs
了解JavaScript中的选择器
2019/05/24 Javascript
使用imba.io框架得到比 vue 快50倍的性能基准
2019/06/17 Javascript
python数据类型判断type与isinstance的区别实例解析
2017/10/31 Python
PHP实现发送和接收JSON请求
2018/06/07 Python
python对验证码降噪的实现示例代码
2019/11/12 Python
Python数据可视化:饼状图的实例讲解
2019/12/07 Python
Python 读取 YUV(NV12) 视频文件实例
2019/12/09 Python
Python读取配置文件(config.ini)以及写入配置文件
2020/04/08 Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
2020/06/29 Python
Python字典实现伪切片功能
2020/10/28 Python
基于Python中Remove函数的用法讨论
2020/12/11 Python
python接口自动化框架实战
2020/12/23 Python
10个很棒的 CSS3 开发工具 推荐
2011/05/16 HTML / CSS
CSS+jQuery实现的在线答题功能
2015/04/25 HTML / CSS
给国外客户的邀请函
2014/01/30 职场文书
司法局火灾防控方案
2014/06/05 职场文书
领导班子专题民主生活会情况想汇报
2014/09/30 职场文书
2014年医院科室工作总结
2014/12/20 职场文书
2015年幼儿园保育工作总结
2015/05/12 职场文书
运动会新闻报道稿
2015/07/22 职场文书
银行柜员工作心得体会
2016/01/23 职场文书
Java日常练习题,每天进步一点点(38)
2021/07/26 Java/Android