移动测试开发Mitmproxy用于测试抓包神器详解

目录
  • 1.前言
  • 2.Mitmproxy 简介
  • 3.Mitmproxy 工作原理
  • 4.实践应用
  • 5.总结

1.前言

在移动商业广告的测试的工作中,经常会需要对广告请求进行捕获和分析,常使用的有两个测试工具:fiddler,Charles,这两个工具都可以对广告请求进行抓包,断点调试,请求替换,构造请求等,但是这两个工具都有一定的局限性。首先,fiddler 只能在 windows 上运行,charles 虽然可以在 mac,windows 上运行,但是收费。其次,在商业广告请求中经常会对接口协议进行加密处理,使用 fiddler 和 charles 就不容易解决了。最后,商业广告测试中需要对广告请求协议的各种字段进行校验,但业务涉及到多字段修改的情况下,再利用 fiddler 和 charles 逐一校验判断显然很浪费时间。经过调研和实际应用,我们发现 mitmproxy 这个工具非常灵活,它是基于 Python 开发的开源工具,提供了 Python API,可以通过载入自定义 python 脚本轻松控制请求和响应。这是其它工具所不能做到的,通过自定义脚本进行二次开发,能够解决商业广告测试过程中所遇到的问题。

2.Mitmproxy 简介

MITM(Man In The Middle Attack)中间人攻击,这种攻击模式是通过各种技术手段将受入侵者控制的一台计算机虚拟放置在网络连接中的两台通信计算机之间,这台计算机就称为 “中间人”。mitmproxy 就是用于 MITM 的 proxy,用于中间人攻击的代理。首先会向正常的代理一样转发请求,保障服务端与客户端的通信,其次,会适时的查、记录其截获的数据,或篡改数据,引发服务端或客户端特定的行为。

mitmproxy 有两个关联组件。一个是 mitmdump,它是 mitmproxy 的命令行接口,利用它我们可以对接 Python 脚本,用 Python 实现监听后的处理逻辑。另一个是 mitmweb,它是一个 Web 程序,通过它我们可以清楚观察 mitmproxy 捕获的请求。

3.Mitmproxy 工作原理

mitmproxy 有 5 种代理模式,主要包含:正向代理,透明代理,反向代理,上游代理,socks 代理,在实际使用中经常用到正向代理,mitmproxy 作为正向代理是一个位于客户端和原始服务器 (origin server) 之间的服务器,为了从原始服务器取得内容,客户端向 mitmproxy 代理发送一个请求并指定目标 (原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。

我们以 HTTPS 请求为例介绍一下 mitmproxy 作为正向代理抓包的过程:

①. 客户端连接到 mitmproxy,并发出 HTTP 连接请求。

②. mitmproxy 响应建立了一个 200 的连接

③. 客户端认为它正在与远程服务器通信,并启动 SSL 连接。使用 SNI 来指定它连接到的主机名。

④. mitmproxy 使用客户端指定的 SNI 主机名与服务端建立一个 SSL/TLS 连接。

⑤. 服务器使用匹配的证书进行响应,该证书包含生成拦截证书所需的 CN 和 SAN 值。

⑥. mitmproxy 生成拦截证书,并继续跟客户端 SSL/TLS 握手。

⑦. 客户端通过已建立的 SSL/TLS 连接发送请求。

⑧. mitmproxy 通过步骤 ④ 中启动的 SSL/TLS 连接将请求传递到服务器。

4.实践应用

解决多字段校验效率问题:

商业广告测试中有大量的重复性工作在打点校验上,为了节省测试时间和解决易漏测的问题,我们可以利用 mitmproxy 二次开发,自定义业务相关的校验规则,然后通过捕获请求对协议中的各个字段进行自动化校验,这样既可以提高测试效率,又避免了漏测问题。

以所测广告业务为例,首先建立 addons.py 文件,addons 是个列表,每个元素是一个类实例,这些类,称为一个个 addon,这些类有若干方法,这些方法实现了某些 mitmproxy 提供的事件,mitmproxy 会在某个事件发生时调用对应的方法。如下图所示为 addons 文件内容,其中 SemiNativeCSJAd 则为 addon。

SemiNativeCSJAd 类中实现了 mitmproxy 提供的 request 和 response 事件,当触发该事件的时候,就会调用对应的方法。

其中将所有类型的广告打点中的公共字段校验抽取成公共方法 semiNativeCSJfieldCheck 调用。如下图所示:

通过以上方式,简单且有效的解决了多个字段校验问题。

解决商业广告中加解密问题:

商业广告有不同的渲染形态,例如:激励视频类,模板类,在实际测试过程中,需要测试人员 mock 不同的广告进行测试,不仅如此,还会遇到需要对广告进行加解密的情况,那么具体应该怎么解决呢?以所测的广告业务为例需要做以下几个步骤:

①. mitmproxy 拦截客户端发起的请求并获取某字段

②. 利用 RSA 算法根据请求的某字段解密获取到秘钥

③. 利用 AES 算法和 ② 步骤的秘钥,对本地广告内容进行加密

④. mitmproxy 将加密的广告返回给客户端

如下图是实现的代码,此 mockMaxFile 函数还可以根据入参传入不同广告文件即可实现不同广告的 mock。

5.总结

以上就是 mitmproxy 的简单介绍和在商业广告测试中的应用,相比传统的抓包工具,mitmproxy 可以通过载入自定义 python 脚本轻松实现各种定制化需求,提升测试效率和质量,不愧为 “抓包神器”。

更多关于移动测试Mitmproxy抓包的资料请关注我们其它相关文章!

(0)

相关推荐

  • Mac下使用mitmproxy抓包HTTPS数据方法详解

    在Mac上常用的抓包软件是Charles,网上关于Charles的教程很多,这里介绍另一个抓包神器mitmproxy.mitmproxy是一款可交互式的命令行抓包工具,它除了可以抓包查看http/https请求,还有一个很强大的功能是拦截并修改request或者response,后面我会用实际例子演示如何修改知乎的回答:) 安装 mitmproxy官网介绍了用以下命令来安装 pip install mitmproxy 我在实际安装过程中遇到了一些坑,首先是OSXElCapitan及以上的系统版本

  • Python3自定义http/https请求拦截mitmproxy脚本实例

    脚本内容 代码如下: from mitmproxy import http, ctx from multiprocessing import Lock class Filter: def __init__(self, filter_info): self.log_info = "" self.mutex = Lock() self.filter_info = filter_info self.response_file = None self.switch_on = False sel

  • Python3爬虫mitmproxy的安装步骤

    mitmproxy是一个支持HTTP和HTTPS的抓包程序,类似Fiddler.Charles的功能,只不过它通过控制台的形式操作. 此外,mitmproxy还有两个关联组件,一个是mitmdump,它是mitmproxy的命令行接口,利用它可以对接Python脚本,实现监听后的处理:另一个是mitmweb,它是一个Web程序,通过它以清楚地观察到mitmproxy捕获的请求. 本节中,我们就来了解一下mitmproxy.mitmdump和mitmweb的安装方式. 1. 相关链接 GitHub

  • python如何利用Mitmproxy抓包

    一.使用 安装 pip install mitmproxy mitmproxy 是具有控制台界面的交互式,支持SSL的拦截代理 mitmdump是mitmproxy的命令行版本.想想tcpdump为HTTP mitmweb 是一个基于web的界面,适用于mitmproxy mitmproxy(mac).mitmdump.mitmweb(win) 这三个命令中的任意一个即可 mitmweb -s mitm.py 命令行启动默认端口8080 mitmweb -p 8888 -s mitm.py 指定

  • Python抓包程序mitmproxy安装和使用过程图解

    一.介绍说明 mitmproxy是一个支持HTTP和HTTPS的抓包程序,有类似Fiddler.Charles的功能,只不过它是一个控制台的形式操作. mitmproxy还有两个关联组件.一个是mitmdump,它是mitmproxy的命令行接口,利用它我们可以对接Python脚本,用Python实现监听后的处理.另一个是mitmweb,它是一个Web程序,通过它我们可以清楚观察mitmproxy捕获的请求. mitmproxy的功能: 1.拦截HTTP和HTTPS请求和响应 2.保存HTTP会

  • 移动测试开发Mitmproxy用于测试抓包神器详解

    目录 1.前言 2.Mitmproxy 简介 3.Mitmproxy 工作原理 4.实践应用 5.总结 1.前言 在移动商业广告的测试的工作中,经常会需要对广告请求进行捕获和分析,常使用的有两个测试工具:fiddler,Charles,这两个工具都可以对广告请求进行抓包,断点调试,请求替换,构造请求等,但是这两个工具都有一定的局限性.首先,fiddler 只能在 windows 上运行,charles 虽然可以在 mac,windows 上运行,但是收费.其次,在商业广告请求中经常会对接口协议进

  • Pytorch保存模型用于测试和用于继续训练的区别详解

    保存模型 保存模型仅仅是为了测试的时候,只需要 torch.save(model.state_dict, path) path 为保存的路径 但是有时候模型及数据太多,难以一次性训练完的时候,而且用的还是 Adam优化器的时候, 一定要保存好训练的优化器参数以及epoch state = { 'model': model.state_dict(), 'optimizer':optimizer.state_dict(), 'epoch': epoch } torch.save(state, pat

  • Python爬虫包 BeautifulSoup 递归抓取实例详解

    Python爬虫包 BeautifulSoup  递归抓取实例详解 概要: 爬虫的主要目的就是为了沿着网络抓取需要的内容.它们的本质是一种递归的过程.它们首先需要获得网页的内容,然后分析页面内容并找到另一个URL,然后获得这个URL的页面内容,不断重复这一个过程. 让我们以维基百科为一个例子. 我们想要将维基百科中凯文·贝肯词条里所有指向别的词条的链接提取出来. # -*- coding: utf-8 -*- # @Author: HaonanWu # @Date: 2016-12-25 10:

  • Python爬虫包 BeautifulSoup  递归抓取实例详解

    Python爬虫包 BeautifulSoup  递归抓取实例详解 概要: 爬虫的主要目的就是为了沿着网络抓取需要的内容.它们的本质是一种递归的过程.它们首先需要获得网页的内容,然后分析页面内容并找到另一个URL,然后获得这个URL的页面内容,不断重复这一个过程. 让我们以维基百科为一个例子. 我们想要将维基百科中凯文·贝肯词条里所有指向别的词条的链接提取出来. # -*- coding: utf-8 -*- # @Author: HaonanWu # @Date: 2016-12-25 10:

  • python开发的自动化运维工具ansible详解

    目录 ansible 简介 ansible 是什么? ansible 特点 ansible 架构图 ansible 任务执行 ansible 任务执行模式 ansible 执行流程 ansible 命令执行过程 ansible 配置详解 ansible 安装方式 使用 pip(python的包管理模块)安装 使用 yum 安装 ansible 程序结构 ansible配置文件查找顺序 ansible配置文件 ansuble主机清单 ansible 常用命令 ansible 命令集 ansible

  • SpringMVC开发restful API之用户查询代码详解

    一,什么是restful风格? 首先,我们来看几组例子. 传统的url: 查询 /user/query?name=tom GET 详情 /user/query?id=1 GET 创建 /user/create?name=tom POST 修改 /user/update?id=1&name=jerry POST 删除 /user/delete?id=1 GET restful风格的url: 查询 /user?name=tom GET 详情 /user/1 GET 创建 /user POST 修改

  • JMeter导入自定义的Jar包的详解教程

    1.简介 原计划这一篇是介绍前置处理器的基础知识的,结果由于许多小伙伴或者童鞋们在微信和博客园的短消息中留言问如何引入自己定义的Jar包呢???我一一回复告诉他们和引入插件的Jar包一样的道理,一通百通.但是感觉他们还是很迷糊很迷惘,因此在这里穿插一篇导入自定义的Jar包.还有另外一个原因就是前置处理器会用到这个自定义的Jar包. 2.环境准备 (1)Eclipse 我们要引入自定义的Jar包,所以你需要一个可以编写脚本生成Jar的工具,当然了你可以选择其他的开发工具,宏哥这里选择Eclipse

  • 使用python flask框架开发图片上传接口的案例详解

    python版本:3.6+ 需要模块:flask,pillow 需求:开发一个支持多格式图片上传的接口,并且将图片压缩,支持在线预览图片. 目录结构: app.py编辑内容: from flask import Flask, request, Response, render_template from werkzeug.utils import secure_filename import os import uuid from PIL import Image, ExifTags app =

  • Python入门之模块和包用法详解

    目录 模块 1. 导入模块的方式 2. 导入方式详解 3. 制作模块 4. 模块定位顺序 5. __all__ 包 1. 制作包 2. 导入包 总结 模块 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和 Python 语句 模块能定义函数,类和变量,模块里也能包含可执行的代码 1. 导入模块的方式 import 模块名 from 模块名 import 功能名 from 模块名 import * import 模块名 as 别名

  • Go开发Gin项目添加jwt功能实例详解

    目录 啥是JWT 为什么要用在你的Gin中使用JWT JWT的基本原理 JWT TOKEN怎么组成 Header Base64URL Payload Signature 解密过程 一些特点(优点和缺点) GIN整合JWT 编写jwtutil GenToken方法 ParseToken方法 编写中间件 使用中间件 测试 其他 啥是JWT JWT全称JSON Web Token是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0业务场

随机推荐