[僅供學習,禁止用于違法]編寫一個程序來手動設置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密碼破解實戰[滲透技術]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210967.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210967.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210967.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在git使用SSH密鑰進行github身份認證學習筆記

1.生成ssh密鑰對 官網文檔:Https://docs.github.com/zh/authentication(本節內容對應的官方文檔,不清晰的地方可參考此內容) 首先,啟動我們的git bush(在桌面右鍵,點擊 Git Bush Here &#xf…

iOS_制作 cocopods庫

文章目錄 1.創建項目2.配置項目3.發布 1.創建項目 在 github 上創建倉庫&#xff0c;克隆到本地&#xff1a; git clone https://github.com/mxh-mo/MOOXXX.git在項目目錄下執行&#xff1a; pod lib create <庫名稱>進行一些配置的選擇&#xff1a; # 希望在那個平臺…

隨機分詞與tokenizer(BPE->BBPE->Wordpiece->Unigram->sentencepiece->bytepiece)

0 tokenizer綜述 根據不同的切分粒度可以把tokenizer分為: 基于詞的切分&#xff0c;基于字的切分和基于subword的切分。 基于subword的切分是目前的主流切分方式。subword的切分包括: BPE(/BBPE), WordPiece 和 Unigram三種分詞模型。其中WordPiece可以認為是一種特殊的BPE。完…

實時最優控制(Real-Time Optimal Control)工具

系列文章目錄 前言 許多現代控制方法&#xff0c;如模型預測控制&#xff08;model-predictive control&#xff09;&#xff0c;在很大程度上依賴于實時解決優化問題。特別是&#xff0c;高效解決優化控制問題的能力使復雜機器人系統在實現高動態行為&#xff08;highly dyna…

求Sn=m+mm+mmm+...+mm..mmm(有n個m)的值

題目&#xff1a;求 的值 一、做這個題我們其實可以直接一個for求解&#xff1a; a,aa,aaa...我們很容易知道它們后一項與前一項的關系就是&#xff1b; public static void Sum(int m,int n){long sum 0L;long curAn 0;for (int i 0; i < n; i){curAn m 10* curAn;/…

Qexo博客后臺管理部署

Qexo博客后臺管理部署 個人主頁 個人博客 參考文檔 https://www.oplog.cn/qexo/本地部署 采用本地Docker部署管理本地Hexo 下載代碼包 若無法下載使用科學工具下載到本地在上傳到服務器 wget https://github.com/Qexo/Qexo/archive/refs/tags/3.0.1.zip# 解壓 unzip Qexo…

C++中的前綴和

C中的前綴和&#xff08;Prefix Sum&#xff09;是一種優化算法&#xff0c;用于計算原數組中每個元素前綴和&#xff08;前面所有元素的累加和&#xff09;&#xff0c;可以在O(n)時間內實現。 #include<iostream> using namespace std;const int MAXN 100010;int Pre…

Linux comm命令教程:如何比較兩個文件的內容(附案例詳解和注意事項)

Linux comm命令介紹 comm命令是Linux系統中的一個命令&#xff0c;用于比較兩個已排序的文件或流。默認情況下&#xff0c;comm將始終顯示三列。第一列顯示只在第一個文件中的非匹配項&#xff0c;第二列顯示只在第二個文件中的非匹配項&#xff0c;第三列顯示兩個文件中的匹配…

Java開源工具庫Guava使用指南

Guava是一個功能強大的Java開源工具庫&#xff0c;提供了很多實用的工具類和函數&#xff0c;可以簡化開發過程。本文將介紹Guava的一些基本用法和常用功能。 添加Guava依賴 在開始使用Guava之前&#xff0c;首先需要在項目中添加Guava的依賴。可以通過Maven或Gradle來管理依…

Centos7.9下的celery無法直接使用-沒有找到命令

問題 關于centos7.9下執行celery -A project worker -l debug -P eventlet 找不到celery命令 -bash: celery: command not found 解決辦法 # /usr/local/Python3 為你的python路徑 echo export PATH/usr/local/Python3/bin:$PATH >> /etc/profile.d/python3.sh source /…

在循環內錯誤使用函數定義(js的問題)

考慮下面代碼&#xff1a; var elements document.getElementsByTagName(input); var n elements.length; // Assume we have 10 elements for this example for (var i 0; i < n; i) {elements[i].onclick function() {console.log("This is element #" …

利用WSL Linux編譯OpenBMC

WSL2安裝 &#xff08;1&#xff09; 舊版 WSL 的手動安裝步驟 | Microsoft Learn &#xff08;2&#xff09; https://www.cnblogs.com/37yan/p/16169564.html &#xff08;3&#xff09; 在win10中安裝linux--使用WSL_wsl.conf-CSDN博客 安裝Ubuntu 18.04 on Windows 安…

聯合體和枚舉

聯合體&#xff1a; 聯合體是什么&#xff1f; 聯合體也是一種自定義類型&#xff0c;這種類型定義的變量也包含一系列類型&#xff0c;特征是這些類型公用一塊內存空間(所以叫聯合體也叫公用體)可以理解為結構體公用一塊內存。 //聯合-聯合體-共用體 //聯合也是一種特殊的自…

TOMCAT9安裝

1、官網下載 2、解壓到任意盤符&#xff0c;注意路徑不要有中文 3、環境變量 path 下 配置 %CATALINA_HOME%\bin 4、找到tomcat9/bin&#xff0c; 點擊 start.bat啟動 tomcat

目標檢測、目標跟蹤、重識別

文章目錄 環境前言項目復現特征提取工程下載參考資料 環境 ubuntu 18.04 64位yolov5deepsortfastreid 前言 基于YOLOv5和DeepSort的目標跟蹤 介紹過針對行人的檢測與跟蹤。本文介紹另一個項目&#xff0c;結合 FastReid 來實現行人的檢測、跟蹤和重識別。作者給出的2個主…

jsp 設備預約管理系統Myeclipse開發mysql數據庫web結構java編程計算機網頁項目

一、源碼特點 JSP 設備預約管理系統是一套完善的java web信息管理系統&#xff0c;對理解JSP java編程開發語言有幫助&#xff0c;系統具有完整的源代碼和數據庫&#xff0c;系統主要采用B/S模式開發。開發環境為 TOMCAT7.0,Myeclipse8.5開發&#xff0c;數據庫為Mysql5.0…

SQL命令---添加新字段

介紹 使用sql語句為表添加新字段。 命令 alter table 表名 add 新字段名 數據類型;例子 向a表中添加name字段&#xff0c;類型為varchar(255)。 alter table a add name varchar(255);下面是執行添加有的表結構&#xff1a;

TimescaleDB-1 安裝

前置條件&#xff1a; 1、操作系統ubuntu2204 2、已經通過apt的方式安裝了pg14 當然其他的操作系統&#xff0c;官方文檔中也有說明。 一、安裝 https://docs.timescale.com/self-hosted/latest/install/installation-linux/ Installing self-hosted TimescaleDB on Debian-…

springboot+jdbcTemplate+sqlite編程示例——以滬深300成分股數據處理為例

引言 我們在自己做一些小的項目或者小的數據處理分析的時候&#xff0c;很多時候是不需要用到mysql這樣的大型數據庫&#xff0c;并且也不需要用到maven這樣很重的框架的&#xff0c;取而代之可以使用jdbcTemplatesqlite這樣的組合。 本文就介紹一下使用springbootjdbcTempla…

課堂練習3.4:進程的切換

3-9 課堂練習3.4:進程的切換 進程切換是支持多進程的一個關鍵環節,涉及到 CPU 現場的保存和恢復,本實訓分析 Linux 0.11 的進程切換過程。 第1關第一次進程切換過程分析 任務描述 本關任務回答問題: 在第一次進程切換時: 1.是從幾號進程切換到幾號進程?0 號進程和 1 號…