当前位置: 首页 > news >正文

aardio - 【实战】利用Sunny网络中间件实现HTTP/HTTPS流量分析与篡改

1. Sunny网络中间件简介与aardio集成

Sunny网络中间件是一个功能强大的跨平台网络分析组件,它类似于Fiddler的核心功能,但专为二次开发而设计。我在实际项目中使用这个工具进行HTTP/HTTPS流量分析时,发现它比传统抓包工具更灵活可控。

核心功能特点

  • 支持HTTP/HTTPS/WS/WSS/TCP等多种协议分析
  • 无内存泄漏风险,适合长期运行的网络监控程序
  • 提供完整的请求/响应数据获取和修改能力
  • 支持设置全局代理或指定连接使用特定代理

在aardio中集成Sunny库非常简单,只需要将下载的库文件解压到/lib/godking/目录即可。我实测发现,最新版本的Sunny.dll文件大小约10MB,兼容性很好,在Windows 7到Windows 11上都能稳定运行。

注意:aardio回调函数是被DLL用线程调用的,所以在声明回调函数时要用..thread.tostdcall()而不是..raw.tostdcall()

2. 环境配置与代理设置

2.1 基础环境搭建

首先需要准备以下环境:

  1. 最新版aardio开发环境
  2. Sunny网络中间件库文件
  3. 测试用目标程序(如浏览器或自制HTTP客户端)

我建议在开始前先创建一个简单的aardio窗体应用作为调试界面。下面是我常用的初始化代码:

import win.ui; import godking.sunny; /*DSG{{*/ var winform = win.form(text="Sunny调试工具";right=800;bottom=600) winform.add( btnStart={cls="button";text="启动代理";left=20;top=20;right=120;bottom=50}; btnStop={cls="button";text="停止代理";left=130;top=20;right=230;bottom=50} ) /*}}*/

2.2 代理服务启动

设置全局代理的完整示例代码:

var sunny = godking.sunny(); winform.btnStart.oncommand = function(id,event){ if sunny.start(8080, // 代理端口 true, // 启用全局IE代理 , // 上游代理(可选) , // 代理规则(可选) , // 脚本(可选) , // 强制TCP(可选) true, // 禁用压缩 winform // 所有者窗口 ){ win.msgbox("代理启动成功!",,winform.hwnd); } else { win.msgbox("代理启动失败!",,winform.hwnd); } } winform.btnStop.oncommand = function(id,event){ sunny.stop(); win.msgbox("代理已停止",,winform.hwnd); }

在实际测试中,我发现设置代理端口时最好选择1024以上的端口,避免权限问题。如果遇到端口占用,可以尝试更换为8081、8888等常用调试端口。

3. HTTP/HTTPS流量捕获与分析

3.1 回调函数设置

Sunny的核心功能是通过回调函数实现的。下面这个示例演示如何捕获HTTP请求:

sunny.callback_http = function(winform,context,id,msgid,msgtype,mod,url,err,pid){ import godking.sunny; // 将请求信息显示在窗口上 winform.listbox.add("["++time.now()++"] "++mod++" "++url); // 获取请求对象 var request = godking.sunny.httpRequest(msgid); // 输出请求头 var headers = request.getHeaders(); for(k,v in headers){ winform.debugOutput.add(k++": "++v); } // 获取请求体(如果有) var bodyLen = request.getBodyLen(); if(bodyLen > 0){ var body = request.getBody(); winform.debugOutput.add("Body: "++body); } }

这个回调函数会在每个HTTP请求发生时被触发。我建议在复杂项目中,将不同消息类型的处理逻辑拆分到单独的函数中,提高代码可读性。

3.2 流量过滤技巧

实际项目中,我们经常需要过滤特定类型的请求。这是我总结的几个实用过滤方法:

  1. 按URL过滤
if(string.find(url,".jpg") || string.find(url,".png")){ // 处理图片请求 }
  1. 按Content-Type过滤
var contentType = request.getHeader("Content-Type"); if(string.find(contentType,"application/json")){ // 处理JSON数据 }
  1. 按进程PID过滤
if(pid == targetPid){ // 只处理指定进程的请求 }

在性能优化方面,建议在回调函数开始处添加快速返回条件,避免不必要的处理影响性能。

4. 请求与响应篡改实战

4.1 修改请求参数

Sunny允许在请求发出前修改任何内容。这是我常用的几个修改场景:

修改URL

request.setUrl("http://new.domain.com/path");

添加/修改Header

request.setHeader("User-Agent","My Custom Agent"); request.delHeader("Referer"); // 删除Referer

修改请求体

if(msgtype == godking.sunny.msgType.http_request){ request.setBody("{\"modified\":true}"); }

4.2 拦截并修改响应

响应修改的典型应用场景包括:

  1. 替换网页资源(如图片、脚本)
  2. 注入自定义CSS/JavaScript
  3. 修改API返回数据

示例:替换所有图片请求

if(msgtype == godking.sunny.msgType.http_request && (string.find(url,".jpg") || string.find(url,".png"))){ request.setUrl("http://example.com/replacement.jpg"); // 或者直接返回空响应 // return true; // 返回true表示直接拦截 }

4.3 WebSocket数据篡改

对于WebSocket通信,Sunny同样提供完整的控制能力:

sunny.callback_websocket = function(winform,context,id,msgid,msgtype,mod,url,err,pid,wsDataType){ import godking.sunny; var ws = godking.sunny.webSocket(msgid); var data = ws.getBodyText(); // 修改发送的数据 if(msgtype == godking.sunny.msgType.ws_send){ data = data ++ "[MODIFIED]"; ws.setBody(data); } // 修改接收的数据 if(msgtype == godking.sunny.msgType.ws_received){ data = "Intercepted: " ++ data; ws.setBody(data); } }

5. 高级技巧与性能优化

5.1 线程安全注意事项

由于Sunny的回调函数是在独立线程中执行的,需要特别注意:

  1. 不能直接访问主线程的UI组件
  2. 共享数据需要加锁保护
  3. 使用owner参数访问主窗口对象

这是我处理线程安全的典型模式:

sunny.callback_http = function(owner,context,id,msgid,msgtype,mod,url){ // 正确的UI更新方式 owner.mainWindow.doUpdate(url); // 错误的直接访问方式(会导致崩溃) // winform.edit.text = url; }

5.2 性能优化建议

在处理高流量时,我总结了几点优化经验:

  1. 尽量减少回调函数中的内存分配
  2. 避免在回调中进行复杂计算
  3. 使用缓存减少重复处理
  4. 选择性处理需要的消息类型
// 性能优化示例 var cache = {}; sunny.callback_http = function(winform,context,id,msgid,msgtype,mod,url){ // 缓存已处理过的URL if(cache[url]) return; cache[url] = true; // 只处理特定类型的消息 if(msgtype != godking.sunny.msgType.http_request) return; // ...处理逻辑 }

5.3 实际项目经验分享

在最近的一个爬虫项目中,我使用Sunny中间件实现了:

  1. 自动重试失败的请求
  2. 动态修改请求参数
  3. 解析加密的API响应
  4. 绕过WAF防护

一个特别有用的技巧是结合正则表达式实现智能替换:

request.setBody(string.replace(request.getBody(), "\"token\":\"[^\"]+\"", "\"token\":\"my_new_token\""));

遇到的一个典型问题是HTTPS证书验证,解决方案是:

// 禁用证书验证(仅限测试环境) request.setOption("VerifySSL", false);

6. 完整项目示例:简易调试工具

下面是一个功能完整的网络调试工具实现:

import win.ui; import godking.sunny; import godking.vlistEx; /*DSG{{*/ var winform = win.form(text="Sunny网络调试工具";right=1000;bottom=700) winform.add( vlist={cls="win.ui.ctrl.vlistEx";left=10;top=10;right=990;bottom=600}; btnStart={cls="button";text="开始捕获";left=20;top=620;right=120;bottom=670}; btnClear={cls="button";text="清空日志";left=130;top=620;right=230;bottom=670}; chkImages={cls="checkbox";text="拦截图片";left=240;top=620;right=340;bottom=650} ) winform.vlist.setColumns({"时间","协议","方法","URL","状态"},{80,60,60,500,60}); /*}}*/ var sunny = godking.sunny(); // HTTP回调函数 sunny.callback_http = function(winform,context,id,msgid,msgtype,mod,url,err,pid){ import godking.sunny; // 获取状态码 var status = ""; if(msgtype == godking.sunny.msgType.http_response){ var response = godking.sunny.httpResponse(msgid); status = response.status; } // 添加到列表 winform.vlist.addRow( time.format(time.now(),"hh:mm:ss"), string.left(url,4)=="http"?"HTTP":"HTTPS", mod, url, status ); // 图片拦截 if(winform.chkImages.checked && (string.find(url,".jpg") || string.find(url,".png"))){ return true; // 拦截请求 } } // 启动/停止按钮事件 winform.btnStart.oncommand = function(id,event){ if(this.text == "开始捕获"){ if(sunny.start(8080,true,,,,,winform)){ this.text = "停止捕获"; winform.btnClear.disabled = true; } } else { sunny.stop(); this.text = "开始捕获"; winform.btnClear.disabled = false; } } winform.btnClear.oncommand = function(id,event){ winform.vlist.clear(); } winform.show(); win.loopMessage();

这个工具虽然简单,但包含了核心功能。在实际使用中,我通常会添加更多功能:

  1. 请求/响应详细查看器
  2. 过滤条件设置
  3. 历史记录保存
  4. 性能统计面板

7. 常见问题解决方案

问题1:代理启动失败

  • 检查端口是否被占用
  • 尝试以管理员身份运行
  • 关闭冲突的安全软件

问题2:HTTPS流量无法捕获

  • 安装Sunny的根证书
  • 确保客户端信任该证书
  • 检查是否启用了HTTPS解密

问题3:性能瓶颈

  • 减少回调函数中的日志输出
  • 使用更高效的数据结构
  • 考虑分模块处理不同类型流量

问题4:内存增长

  • 定期清理缓存
  • 检查是否有循环引用
  • 使用对象池重用资源

在长期使用中,我发现保持Sunny.dll版本更新很重要,每个新版本通常会修复一些边界情况的问题。遇到特殊问题时,查阅官方文档和社区讨论往往能找到解决方案。

http://www.jsqmd.com/news/1197631/

相关文章:

  • XMC4500开发板在工业电机控制中的应用与实践
  • 电机驱动电路设计:从基础原理到工程实践
  • 基于OptiSystem的WDM+OTDM混合光网络系统性能仿真与优化
  • 从瀑布到螺旋:六大经典软件过程模型实战选型指南
  • RSA安全实战:7种脆弱场景的Python攻击与防御指南
  • 2026年裸辞空档期面试应答策略:AI打磨3段式安全说辞——把职业空窗从扣分项转为自我驱动证明
  • 三星2纳米AI5芯片流片:特斯拉自动驾驶与半导体工艺新突破
  • 《P14917 [GESP202512 五级] 数字移动》
  • 三个维度,三款图表工具
  • VMware Workstation Pro 26H1 安装与汉化教程(超详细图文版)
  • C++回溯算法详解:从决策树遍历到剪枝优化实战
  • linux系统移植篇(二)—— Uboot启动流程与关键命令实战解析
  • 2026湖南省GEO系统协作功能核验指南:岗位权限怎么设才靠谱? - 企智芯
  • 便携设备音频I/O接口IC设计与应用解析
  • 技术成长中数量积累如何抵消运气因素:从代码量到专家模式
  • Zephyr功耗管理实战:从zephyr-cn教程学习低功耗设计终极指南
  • 从Prompt到Agent:零基础AI学习路线与实战指南
  • 阿里云EMR StarRocks多模态混合检索实战:从原理到部署
  • 2026年7月最新亨得利官方服务项目及价格查询|全部网点地址电话权威信息通告 - 亨得利官方博客
  • Windows部署SeaTunnel Web保姆级指南:JDK17+MySQL8+Vue3全栈避坑实录
  • 【Linux】网络篇三--UDP编程实战:从sendto/recvfrom到可靠传输模拟
  • 【CubeMX+Keil】从零到一:STM32CubeMX配置与Keil MDK工程构建全流程解析
  • 电子设备自动关机故障分析与电路诊断
  • 宽压输入3.3V/2.6A Buck电路设计与优化
  • Linux系统下Matlab的图形化与静默安装:从桌面到服务器的部署实践
  • 杰理6905A芯片引脚的设置
  • Origin—构建可复用的线性拟合分析模板
  • SpeechAnalyzer API实战:苹果设备语音识别性能优化与对比
  • (2026最新)茂名防水补漏本地人必选的正规靠谱公司推荐-房屋漏水检测维修师傅上门-卫生间/厨房/阳台/房顶/外墙漏水检测精准测漏 - 即刻修防水
  • 免费分享几千款5000G游戏资源 安卓单机游戏 支持手机平板可用安卓游戏网盘下载