mitmproxy 对接app实现数据截取
用手机模拟器、无头浏览器来爬取 APP 或网站的数据,mitmpproxy 作为代理可以拦截、存储爬虫获取到的数据,或修改数据。
mitmproxy
mitmproxy 就是用于 MITM 的 proxy,MITM 即中间人攻击(Man-in-the-middle attack)。用于中间人攻击的代理首先会向正常的代理一样转发请求,保障服务端与客户端的通信,其次,会适时的查、记录其截获的数据,或篡改数据,引发服务端或客户端特定的行为.
简单来说,mitproxy其实就是监控请求与响应,会保证客户端与服务端的正常通信,只是在发出请求时会截取到请求的各项参数,服务器响应时也可以截取到响应数据。
1,模块安装
pip install mitmproxy
2,安装验证
mitmdump --version
安装完成后,系统将拥有 mitmproxy、mitmdump、mitmweb 三个命令,由于 mitmproxy 命令不支持在 windows 系统中运行(这没关系,不用担心),要启动 mitmproxy 用 mitmproxy、mitmdump、mitmweb 这三个命令中的任意一个即可,这三个命令功能一致,且都可以加载自定义脚本,唯一的区别是交互界面的不同。
mitmproxy 命令启动后,会提供一个命令行界面,用户可以实时看到发生的请求,并通过命令过滤请求,查看请求数据。
mitmweb 命令启动后,会提供一个 web 界面,用户可以实时看到发生的请求,并通过 GUI 交互来过滤请求,查看请求数据。
mitmdump 命令启动后——你应该猜到了,没有界面,程序默默运行,所以 mitmdump 无法提供过滤请求、查看数据的功能,只能结合自定义脚本,默默工作。
由于 mitmproxy 命令的交互操作稍显繁杂且不支持 windows 系统,而我们主要的使用是载入自定义脚本进行数据的截取,所以我们只需要mitmdump即可,当然mittweb交互界面更容易错误的排查。
3,启动(mitmdump)
mitmproxy 绑定了 *:8080 作为代理端口,并提供了一个 web 交互界面在 127.0.0.1:8081
我们在使用时一般是指定自定义脚本启动,启动方式为:
mitmdump -s xxxxx.py (注意这里一定是绝对路径,不然会找不到)
-p 可以自定义指定端口,不过一般情况下是使用默认的端口8080
4,自定义脚本
# 1,第一种方法
import mitmproxy.http
from mitmproxy import ctx
class Counter:
def __init__(self):
self.num = 0
def request(self, flow: mitmproxy.http.HTTPFlow):
self.num = self.num + 1
ctx.log.info("We've seen %d flows" % self.num)
addons = [
Counter()
]
# 2,或者简单点
import json,time
from mitmproxy import ctx
from suds.client import Client
from loggings_settings import logger
def request(flow): # 请求截取
# 增加请求的头信息
url1 = 'search/notes?keyword'
if flow.request.url.find(url1) != -1:
logger.info(flow.request.headers)
def response(flow): # 响应截取
# url1是我们需要过滤的请求url中的共有字段
# todo 这里如果有多个不同的接口需要进行解析,可以再下面根据api中的关键词进行区分解析方法
url1 = 'search/notes?keyword'
if flow.request.url.find(url1) != -1:
try:
ctx.log.warn(flow.request.url)
# 这里导入到解析函数进行解析
print('开始数据解析!')
print('======'+ flow.response.text)
parse_data(flow.response.text)
except:
logger.info('Nooooooooooooooooooooooooooo')
# 注意:自定义脚本中我们使用到的所有路径都必须使用绝对路径,否则会出现路径找不到的错误。
5,原理
我们使用脚本一般处理或者操作的时候是针对目标url(api)进行截取做处理,所以可以根据上方脚本的第二种方法,根据URL中的关键字进行判断选择我们的目标URL,如果需要对多个不同的URL做不同的解析方法,我们也可以根据URL中的关键词进行区分指定不同的解析方法进行解析。
6,mitmproxy证书的安装
证书目录:用户目录下.mitmproxy文件夹下
mitmproxy-ca.p12----PKCS12格式证书私钥
mitmproxy-ca.pem----PEM格式证书私钥
mitmproxy-ca-cert.cer----PEM格式证书,与mitmproxy-ca-cert.pem相同只是改变了后辍,适用于部分Android
mitmproxy-ca-cert.p12----PKCS12格式证书,适用于Windows
mitmproxy-ca-cert.pem----PEM格式证书,适用于大多数非Windows平台
mitmproxy-dhparam.pem----PEM格式秘钥文件,用于增强SSL安全性
Windows安装证书:双击mitmproxy-ca-cert.p12----全部默认直接点“下一步”直到安装完成。
Android安装证书:把mitmproxy-ca-cert.cer通过usb复制到手机上----点击使用证书安装器安装证书(通过qq发送到手机上时提示无法读取证书不懂什么原因)
7,网络配置
网络配置跟fiddler配置方法一样
确保手机与电脑处于同一局域网下才行
手机 设置 下 WLAN 下 长按网络选择高级,手动代理 这里添加本机IP地址与mitmproxy指定的端口,这里的端口号需要与mitmproxy启动的端接口保持一致。
8,测试
保证上方所有的配置都配置正确的情况下,启动mitmproxy与模拟器中的APP
1,自定义脚本中print会打印到mitmproxy的命令框中
2,如果不确定解析方法是否正确,可以将响应文本print打印,对解析函数进行try异常抛出,根据观察mitmproxy的命令框中打印情况进行排查。