[仅供学习,禁止用于违法]编写一个程序来手动设置Windows的全局代理开或关,实现对所有网络请求拦截和数据包捕获(抓包或VPN的应用)

本文主要是介绍[仅供学习,禁止用于违法]编写一个程序来手动设置Windows的全局代理开或关,实现对所有网络请求拦截和数据包捕获(抓包或VPN的应用),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

文章目录

  • 介绍
    • 一、实现原理
    • 二、通过注册表设置代理
      • 2.1 开启代理
      • 2.2 关闭代理
      • 2.3 添加代理地址
      • 2.4 删除代理设置信息
    • 三、代码实战
      • 3.1 程序控制代理操作控制
        • 3.1.1 开启全局代理
        • 3.1.2 添加代理地址
        • 3.1.3 关闭代理开关
        • 3.1.4 删除代理信息
      • 3.2 拦截所有请求

介绍

 有一天突发奇想,很好奇那些抓包软件是如何做的,所以就特地去研究了一下😄。

 分享一下如何通过程序的方式设置Windows全局代理,包括代理模式的开启或关闭以及代理服务器IP、端口的动态改变。
关于全局代理有比较多的应用场景,如抓包工具Wireshark、Fiddler、Fiddler、VPN都会涉及到Windows的代理,就拿Wireshark抓包工具来说,为什么它可以拦截到我们所有请求?下面介绍一下设计到的原理和代码实现。

一、实现原理

 在开始讲解原理之前,我们先来看一下如何通过界面的方式开启Windows全局代理。首先在自己的电脑上搜索代理服务器设置,找到后打开可看到如下界面:

在这里插入图片描述
然后点击设置,我们就可以看到下面这个界面,在这里主要关注3个部分,分别是代理的开关、代理ip地址和端口。
在这里插入图片描述
 当我们在这里打开全局代理的开关后,Windows中所有的请求都会首先通过这里,这一点很重要,然后再将请求发送出去,因此我们就可以在我们自己的程序中编写程序监听这个ip和端口,实现拦截的操作,下面是一些抓包工具的简要原理图。
在这里插入图片描述
 从上图我们可以看出,如果需要拦截到程序中所有的请求并进行处理,首先就需要开启代理服务并知道IP地址和端口号,那么是如何通过程序进行控制的呢?这里会设计到Windows注册表的使用,下面进行介绍。
为了方便下面的讲解,这里特别说明一下,本文涉及到的代理ip和端口都以上图的为准,也就是127.0.0.133210,下文以抓包工具案例进行讲解。

二、通过注册表设置代理

 在抓包软件中,对代理的操作,一般有4步,分别是开启代理、关闭代理、设置代理地址、删除代理地址,其实,本质上在程序中控制这4个操作,是通过操作Windows注册表来实现的。

2.1 开启代理

reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 1 /f

2.2 关闭代理

reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 0 /f

2.3 添加代理地址

 在下面这个指令中,我们添加了参数127.0.0.1:33210,这个就是设置代理ip和端口。

reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer /t REG_SZ /d "127.0.0.1:33210" /f

2.4 删除代理设置信息

reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer /f

 从上面我们知道它是通过注册表命令reg实现的,可以在cmd窗口执行,因此它也具备了通过程序方式的调用,从而在我们的业务逻辑中进行动态操作,比如Java程序可以通过Runtime.getRuntime().exec(command)调用上面的注册表命令,Go语言可以使用exec.Command(command)调用。

三、代码实战

 为了减少代码行数,下面以Go语言为例介绍如何通过程序的方式操作代理以及如何拦截Windows中所有的请求,这也是抓包工具的应用。

3.1 程序控制代理操作控制

3.1.1 开启全局代理

 这一步就是把全局代理的开关给打开。

package mainimport ("log""os/exec"
)func main() {// 使用 exec.Command 执行 reg add 命令// reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 1 /fcmd := exec.Command("reg", "add", "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", "/v", "ProxyEnable", "/t", "REG_DWORD", "/d", "1", "/f")// 执行命令err := cmd.Run()if err != nil {log.Fatal(err)}log.Println("全局代理已开启")}
3.1.2 添加代理地址

 当我们在代码中执行这段程序以后,就会发现在Windows代理配置中多了127.0.0.1:33210的配置。

package mainimport ("log""os/exec"
)func main() {// 使用 exec.Command 执行 reg add 命令// reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer /t REG_SZ /d "127.0.0.1:12888" /fcmd := exec.Command("reg", "add", "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", "/v", "ProxyServer", "/t", "REG_SZ", "/d", "127.0.0.1:33210", "/f")// 执行命令err := cmd.Run()if err != nil {log.Fatal(err)}log.Println("代理信息已添加")
}
3.1.3 关闭代理开关

 这里需要注意,这里只是将代理的开关给关掉了,并没有删除上面添加的代理信息,所有就有了下面的一个步骤。

package mainimport ("log""os/exec"
)func main() {// 使用 exec.Command 执行 reg add 命令// reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /t REG_DWORD /d 0 /fcmd := exec.Command("reg", "add", "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", "/v", "ProxyEnable", "/t", "REG_DWORD", "/d", "0", "/f")// 执行命令err := cmd.Run()if err != nil {log.Fatal(err)}log.Println("代理已关闭")
}
3.1.4 删除代理信息

 这一步就会删除注册表中的配置的代理信息(不想删也可以不删,随意😄)。

package mainimport ("log""os/exec"
)func main() {// 使用 exec.Command 执行 reg delete 命令// reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer /fcmd := exec.Command("reg", "delete", "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", "/v", "ProxyServer", "/f")// 执行命令err := cmd.Run()if err != nil {log.Fatal(err)}log.Println("代理信息已删除")
}

3.2 拦截所有请求

 其实这里就是通过Socket监听上面配置的代理ip:port,从而达到拦截所有TCP请求的目的,这里会设计到网络编程的应用,下面以Go语言为例,用代码简单演示一下。

package mainimport ("fmt""log""net"
)func main() {// 在本地地址127.0.0.1:33210上启动TCP监听listener, err := net.Listen("tcp", "127.0.0.1:33210")if err != nil {log.Fatal("监听失败:", err)}fmt.Println("等待连接...") // 输出等待连接的提示消息// 接受连接并处理数据for {conn, err := listener.Accept() // 接受连接请求if err != nil {log.Fatal("接收连接失败:", err)}go handleConnection(conn) // 在协程中处理连接}
}func handleConnection(conn net.Conn) {defer conn.Close() // 延迟关闭连接,确保在函数返回时连接被关闭buffer := make([]byte, 1024) // 创建一个缓冲区用于接收数据for {readLen, err := conn.Read(buffer) // 读取数据到缓冲区if err != nil {log.Println("读取数据失败:", err)break}data := string(buffer[:readLen]) // 将字节数据转换为字符串fmt.Println("接收到数据:", data) // 打印接收到的数据}
}

启动上面代码后,然后去浏览器随便打开一个页面,可以发现请求的报文都被我们编写的程序拦截到了,还有就是,如果我们电脑中有一些守护进程定时发送的请求也会被拦截到(这就有点儿意思啦😄,有些公司就是就喜欢偷偷默默搞一些隐藏程序监控员工电脑),下面是演示运行截图。
在这里插入图片描述
上面若有手误或错误的地方请在评论区留言。🙇‍

🙂🙂🙂

往期精选

💖 无线路由攻击和WiFi密码破解实战[渗透技术]

这篇关于[仅供学习,禁止用于违法]编写一个程序来手动设置Windows的全局代理开或关,实现对所有网络请求拦截和数据包捕获(抓包或VPN的应用)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/478072

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

禁止平板,iPad长按弹出默认菜单事件

通过监控按下抬起时间差来禁止弹出事件,把以下代码写在要禁止的页面的页面加载事件里面即可     var date;document.addEventListener('touchstart', event => {date = new Date().getTime();});document.addEventListener('touchend', event => {if (new

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in