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

利用反向代理编写HTTP抓包工具——可视化界面

手写HTTP抓包工具——可视化界面

项目描述
语言golang
可视化fynev2
功能代理抓包、重发、记录

目录

  • 1. 示例
    • 1.1 主界面
    • 1.2 开启反向代理
    • 1.3 抓包
    • 1.4 历史记录
    • 1.5 重发
  • 2. 核心代码
    • 2.1 GUI
    • 2.1 抓包
  • 3. 结语
    • 3.1 传送门

1. 示例

1.1 主界面

在这里插入图片描述

1.2 开启反向代理

在这里插入图片描述

1.3 抓包

在这里插入图片描述

1.4 历史记录

在这里插入图片描述

1.5 重发

在这里插入图片描述

2. 核心代码

2.1 GUI

func (cf *Config) CreateUi() {myApp := app.New()mainWin := myApp.NewWindow("Request Handling Tool v1.0")// 创建数据绑定对象cf.MainWin = &mainWin// 创建可以多行输入的 Entry 并绑定数据requestEntry := widget.NewEntryWithData(types.RequestData)requestEntry.MultiLine = truerequestEntry.Wrapping = fyne.TextWrapBreakresponseEntry := widget.NewEntryWithData(types.ResponseData)responseEntry.MultiLine = trueresponseEntry.Wrapping = fyne.TextWrapBreakErrEntry := widget.NewEntryWithData(types.ErrData)ErrEntry.MultiLine = trueErrEntry.Wrapping = fyne.TextWrapBreakhisreq1Entry := widget.NewEntryWithData(types.History_RequestD)hisreq1Entry.MultiLine = truehisreq1Entry.Wrapping = fyne.TextWrapBreakhisres2Entry := widget.NewEntryWithData(types.History_ResponseD)hisres2Entry.MultiLine = truehisres2Entry.Wrapping = fyne.TextWrapBreakrepeat_req1Entry := widget.NewEntryWithData(types.Repeat_RequestD)repeat_req1Entry.MultiLine = truerepeat_req1Entry.Wrapping = fyne.TextWrapBreakrepeat_res2Entry := widget.NewEntryWithData(types.Repeat_ResponseD)repeat_res2Entry.MultiLine = truerepeat_res2Entry.Wrapping = fyne.TextWrapBreaktargetAddrEntry := widget.NewEntryWithData(types.TargetAD)types.TargetAD.Set("127.0.0.1:3443")serverAddrEntry := widget.NewEntryWithData(types.ServerAD)types.ServerAD.Set("0.0.0.0:8089")targetPMEntry := widget.NewEntryWithData(types.TargetPM)types.TargetPM.Set("https")targetAddrLabel := widget.NewLabel("TargetAddr:")serverAddrLabel := widget.NewLabel("ServerAddr:")targetPMLabel := widget.NewLabel("TargetPM:")// 设置请求和响应 Entry 控件铺满父容器check1 := widget.NewCheckWithData("AutoSend", types.AutoSData)check1.SetChecked(true)check_history := widget.NewCheckWithData("HistoryOK", types.HistoryOK)check_history.SetChecked(true)sendButton := widget.NewButton("Send", func() {cf.GUI_Send()})send2Button := widget.NewButton("SendRAW", func() {cf.GUI_Send_repeat()})discardButton := widget.NewButton("Discard", func() {cf.GUI_Discard()})nextButton := widget.NewButton("Next", func() {cf.GUI_Next()})sRepeatButton := widget.NewButton(">>Repeat", func() {cf.GUI_sRepeat()})clearButton := widget.NewButton("ClearHistory", func() {cf.GUI_Clear()})_history_dir_Button := widget.NewButton("ClearHistoryDirFile", func() {cf.GUI_history_dir_Button()})nextButton.Disable()sendButton.Disable()discardButton.Disable()cf.Sendbt = sendButtoncf.Nextbt = nextButtoncf.Discardbt = discardButtonOKconfig := widget.NewButton("Save", func() {cf.GUI_Save_config()})OpenProxyconfig := widget.NewButton("OpenProxy", func() {cf.GUI_OpenProxyconfig()})CloseProxyconfig := widget.NewButton("CloseProxy", func() {cf.GUI_CloseProxyconfig()})CloseProxyconfig.Disable()OKconfig.Disable()cf.OpenProxybt = OpenProxyconfigcf.CloseProxybt = CloseProxyconfigcf.Savebt = OKconfig// 创建 Grid 布局grid_capture := container.NewGridWithColumns(3,container.NewStack(requestEntry),container.NewStack(responseEntry),container.NewVBox(check1, sendButton, discardButton, nextButton, sRepeatButton),)grid_config := container.NewGridWithColumns(3,container.NewVBox(container.NewVBox(targetAddrLabel, targetAddrEntry),container.NewVBox(serverAddrLabel, serverAddrEntry),container.NewVBox(targetPMLabel, targetPMEntry)),container.NewVBox(check_history, OKconfig, OpenProxyconfig, CloseProxyconfig, clearButton, _history_dir_Button),container.NewStack(ErrEntry),)table := widget.NewTable(// 返回表格的行数和列数func() (int, int) {return len(types.History_Data), len(types.History_Data[0]) // 第三列为按钮},// 返回每个单元格的 CanvasObjectfunc() fyne.CanvasObject {entry := widget.NewEntry()ccButton := widget.NewButton("Select", nil)repeatButton := widget.NewButton(">>Repeat", nil)buttonContainer := container.NewGridWithColumns(2, ccButton, repeatButton)en1 := container.NewVBox(entry, buttonContainer)return en1},// 更新每个单元格的内容func(id widget.TableCellID, obj fyne.CanvasObject) {en1 := obj.(*fyne.Container)entry := en1.Objects[0].(*widget.Entry)buttonContainer := en1.Objects[1].(*fyne.Container)ccButton := buttonContainer.Objects[0].(*widget.Button)repeatButton := buttonContainer.Objects[1].(*widget.Button)if id.Col <= 1 { // 前两列显示数据entry.Show()           // 显示 EntrybuttonContainer.Hide() // 隐藏按钮容器entry.SetText(types.History_Data[id.Row][id.Col])} else if id.Col > 1 { // 第三列显示按钮entry.Hide()           // 隐藏 EntrybuttonContainer.Show() // 显示按钮容器ccButton.OnTapped = func(row int) func() {return func() {cf.GUI_Table_bt(row)}}(id.Row)repeatButton.OnTapped = func(row int) func() {return func() {cf.GUI_Table_Repeat_bt(row)}}(id.Row)}})cf.Table_history = table// 创建带有垂直滚动条的容器tableContainer := container.NewVScroll(table)// 创建histroy布局grid_history := container.NewGridWithRows(2,container.NewStack(tableContainer),container.NewGridWithColumns(2,container.NewStack(hisreq1Entry),container.NewStack(hisres2Entry),),)grid_repeat := container.NewGridWithColumns(3,container.NewStack(repeat_req1Entry),container.NewStack(repeat_res2Entry),container.NewVBox(send2Button),)tab2 := container.NewTabItem("capture", grid_capture)tab1 := container.NewTabItem("config", grid_config)tab3 := container.NewTabItem("history", grid_history)tab4 := container.NewTabItem("repeat", grid_repeat)tabContainer := container.NewAppTabs(tab1, tab2, tab3, tab4)tabContainer.SetTabLocation(container.TabLocationTop)// 布局// 拦截关闭事件mainWin.SetCloseIntercept(func() {mainWin.Hide() // 隐藏窗口})mainWin.SetContent(tabContainer)// 添加窗口大小变化监听器mainWin.Resize(fyne.NewSize(800, 600))mainWin.ShowAndRun()}

2.1 抓包

func Run(conf *Config) {for {select {case <-conf.RunTH:types.ErrMainData += fmt.Sprintln("[+] Close-Proxy-OK")// fmt.Println(1)returndefault:// fmt.Println(0)}if conf.ServerAddr == "" || conf.TargetAddr == "" || conf.TargetPM == "" || conf.Nextbt == nil {time.Sleep(2 * time.Second)types.ErrMainData += fmt.Sprintln("[-] Parameters not saved or initialization not completed")} else {break}}Init(conf)// 创建 HTTP 处理函数的中间件middleware := func(http.Handler) http.Handler {return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {types.CHT <- truehisD1 := []string{}hisD2 := []string{}defer func() { <-types.CHT }()// 获取原始请求的字符串表示dump, err := httputil.DumpRequest(r, true)utils.HandleErr(utils.GCFN(), err)dump, err = conf.HostFix(dump)utils.HandleErr(utils.GCFN(), err)if ok, err := types.HistoryOK.Get(); ok {utils.HandleErr(utils.GCFN(), err)hisD1 = append(hisD1, string(dump))hisD2 = append(hisD2, fmt.Sprintf("%v %v", r.Method, r.URL.String()))}// // 打印原始请求字符串// fmt.Printf("\033[32m%s\033[0m\n", dump)if ok, err := types.AutoSData.Get(); !ok {utils.HandleErr(utils.GCFN(), err)err = types.RequestData.Set(string(dump))utils.HandleErr(utils.GCFN(), err)conf.Cf_Enable()CC:for {select {case <-types.SendCH:rdata, err := types.RequestData.Get()utils.HandleErr(utils.GCFN(), err)// 将 rdata 解析成 *http.Request 对象r, err = http.ReadRequest(bufio.NewReader(bytes.NewBufferString(rdata)))utils.HandleErr(utils.GCFN(), err)break CCcase <-types.DiscardCH:returndefault:}time.Sleep(100 * time.Millisecond)}} else {err = types.RequestData.Set("")utils.HandleErr(utils.GCFN(), err)err = types.ResponseData.Set("")utils.HandleErr(utils.GCFN(), err)}recorder := httptest.NewRecorder()recorder.Header().Add("Waf", "Coraza-v3")// 使用反向代理转发请求conf.Proxy.ServeHTTP(recorder, r)// 创建 http.Response 对象response := recorder.Result()// 使用 httputil.DumpResponse 来获取完整响应包res1, err := httputil.DumpResponse(response, true)utils.HandleErr(utils.GCFN(), err)if ok, _ := types.HistoryOK.Get(); ok {hisD1 = append(hisD1, string(res1))ff := utils.Wrtie_history_response(hisD1, conf.TargetAddr)hisD2 = append(hisD2, ff)types.History_Data = append(types.History_Data, hisD2)}if ok, err := types.AutoSData.Get(); !ok {utils.HandleErr(utils.GCFN(), err)err = types.ResponseData.Set(string(res1))utils.HandleErr(utils.GCFN(), err)}conf.TxProcessResponse(recorder, w, r)if ok, err := types.AutoSData.Get(); !ok {utils.HandleErr(utils.GCFN(), err)BB:for {select {case <-types.NextCH:err = types.RequestData.Set("")utils.HandleErr(utils.GCFN(), err)err = types.ResponseData.Set("")utils.HandleErr(utils.GCFN(), err)break BBdefault:}time.Sleep(100 * time.Millisecond)}} else {err = types.RequestData.Set("")utils.HandleErr(utils.GCFN(), err)err = types.ResponseData.Set("")utils.HandleErr(utils.GCFN(), err)conf.Cf_Disable()}})}server := &http.Server{Addr:    conf.ServerAddr,Handler: middleware(http.DefaultServeMux), // 使用中间件包裹默认的 ServeMux}go func() {types.ErrMainData += fmt.Sprintf("[+] Starting server at %v\n", conf.ServerAddr)if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {utils.HandleErr(utils.GCFN(), err)}}()AA:for {select {case <-conf.RunTH:break AAdefault:time.Sleep(500 * time.Millisecond)}}// 通过 context 实现优雅关闭ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)defer cancel()if err := server.Shutdown(ctx); err != nil {types.ErrMainData += fmt.Sprintf("[-] Server shutdown failed:%v\n", err)if err := server.Close(); err != nil {types.ErrMainData += fmt.Sprintf("[!] Server Close failed:%v\n", err)} else {types.ErrMainData += fmt.Sprintln("[+] Close-Proxy-OK")}} else {types.ErrMainData += fmt.Sprintln("[+] Close-Proxy-OK")}}

3. 结语

3.1 传送门

MiniBurp.exe(仅供学习)

相关文章:

利用反向代理编写HTTP抓包工具——可视化界面

手写HTTP抓包工具——可视化界面 项目描述语言golang可视化fynev2功能代理抓包、重发、记录 目录 1. 示例1.1 主界面1.2 开启反向代理1.3 抓包1.4 历史记录1.5 重发 2. 核心代码2.1 GUI2.1 抓包 3. 结语3.1 传送门 1. 示例 1.1 主界面 1.2 开启反向代理 1.3 抓包 1.4 历史记录…...

下拉框数据被遮挡 且 后续数据无法下拉的 解决方法

目录 前言1. 问题所示2. 原理分析3. 解决方法3.1 添加空白版2.2 调整z-index2.3 父容器的溢出属性2.4 调整样式属性4. 效果图前言 小程序使用的是Uniapp,原理都差不多,索性标题就不标注Uniapp(小程序) 对于该问题调试了一个晚上,最终解决,对此记录下来 1. 问题所示 执…...

课设--学生成绩管理系统(二)

欢迎来到 Papicatch的博客 目录 &#x1f40b;引言 &#x1f988;编写目的 &#x1f988;项目说明 &#x1f40b;产品介绍 &#x1f988;产品概要说明 &#x1f988;产品用户定位 &#x1f988;产品中的角色 &#x1f40b; 产品总体业务流程图 &#x1f40b; 产品功…...

STM32CubeMX配置-外部中断配置

一、简介 MCU为STM32G070&#xff0c;配置为上升沿触发外部中断&#xff0c;在上升沿外部中断回调函数中进行相关操作。 二、外部中断配置 查看规格书中管教描述&#xff0c;找到I/O对应的外部中断线&#xff0c;然后进行如下上升沿触发外部中断配置。 三、生成代码 调用上升沿…...

基于Vue的日程排班表 - common-schedule

原文&#xff1a;基于Vue的日程排班表 - common-schedule-CSDN博客...

SmartEDA、Multisim、Proteus大比拼:电路设计王者之争?

在电路设计领域&#xff0c;SmartEDA、Multisim和Proteus无疑是三款备受瞩目的软件工具。它们各自拥有独特的功能和优势&#xff0c;但在这场电路设计王者的竞争中&#xff0c;谁才是真正的领跑者&#xff1f;让我们深入探究这三款软件的异同&#xff0c;揭示它们各自的魅力所在…...

【教资科一传统文化】文化素养传统文化之神话传说、天文历法、古代称谓、中国传统节日、成语典故

目录 ​编辑 传统文化之天文历法 (一)四时(四季)从农历、名称上掌握 (二)二十四节气&#xff08;1、名称2、季节-节气3、特殊&#xff09; (三)十二时辰&#xff08;1.先后顺序2.时间段3.别称&#xff09; (四)五更(五夜) (五)天干地支(1.名称2.纪年) ​文化素养传统文化…...

Apache Pulsar 从入门到精通

一、快速入门 Pulsar 是一个分布式发布-订阅消息平台&#xff0c;具有非常灵活的消息模型和直观的客户端 API。 最初由 Yahoo 开发&#xff0c;在 2016 年开源&#xff0c;并于2018年9月毕业成为 Apache 基金会的顶级项目。Pulsar 已经在 Yahoo 的生产环境使用了三年多&#…...

[Bug]使用duckduckgo的duckduckgo_search API搜索图片出现了错误

现在在kaggle上学习一个课程&#xff0c;第一课主要是识别图片里面是不是鸟&#x1f426;。其中一步是使用duckduckgo 搜索图片&#xff0c;源码&#xff1a; from duckduckgo_search import ddg_images from fastcore.all import * from fastbook import search_images_ddgde…...

线程池若干问题

线程池中线程异常后&#xff0c;销毁还是复用&#xff1f; 线程池在提交任务前&#xff0c;可以提前创建线程吗&#xff1f; 线程池中线程异常后&#xff0c;销毁还是复用&#xff1f; 直接说结论&#xff0c;需要分两种情况&#xff1a; 使用execute()提交任务&#xff1a…...

k8s+RabbitMQ单机部署

1 k8s 配置文件yaml: apiVersion: apps/v1 kind: Deployment metadata:name: rabbitmq-deploynamespace: rz-dt spec:replicas: 1selector:matchLabels:app: rabbitmqtemplate:metadata:labels:app: rabbitmqspec:containers:- name: rabbitmqimage: "rz-dt-image-server…...

github.com/therecipe/qt windows中安装

github.com/therecipe/qt windows中安装 a.准备好源码,解压到go/src/github.com/therecipe/qtwin下 b.设置cmd环境变量: set QT_DIRM:\work\tool\Qt5.14.2\5.14.2\mingw73_64 set QT_VERSION5.14.2 set QT_API5.13.0 set QT_QMAKE_DIRM:\work\tool\Qt5.14.2\5.14.2\mingw73_64\…...

LogicFlow 学习笔记——11. 对齐线 和 键盘快捷键

对齐线 Snapline 对齐线能够在节点移动过程中&#xff0c;将移动节点的位置与画布中其他节点位置进行对比&#xff0c;辅助位置调整。位置对比有如下两个方面。 节点中心位置节点的边框 对齐线使用 普通编辑模式下&#xff0c;默认开启对齐线&#xff0c;也可通过配置进行关…...

FastWeb - Lua开源跨平台网站开发服务

在网站开发领域&#xff0c;大家都熟知PHPStudy和宝塔这两款广受欢迎的工具&#xff0c;但今天我要介绍的是一款功能强大、支持跨平台的开源Lua网站开发服务——Fast Web&#xff0c;以及与之配套的网站管理器。 Fast Web简介 Fast Web是一款基于Lua编写的网站开发框架&#…...

原子阿波罗STM32F767程序的控制器改为STM32F407驱动LCD屏

由于手里没有原子大神的F429开发板&#xff0c;又还想学习原子大神的F429开发板程序&#xff0c;前几天&#xff0c;经过更换控制器&#xff0c;成功把原子大神的F429开发板程序用到了F407开发板上&#xff0c;驱动LCD屏显示成功&#xff0c;目的&#xff0c;就是熟悉原子大神的…...

04-jQuery工具函数及 jQuery 插件

1. jQuery工具函数 在jQuery中,工具函数是指直接依附于jQuery对象,针对jQuery对象本身定义的方法,即全局性的,我们统称为工具函数,或Utilites函数。 主要作用于&#xff1a;字符串、数组、对象。 调用格式: $.函数名()或jQuery.函数名() 1.1 $.get() 通过远程 HTTP GET 请…...

基于Python的花卉识别分类系统【W9】

简介&#xff1a; 基于Python的花卉识别分类系统利用深度学习和计算机视觉技术&#xff0c;能够准确识别和分类各种花卉&#xff0c;如玫瑰、郁金香和向日葵等。这种系统不仅有助于植物学研究和园艺管理&#xff0c;还在生态保护、智能农业和市场销售等领域展现广泛应用前景。随…...

Visual Studio Code 配置教程,手把手教你如何配置

文章目录 引言1. 安装 VS Code1.1 下载和安装1.2 初次启动 2. 基本配置2.1 设置用户和工作区配置2.2 常用配置项 3. 安装和配置扩展插件3.1 安装扩展3.2 推荐扩展3.3 配置扩展 4. 主题和配色方案4.1 安装主题4.2 切换主题4.3 自定义配色方案 5. 版本控制集成5.1 配置 Git5.2 Gi…...

教案:Horovod v0.2 介绍与使用

课程目标 了解Horovod的主要功能和优势。学习如何安装和配置Horovod。掌握Horovod在分布式训练中的应用。 教学内容 Horovod的简介和动机 动机 使单GPU训练脚本轻松扩展到多GPU训练。尽量减少代码修改以实现分布式训练。内部采用MPI模型&#xff0c;代码变动较少&#xff0c;…...

深入探索Spring Boot:原理与实践

Spring Boot作为一个简化Spring应用开发的框架&#xff0c;近年来在Java开发者中备受推崇。它通过提供默认配置、自动化配置和一系列开箱即用的功能&#xff0c;极大地简化了应用程序的开发和部署过程。在本篇文章中&#xff0c;我们将深入探讨Spring Boot的工作原理&#xff0…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

区块链技术概述

区块链技术是一种去中心化、分布式账本技术&#xff0c;通过密码学、共识机制和智能合约等核心组件&#xff0c;实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点&#xff1a;数据存储在网络中的多个节点&#xff08;计算机&#xff09;&#xff0c;而非…...

qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001

qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类&#xff0c;直接把源文件拖进VS的项目里&#xff0c;然后VS卡住十秒&#xff0c;然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分&#xff0c;导致编译的时候找不到了。因…...

python基础语法Ⅰ

python基础语法Ⅰ 常量和表达式变量是什么变量的语法1.定义变量使用变量 变量的类型1.整数2.浮点数(小数)3.字符串4.布尔5.其他 动态类型特征注释注释是什么注释的语法1.行注释2.文档字符串 注释的规范 常量和表达式 我们可以把python当作一个计算器&#xff0c;来进行一些算术…...