在建立socket連接之前,OkHttp會獲取系統(tǒng)的代理信息,如果設(shè)置代理,那么通過DNS解析其IP然后使用代理IP來建立socket連接。如果沒有設(shè)置代理,那么會使用請求中的url的IP地址,來建立連接。
創(chuàng)新互聯(lián)建站專注于灌陽企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,商城網(wǎng)站建設(shè)。灌陽網(wǎng)站建設(shè)公司,為灌陽等地區(qū)提供建站服務(wù)。全流程按需搭建網(wǎng)站,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)
如果要防抓包,那只需要繞過代理就可以了。
OkHttp使用ProxySelector來獲取代理信息,在構(gòu)造OkHttpClient時是可以設(shè)置的,其默認值是ProxySelector.getDefault(),該默認值會反應(yīng)出系統(tǒng)的代理信息。 那么我們就可以提供自己的ProxySelector實現(xiàn)來達到繞過系統(tǒng)代理的能力。
OkHttpClient client = new OkHttpClient.Builder()
? ? ? ? ? ? ? ? ? ? ? ? .proxySelector(new ProxySelector() {
? ? ? ? ? ? ? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? ? ? ? ? ? ? public ListProxy select(URI uri) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return Collections.singletonList(Proxy.NO_PROXY);
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? ? ? ? ? ? ? public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? }).build();
varmOkHttpClientBuilder = OkHttpClient.Builder().proxy(Proxy.NO_PROXY)
注釋:文章轉(zhuǎn)賬來源
參考文章:
反安卓防抓包--no_proxy
反安卓防抓包--no_proxy由于使用了Proxy.No_Proxy導(dǎo)致Fiddler 或 Charles 抓不到包解決方案是使用drony 就行。
Android系統(tǒng)手機端抓包方法有如下:一、抓包準(zhǔn)備
1. Android手機需要先獲得root權(quán)限。一種是否獲得root權(quán)限的檢驗方法:安裝并打開終端模擬器(可通過安卓市場等渠道獲得)。在終端模擬器界面輸入su并回車,若報錯則說明未root,若命令提示符從$變#則為rooted。
2. 如果Android手機尚未root,可通過superoneclick或其它方法進行root處理(需要先安裝Microsoft .NET Framework)。
3. 需要先獲得 Android SDK,Android的開發(fā)環(huán)境。
4. 需要獲得tcpdump軟件。
二、抓包步驟
1. 將Android手機與電腦USB相連,打開windows命令提示符窗口。
2. 將tcpdump程序copy至android手機(該命令前面那個目錄文件為本地地址,后面那個目錄為目的手機端地址)。C:\android-sdk-windows\platform-toolsadb push c:/tcpdump /data/local/tcpdump
3. 修改tcpdump的權(quán)限。C:\android-sdk-windows\platform-toolsadb shell #chmod 777 /data/local/tcpdump
4. 進入root權(quán)限 C:\android-sdk-windows\platform-toolsadb shell,執(zhí)行$ su ,在運行su指令后,手機終端桌面會出現(xiàn)相應(yīng)提示信息以確認您對root操作的認可。
5. 運行tcpdump,輸入以下命令啟動抓包。/data/local/tcpdump -p -vv -s 0 -w /sdcard/capture.pcap。
6. 在手機端執(zhí)行相應(yīng)需要進行抓包分析的操作,執(zhí)行完成后在命令提示符窗口執(zhí)行Ctrl+C中斷抓包進程。
7. 將抓包結(jié)果復(fù)制至本地(前面那個目錄為手機端地址,后面那個目錄為本地地址),C:\android-sdk-windows\platform-toolsadb pull /sdcard/capture.pcap c:/
8. 使用Wireshark等工具查看抓包文件capture.pcap。
將瀏覽器的代理設(shè)置成Fiddler能夠?qū)崿F(xiàn)Fiddler抓取瀏覽器的請求。同理,Android手機配置Fiddler作為代理服務(wù)器,從而讓Fiddler能夠截獲Android的流量來實現(xiàn)抓包。
可以通過ipconfig命令等查看,最簡單的就是將鼠標(biāo)移到Fiddler窗口右上角的online字樣上面,會自動提示當(dāng)前電腦IP地址。
比如,我當(dāng)前PC IP地址為172.20.224.63
打開Fiddler上Tools--Options,選擇Connections選項卡,可以查看到代理端口地址。默認為8888。你可以自行配置成其他端口號。
還有,請勾選“Allow remote computers to connect”(這是允許Android手機通過代理進行網(wǎng)絡(luò)訪問)。
手機連接和PC位于同一局域網(wǎng)的wifi,連接成功后,進入到高級選項中。(不同手機有不同的進入方法,早期手機是長按已經(jīng)連接上的wifi,現(xiàn)在有些手機直接提供了進入配置的箭頭按鈕。)
將代理服務(wù)器主機名修改為第一步獲取的IP地址,端口號為第一步獲取的端口號。然后保存。
以上配置OK,打開手機進行網(wǎng)絡(luò)訪問吧,看看Fiddler上有沒有HTTP請求包。
實際測試,如果發(fā)現(xiàn)沒有數(shù)據(jù)包,你需要檢查Fiddler是否打開,是否允許遠程電腦訪問,以及端口號和IP地址是否配置正確,然后重啟試試看(重啟Fidder、手機重連Wifi,重新配置等)。
以上配置的僅僅是抓取HTTP請求,對于HTTPS請求,你還是看不到。下面介紹下,HTTPS抓包配置。
HTTPS也是需要通過Fiddler代理來抓取的,所以呢,前面的配置代理的過程不變。下面介紹其他涉及到證書安裝方面的。
打開Tools-Options,選擇HTTPS選項卡,按照下圖進行勾選。
PC上安裝好了根證書之后,還需要在手機上安裝根證書,才能保證Fiddller能夠正確解析出HTTPS包。(原理是,手機通過Fiddler做了代理后,HTTPS請求進行握手時候獲取的證書就是Fiddler自己生成的證書,這個證書在手機上默認不受信任,這樣會導(dǎo)致手機端認為服務(wù)端非法從而斷開HTTPS握手,導(dǎo)致請求失敗。所以,我們需要讓手機信任Fiddler的根證書。)
手機在配置好HTTP代理后,打開瀏覽器,輸入: 。實際上 ipv4.fiddler 會引導(dǎo)到Fiddler所在PC的IP地址上。所以,你輸入;pc ip:port也是可以的。(題外話, ipv4.fiddler 這個域名不是外網(wǎng)通用域名,你知道為啥會正確解析不?猜想是Fiddler自己提供了本地DNS解析服務(wù))
OK,以上是所有的配置。
配置成功后,觀察Fiddler,手機進行一些操作,看看HTTPS的請求能解析不。如果你遇到下面的異常:
很大可能是由于手機上沒有安裝Fiddler的根證書。當(dāng)然,還有例外,如果手機Android系統(tǒng)為7.0以上,即便安裝了Fiddler的根證書,也會出現(xiàn)這個異常。原因請參考
通過這張圖可以看出在未使用VpnService的情況下,App會走系統(tǒng)網(wǎng)絡(luò)來進行各種網(wǎng)絡(luò)通信。而在使用VpnService的情況下,IP層網(wǎng)絡(luò)通信傳輸?shù)陌鼘⒔?jīng)由本地的虛擬通道交由VpnService來處理,這樣一來我們便可以捕獲這些數(shù)據(jù)從而達到抓包的目的。
至今還沒有完全理解這個API的意義。按照google的文檔來說就是:
看起來像是添加一個虛擬IP地址的意思,然而按照教程中的描述則為:
參數(shù)變成了子網(wǎng)掩碼,但是按照實際的使用來看更偏向于第一種。
添加路由來過濾發(fā)送特定IP地址的流量,如果不進行任何過濾則需要設(shè)置為0.0.0.0/0或::/0
添加DNS服務(wù)器的地址,如果不添加的話將使用手機默認的DNS服務(wù)器。
添加白名單,白名單中的app的流量將不會經(jīng)過vpn虛擬通道而直接走系統(tǒng)網(wǎng)絡(luò)。
設(shè)置是否為阻塞模式,默認為非阻塞。個人感覺很重要的API,github上的很多項目沒有設(shè)置為阻塞導(dǎo)致具體實現(xiàn)的時候用的都是線程輪詢的方式,這一樣一來大大提升了系統(tǒng)的開銷。設(shè)置為阻塞模式后將大大減少進程上下文的切換。
設(shè)置虛擬通道的最大傳輸字節(jié)數(shù),需要根據(jù)具體情況具體分析。在抓包的場景下最好盡可能得設(shè)置大一些。
簡單來說是否允許一些app在使用一些非主流的方式訪問網(wǎng)絡(luò)的情況下不走虛擬通道。個人覺得最好允許。
VpnService啟動后創(chuàng)建Builder進行各種初始化,結(jié)束后調(diào)用establish()獲得本地虛擬通道的文件描述符(mFD)。通過輸入流讀取需要發(fā)送IP數(shù)據(jù)包后解析包的解析(網(wǎng)上有各種第三方的庫可供選擇)。首先判斷是版本是IPV4還是IPV6,之后根據(jù)不同的版本來判斷使用的是什么協(xié)議。
實際抓包的時候可以看到很多協(xié)議種類,當(dāng)然主要的還是UDP與TCP。
可以創(chuàng)建一個稀疏數(shù)組,key為源端口,value為Datagram通道,通過Datagram通道向外發(fā)送UDP數(shù)據(jù),從而減少系統(tǒng)開銷。最終通過Datagram通道拿到UDP響應(yīng)數(shù)據(jù)后寫入mFD的輸出流。
TCP的情況比較麻煩,涉及到三次握手以及四次分手,在github上看到個人感覺比較好的做法是,本地建立一個代理服務(wù)器來模擬這個過程。這個還需要深入研究。
套接字在發(fā)送之前一定要調(diào)用protect來防止循環(huán)鏈接,否則發(fā)出去的包又回回到mFD的輸入流造成死循環(huán)。
另外mFD如果不關(guān)閉的話是沒辦法停止VpnService的。
1.首先手機得先root
2.執(zhí)行adb shell
執(zhí)行su?
3.如果手機/data目錄有讀寫權(quán)限 直接執(zhí)行?adb push /Users/p-dev/Downloads/tcpdump /data/local/tcpdump
如果手機目錄沒有權(quán)限報錯adb push permission denied
那就執(zhí)行chmod -R 777 /data/local/tcpdump 獲取權(quán)限后再執(zhí)行??adb push /Users/p-dev/Downloads/tcpdump /data/local/tcpdump
4.然后執(zhí)行adb shell?
執(zhí)行su
執(zhí)行/data/local/tcpdump -p -vv -s 0 -w /sdcard/ThinkDrive.pcap把抓包文件保存到手機sd中
用于android app的http/https網(wǎng)絡(luò)抓包的主要有以下三個工具
由于這個知識點網(wǎng)上的資料比較多,我就不重復(fù)造車了,charles和burpsuite在linux下用,windows下推薦使用fiddler,功能比較強大,寫的比較好的文章:
fiddler Android下https抓包全攻略
另外的方法可見:
名稱欄目:android抓包,Android抓包apk
網(wǎng)頁地址:http://www.rwnh.cn/article4/phpeoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、網(wǎng)站營銷、服務(wù)器托管、靜態(tài)網(wǎng)站、微信公眾號、手機網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)