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从ftp下载数据保存实例
Nov 20 Python
python计算对角线有理函数插值的方法
May 07 Python
python追加元素到列表的方法
Jul 28 Python
Python下实现的RSA加密/解密及签名/验证功能示例
Jul 17 Python
python 对dataframe下面的值进行大规模赋值方法
Jun 09 Python
python实现的MySQL增删改查操作实例小结
Dec 19 Python
Python3.5字符串常用操作实例详解
May 01 Python
Python内置random模块生成随机数的方法
May 31 Python
python实现得到当前登录用户信息的方法
Jun 21 Python
解决python Jupyter不能导入外部包问题
Apr 15 Python
详解pycharm自动import所需的库的操作方法
Nov 30 Python
Python实现文字pdf转换图片pdf效果
Apr 03 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
第一个无线电台是由谁发明的
2021/03/01 无线电
PHP将两个关联数组合并函数提高函数效率
2014/03/18 PHP
php计算两个日期相差天数的方法
2015/03/14 PHP
微信开发之网页授权获取用户信息(二)
2016/01/08 PHP
php实现将base64格式图片保存在指定目录的方法
2016/10/13 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
2017/10/23 PHP
PhantomJS快速入门教程(服务器端的 JavaScript API 的 WebKit)
2015/08/06 Javascript
js实现Select头像选择实时预览代码
2015/08/17 Javascript
如何使用AngularJs打造权限管理系统【简易型】
2016/05/09 Javascript
Bootstrap3制作自己的导航栏
2016/05/12 Javascript
使用D3.js构建实时图形的示例代码
2018/08/28 Javascript
微信小程序使用wx.request请求服务器json数据并渲染到页面操作示例
2019/03/30 Javascript
Vue 使用typescript如何优雅的调用swagger API
2020/09/01 Javascript
JavaScript实现网页计算器功能
2020/10/29 Javascript
[00:32]10月24、25日 辉夜杯外卡赛附加赛开赛!
2015/10/23 DOTA
Python 元组(Tuple)操作详解
2014/03/11 Python
在Python中处理日期和时间的基本知识点整理汇总
2015/05/22 Python
浅析Python数据处理
2018/05/02 Python
python实现输入数字的连续加减方法
2018/06/22 Python
Python实现简单石头剪刀布游戏
2021/01/20 Python
解决Pandas的DataFrame输出截断和省略的问题
2019/02/08 Python
使用celery执行Django串行异步任务的方法步骤
2019/06/06 Python
Python3 串口接收与发送16进制数据包的实例
2019/06/12 Python
python sorted方法和列表使用解析
2019/11/18 Python
使用Python实现画一个中国地图
2019/11/23 Python
使用Rasterio读取栅格数据的实例讲解
2019/11/26 Python
Python处理PDF与CDF实例
2020/02/26 Python
python实现爱奇艺登陆密码RSA加密的方法示例详解
2020/05/27 Python
Python爬虫HTPP请求方法有哪些
2020/06/03 Python
Python高阶函数与装饰器函数的深入讲解
2020/11/10 Python
服务员自我评价
2014/01/25 职场文书
党支部三严三实对照检查材料思想汇报
2014/09/29 职场文书
财务经理岗位职责
2015/01/31 职场文书
高中军训感想
2015/08/07 职场文书
普希金诗歌赏析(6首)
2019/08/22 职场文书
Nginx 过滤静态资源文件的访问日志的实现
2021/03/31 Servers