mitmproxy 对接app实现数据截取

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的命令框中打印情况进行排查。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里给出一个简单的示例代码,基于 ASP.NET Core 和 Canal 客户端的实现。 首先需要引入 Canal 客户端的依赖,可以使用 NuGet 包管理器进行安装。 ```csharp Install-Package CanalSharp.Client ``` 然后创建一个 Canal 客户端实例,连接到 Canal 服务器。 ```csharp var client = CanalConnectors.NewSingleConnector() .WithAddress("canal.server.ip", 11111) .WithClientId("client-1") .WithRetryCount(5) .WithRetryInterval(TimeSpan.FromSeconds(10)) .Connect(); ``` 接下来订阅需要同步的数据库和表。 ```csharp client.Subscribe("database1.table1", "database1.table2"); ``` 然后在 ASP.NET Core 应用程序的 Startup.cs 文件中添加一个后台任务,用于监听 Canal 客户端的数据变更事件,并将数据同步到目标数据库中。 ```csharp public void ConfigureServices(IServiceCollection services) { // 注册数据同步后台服务 services.AddHostedService<DataSyncService>(); } public class DataSyncService : BackgroundService { private readonly ILogger<DataSyncService> _logger; private readonly IDbConnection _connection; private readonly CanalConnector _client; public DataSyncService(ILogger<DataSyncService> logger, IDbConnection connection, CanalConnector client) { _logger = logger; _connection = connection; _client = client; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { try { var message = await _client.Get(stoppingToken); foreach (var entry in message.Entries) { if (entry.EntryType == EntryType.RowData) { var header = entry.Header; var rowChange = RowChange.ParseFrom(entry.StoreValue); var eventType = rowChange.EventType; // 处理数据变更事件,将数据同步到目标数据库中 // ... _client.Ack(header); } } } catch (Exception ex) { _logger.LogError(ex, "Error occurred while syncing data."); } } } } ``` 在处理数据变更事件时,可以使用 ADO.NET 或 Entity Framework 等 ORM 框架将数据同步到目标数据库中。 这只是一个简单的示例代码,实际的实现可能需要更复杂的逻辑来处理不同类型的数据变更事件,并确保数据同步的正确性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值