⑴ 如何使用HTTP代理
第一步、選擇好提取數量,以及協議,和格式,點擊生成api鏈接,就可以獲取到鏈接了。
⑵ Android如何利用VpnService來抓包
通過這張圖可以看出在未使用VpnService的情況下,App會走系統網路來進行各種網路通信。而在使用VpnService的情況下,IP層網路通信傳輸的包將經由本地的虛擬通道交由VpnService來處理,這樣一來我們便可以捕獲這些數據從而達到抓包的目的。
至今還沒有完全理解這個API的意義。按照google的文檔來說就是:
看起來像是添加一個虛擬IP地址的意思,然而按照教程中的描述則為:
參數變成了子網掩碼,但是按照實際的使用來看更偏向於第一種。
添加路由來過濾發送特定IP地址的流量,如果不進行任何過濾則需要設置為0.0.0.0/0或::/0
添加DNS伺服器的地址,如果不添加的話將使用手機默認的DNS伺服器。
添加白名單,白名單中的app的流量將不會經過vpn虛擬通道而直接走系統網路。
設置是否為阻塞模式,默認為非阻塞。個人感覺很重要的API,github上的很多項目沒有設置為阻塞導致具體實現的時候用的都是線程輪詢的方式,這一樣一來大大提升了系統的開銷。設置為阻塞模式後將大大減少進程上下文的切換。
設置虛擬通道的最大傳輸位元組數,需要根據具體情況具體分析。在抓包的場景下最好盡可能得設置大一些。
簡單來說是否允許一些app在使用一些非主流的方式訪問網路的情況下不走虛擬通道。個人覺得最好允許。
VpnService啟動後創建Builder進行各種初始化,結束後調用establish()獲得本地虛擬通道的文件描述符(mFD)。通過輸入流讀取需要發送IP數據包後解析包的解析(網上有各種第三方的庫可供選擇)。首先判斷是版本是IPV4還是IPV6,之後根據不同的版本來判斷使用的是什麼協議。
實際抓包的時候可以看到很多協議種類,當然主要的還是UDP與TCP。
可以創建一個稀疏數組,key為源埠,value為Datagram通道,通過Datagram通道向外發送UDP數據,從而減少系統開銷。最終通過Datagram通道拿到UDP響應數據後寫入mFD的輸出流。
TCP的情況比較麻煩,涉及到三次握手以及四次分手,在github上看到個人感覺比較好的做法是,本地建立一個代理伺服器來模擬這個過程。這個還需要深入研究。
套接字在發送之前一定要調用protect來防止循環鏈接,否則發出去的包又回回到mFD的輸入流造成死循環。
另外mFD如果不關閉的話是沒辦法停止VpnService的。