文章目錄
- 介紹
- 一、實現原理
- 二、通過注冊表設置代理
- 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.1和33210,下文以抓包工具案例進行講解。
二、通過注冊表設置代理
?在抓包軟件中,對代理的操作,一般有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密碼破解實戰[滲透技術]