通过pcap与dpkt抓包解包示例:

#!/usr/bin/env python
# -*- coding: utf-8 -*- """ 网络数据包捕获与分析程序 """ import pcap
import dpkt
import json
import re
import time
from urllib import unquote # 过滤输出目标ip
dst_lists = [
'203.66.1.212', # nslookup dpdcs.4399sy.com.hk
'52.74.10.186', # nslookup dpdcs.4399en.com
'52.58.69.212', # nslookup dpdcs.4399sy.ru
'220.241.11.3', # nslookup dpdcs.4399th.com
'124.243.195.63', # nslookup sdkdcs.4399sy.com
'42.62.106.216', # nslookup udpdcs.4399sy.com
'42.62.106.230', # nslookup udpdcs.4399sy.com
] req_data = ""
times = 0 def capt_data(eth_name="eth0", p_type=None):
"""
捕获网卡数据包
:param eth_name 网卡名,eg. eth0,eth3...
:param p_type 日志捕获类型 1:sdk日志用例分析 2:目标域名过滤输出 3:原始数据包
:return:
""" pc = pcap.pcap(eth_name)
pc.setfilter('tcp port 80') # 设置监听过滤器
print 'start capture....'
if pc:
for p_time, p_data in pc: # p_time为收到时间,p_data为收到数据
anly_capt(p_time, p_data, p_type) def anly_capt(p_time, p_data, p_type):
"""
解析数据包
:param p_data 收到数据
:param p_type 日志捕获类型 1:sdk日志用例分析 2:目标域名过滤输出 3:原始数据包
:return:
""" p = dpkt.ethernet.Ethernet(p_data)
if p.data.__class__.__name__ == 'IP':
ip_data = p.data
src_ip = '%d.%d.%d.%d' % tuple(map(ord, list(ip_data.src)))
dst_ip = '%d.%d.%d.%d' % tuple(map(ord, list(ip_data.dst)))
if p.data.data.__class__.__name__ == 'TCP':
tcp_data = p.data.data
if tcp_data.dport == 80:
# print tcp_data.data
if tcp_data.data:
# 调用日志模块,对日志进行处理
if p_type == 1:
# sdk日志用例分析
if dst_ip in dst_lists:
tmp = tcp_data.data.strip()
global req_data, times
if tmp.startswith("POST") or tmp.startswith("GET"): # or times > 0
if req_data:
haiwai_log_case(req_data)
req_data = tmp + "\n"
# times = 0
else:
req_data = req_data + tmp
# times = times + 1 elif p_type == 2:
# 目标域名过滤输出
if dst_ip in dst_lists:
print "tcp_data:", tcp_data.data else:
# 无过滤条件输出
print "tcp_data:", tcp_data.data # android 日誌類型,从data中获取
log_type_from_data = { 'open_game': u'[打开游戏]',
'network_check': u'[网络监测]',
'open_login': u'[登录界面前]',
'select_server': u'[选服日志]',
'create_role': u'[创角日志]',
'role_level_change': u'[等级日志]', # 海外,俄语
'activity_open': u'[打开游戏]',
'load_start_before_login': u'[加载开始]',
'load_finish_before_login': u'[加载结束]',
'activity_before_login': u'[登录界面前]',
'click_enter': u'[进入游戏]',
'get_user_server_login': u'[选服日志]',
'user_create_role': u'[创角日志]',
'role_login': u'[角色登录]',
'enter_success': u'[成功进入游戏]',
'role_level': u'[等级日志]',
'user_online': u'[在线日志]',
'exit_success': u'[退出游戏]', } # ios日誌類型,从请求资源路径获取
log_type_from_path = {
'activity_open.php': u'[打开游戏]',
'load_start_before_login.php': u'[加载开始]',
'load_finish_before_login.php': u'[加载结束]',
'activity_before_login.php': u'[登录界面前]',
'click_enter.php': u'[进入游戏]',
'get_user_server_login.php': u'[选服日志]',
'user_create_role.php': u'[创角日志]',
'role_login.php': u'[角色登录]',
'enter_success.php': u'[成功进入游戏]',
'user_online.php': u'[在线日志]',
'role_level.php': u'[等级日志]',
'exit_success.php': u'[退出游戏]',
'share.php': u'[分享日志]',
'init_info.php': u'[初始化日志]',
'event.php': u'[事件日志]',
'user_login.php': u'[user_login]',
'user_server_login.php': u'[user_server_login]',
'enter_game.php': u'[enter_game]',
} # 过滤path
filter_out_list = [
'u/',
'plugin/error/check',
'service/version/get_info',
] # 过滤打印出属于列表中的host的日志。
host_list = [
'dpdcs.4399sy.com.hk',
'dpdcs.4399en.com',
'dpdcs.4399sy.ru',
'dpdcs.4399th.com',
'sdkdcs.4399sy.com',
'udpdcs.4399sy.com',
] def formattime(t): # 日期字段格式化
return time.strftime('%c', time.gmtime(t + 8 * 3600)) def req_to_dict(req_string):
"""
将请求数据转换为dic
:param req_string:
:return:
"""
req_dict = {}
req_string = req_string.strip()
if len(req_string) > 0:
req_string = unquote(req_string)
# print "req_string_after_unquote:",req_string
m1 = re.search("(GET|POST)(.*)\?(.*)HTTP/1.1", req_string) # (method,path,param)
m2 = re.search("Host:(.*)", req_string) # (host,)
# m3 = re.search("\sdata=(.*)\s", req_string) # (body,)
m4 = re.search("\sdata=([\s\S]*)", req_string) # (body,)
# m5 = re.search("eventTime\":\"(\d+)", req_string) # (eventTime,)
m5 = re.search("eventTime\"\s*:\s*\"(\d+)", req_string)
if m1:
req_dict["method"] = m1.group(1).strip()
req_dict["path"] = m1.group(2).strip()[1:]
param_string = m1.group(3).strip()
if param_string:
param_string = param_string.split("&")
param_dict = {}
for item in param_string:
tmp_list = item.split("=")
if len(tmp_list) > 1:
param_dict[tmp_list[0]] = tmp_list[1]
req_dict["param"] = param_dict
if m2:
req_dict["host"] = m2.group(1).strip()
if m4:
try:
body = m4.group(1).replace("\n", "")
body = json.loads(body)
except ValueError:
print "\033[1;31;40m"
print "m4:Error:body ValueError,req_string-->%s" % req_string
print "\033[0m"
body = {}
req_dict["body"] = body if m5:
req_dict["eventTime"] = formattime(int(m5.group(1))) return req_dict def haiwai_log_assert(req_dict):
"""
日志断言处理,输出分析结果
:param req_dict:
:return:
""" # 从 data 中获取日志类型
if isinstance(req_dict, dict) and req_dict.get("body"):
if req_dict.get("body").get("data"):
data_type = req_dict.get("body").get("data").keys()
data_type_set = set(data_type)
types_key_set = set(log_type_from_data.keys())
intersect = data_type_set.intersection(types_key_set)
if intersect:
log_type = intersect.pop()
print "\033[1;31;40m %s log pass!--from body data || EventTime:-->[%s] \033[0m" % (
log_type_from_data.get(log_type), req_dict.get("eventTime"))
print req_dict
else:
if 'common' in data_type and len(data_type) == 2:
data_type.remove('common')
print "\033[1;31;40m %s log not register!--from body data \033[0m" % data_type # 从 path 中获取日志类型
path = req_dict.get("path")
host = req_dict.get("host")
if host in host_list:
if path in log_type_from_path.keys():
eventTime = ""
if req_dict.get("eventTime"):
eventTime = req_dict.get("eventTime")
else:
if req_dict.get("param"):
eventTime = req_dict.get("param").get("time")
if eventTime:
eventTime = formattime(int(eventTime))
print "\033[1;31;40m %s log pass--from url || EventTime:-->[%s] \033[0m" % (
log_type_from_path.get(path), eventTime)
print req_dict
elif path and path not in filter_out_list:
print "\033[1;31;40m %s log not register!--from url! \033[0m" % path
print req_dict def client_log_check(log_type, req_dict, platform="sy"):
"""
检查SDK客户端请求字段,返回测试结果集
:param log_type: 日志类型
:param req_dict: 日志字典
:param platform: 测试平台
:return:
"""
pass def haiwai_log_case(req_string):
"""
日志用例集
一:将数据包转换为dict
二:对日志分析处理,输出测试结果
""" req_dict = req_to_dict(req_string)
haiwai_log_assert(req_dict) if __name__ == '__main__':
try:
capt_data("eth3", 1)
except TypeError:
capt_data("eth3", 1)

***微信扫一扫,关注“python测试开发圈”,了解更多测试教程!***

python+pcap+dpkt抓包小实例的更多相关文章

  1. python+pcap+dpkt 抓包小实例

    #!/usr/bin/env python # -*- coding: utf-8 -*- """ 网络数据包捕获与分析程序 """ imp ...

  2. python编写网络抓包分析脚本

    python编写网络抓包分析脚本 写网络抓包分析脚本,一个称手的sniffer工具是必不可少的,我习惯用Ethereal,简单,易用,基于winpcap的一个开源的软件 Ethereal自带许多协议的 ...

  3. Python(五)编程小实例

    Python(五)编程小实例 抓取网页信息,并生成txt文件内容! Python抓取网页技能--Python抓取网页就是我们常看见的网络爬虫,我们今天所要用到的就是我们Python中自带的模块,用这些 ...

  4. 小米6x抓包小程序https请求

    1. charles安装证书,手机设置代理等这里不多讲了, 请进入下面链接查看详细 https://blog.csdn.net/manypeng/article/details/79475870 2. ...

  5. charles抓包小程序

    charles抓包小程序: 原理呢,简单理解,通过charles开代理,然后手工wifi设置代理上网. 但是要做一些准备:手机要安装charles 证书. 注意的是安卓和ios有区别:目前安卓7.0版 ...

  6. python爬虫——论抓包的正确姿势和学好Javascript的重要性(1)

    没事想爬下数据,就入了scrapy坑,跟着https://zhuanlan.zhihu.com/data-factory这篇教程走,中间被小数量的网站坑过,不过还是写出了爬虫~~ 切糕王子:毫无防御, ...

  7. python tcp 实时抓包

    问题:之前我们系统上线后,因为是旧的系统,没有加统计的功能,比如用户喜欢那个页面,是哪些用户再访问,接口的负载能力等等. 解决办法:1,现有代码更改,添加功能.现有代码侵入太多,工作量比较大 2,想到 ...

  8. pcap网络抓包 无法import pcap

    坑爹的不知道从哪里看到说仅仅有pcap最多仅仅支持到python2.5,然后又是easy install又是安装pip就是无法成功import pcap... 我的python版本号是2.7.8. s ...

  9. APP | edxposed框架+trustmealredy模块抓包小程序

    出品|MS08067实验室(www.ms08067.com) 本文作者:ketchup(Ms08067实验室 SRSP TEAM小组成员) 一.下载edxposed框架,由于安卓5.0版本以下的不支持 ...

随机推荐

  1. phpstudy操作sql server相关经验

    1.去官网http://www.phpstudy.net/下载并安装phpstudy 2.修改php.ini配置文件如下: mssql.secure_connection = onextension= ...

  2. c++ new 与malloc有什么区别

    前言 几个星期前去面试C++研发的实习岗位,面试官问了个问题: new与malloc有什么区别? 这是个老生常谈的问题.当时我回答new从自由存储区上分配内存,malloc从堆上分配内存:new/de ...

  3. Rhythmk 一步一步学 JAVA (20) JAVA enum常用方法

    JAVA 枚举定义常用方法: 1.static Enum valueOf(Class enum,String name) 返回指定name的枚举类型 2.Static Enum values[] 返回 ...

  4. Eclipse安装Freemarker Editor插件

    在下面网址里下载freemarker-ide: http://sourceforge.net/projects/freemarker-ide/files/ 下载完成后后解压,由于该IDE里面的free ...

  5. Spring IOC容器启动流程源码解析(一)——容器概念详解及源码初探

    目录 1. 前言 1.1 IOC容器到底是什么 1.2 BeanFactory和ApplicationContext的联系以及区别 1.3 解读IOC容器启动流程的意义 1.4 如何有效的阅读源码 2 ...

  6. 11-SSH综合案例:前台用户模块:激活邮件的发送

    刚才已经把服务器的环境和客户端的软件已经搭建好了,现在就要发送邮件了.现在发送邮件的代码你不用重点去掌握啊,了解一下就行了. javax.activation javax.mail是Java EE 5 ...

  7. 数论知识总结——史诗大作(这是一个flag)

    1.快速幂 计算a^b的快速算法,例如,3^5,我们把5写成二进制101,3^5=3^1*1+3^2*2+3^4*1 ll fast(ll a,ll b){ll ans=;,a=mul(a,a)))a ...

  8. mybatis总结回顾

    1.mybatis的介绍 轻量级数据持久层框架,替代hibernate 2.mybatis的入门 导包-->配置文件(类名.xml.SqlMapConfig.xml) 类名.xml:放映射.sq ...

  9. select_shape_proto算子的几种特征模式含义解析

    select_shape_proto是一个非常有用的region筛选算子,但是由于难以理解,因此一般人使用得不是太多. 算子签名如下: select_shape_proto(Regions, Patt ...

  10. XP+Android手机DIY家庭视频点播系统-历时3周全力打造吊丝的幸福生活

    需求场景(纯熟虚构): 1. 哥电脑里有200G电影copy到手机上看没那么大空间,copy一部看一部删除一部,很是不方便也费时间.     2. 小林同学需求比较旺盛但是媳妇总有不方便的时候,家里有 ...