前言
目前存在的安卓抓包方法有很多,例如Fiddler、Charels、Packet Capture、tcpdump,其各存在一定的優(yōu)缺點(diǎn)。
- Fiddler、Charels利用電腦,利用代理的方式的方式進(jìn)行抓包,其要依賴于電腦,只能在WIFI環(huán)境下運(yùn)行,代碼不開源。
- tcpdump 需要root,并且數(shù)據(jù)包分析復(fù)雜,一般需要使用到第三方分析工具,沒法解析https。
- Packet Capture 利用安卓vpn的方式進(jìn)行抓包,無需root,可以分析https包內(nèi)容。解析文件不可以下載,代碼不開源。
- AndroidHttpCapture利用手機(jī)本地代理的方式進(jìn)行抓包,無需root,可以分析https包內(nèi)容??梢韵螺d解析文件,代碼開源。缺點(diǎn)是需要在wifi環(huán)境下操作。
綜述,目前存在的抓包工具或多或少都存在一定的缺點(diǎn),其中最好用的是PacketCapture。本項(xiàng)目參照PacketCapture,提供和PacketCaptrue基本類似的交互體驗(yàn),但是有遠(yuǎn)比PacketCapture強(qiáng)大的包解析功能,能夠解析GZIP、PNG、JPEG、GIF等各種格式的包,并且提供保存解析后的包內(nèi)容的功能,支持https,代碼開源。
方案設(shè)計(jì)
本方案主要參考Firewall,http抓包流程圖:

在流程開始前需要打開VPNService,并在本地新建ServerSocket。
以上流程的步驟說明:
1.被代理的Local Socket發(fā)起網(wǎng)絡(luò)請(qǐng)求,由于打開了VPN接口,網(wǎng)絡(luò)IP包被轉(zhuǎn)發(fā)到了虛擬網(wǎng)卡上。
2.VPNService被打開之后獲得了虛擬網(wǎng)絡(luò)的文件地址,從文件上讀取IP包。本步驟和步驟14其實(shí)是一個(gè)同一個(gè)動(dòng)作。
3.解析IP包,獲得其源端口,通過源端口判斷此IP包是由Local Socket還是Local Tunnel,如果是由Local Socket發(fā)出的則修改了目標(biāo)IP和目標(biāo)端口為本地建立的ServerSocket的IP和端口,并將源IP修改成需要目標(biāo)的IP,合成新包,并建立Session,保存此鏈路的源端口、目標(biāo)IP,目標(biāo)端口。如果是由Local Tunnel發(fā)出來的則進(jìn)行步驟16。
4.將新包寫在虛擬網(wǎng)絡(luò)的文件地址上。
5.新的Ip包被轉(zhuǎn)發(fā)到由ServerSocket所建立的LocalTunnel上。
6.LocalTunnel將其保存到請(qǐng)求容器中。請(qǐng)求容器由ConcurrentLinkedQueue來實(shí)現(xiàn)。
7.與LocalTunnel配對(duì)的RemoteTunnel從請(qǐng)求容器中取出請(qǐng)求。
8.RemoteTunnel將取出的請(qǐng)求轉(zhuǎn)發(fā)給服務(wù)器,并將請(qǐng)求保存起來,作為抓包的請(qǐng)求。
9.服務(wù)器產(chǎn)生響應(yīng)的IP包。
10.RemoteTunnel收到服務(wù)器的響應(yīng),并將響應(yīng)保存起來,作為抓包的響應(yīng)。
11.RemoteTunnel將收到的響應(yīng)保存到響應(yīng)容器,響應(yīng)容器也由ConcurrentLinkedQueue來實(shí)現(xiàn)。
12.與RemoteTunnel配對(duì)的LocalTunnel從容器中取出響應(yīng)。
13.LocalTunnel將響應(yīng)發(fā)給LocalSocket,響應(yīng)又被轉(zhuǎn)發(fā)到了虛擬網(wǎng)絡(luò)設(shè)備上。
14.VPNService從虛擬網(wǎng)絡(luò)上讀取請(qǐng)求IP包。本步驟和步驟二是同一個(gè)動(dòng)作。
15.解析獲得源端口,如果源端口是由Local Tunnel發(fā)出來的,則修改了目標(biāo)IP為Session所保存的源IP,源IP為Session所保存的目標(biāo)IP,源端口為Session所保存的目標(biāo)端口,合成新包。
16.將新包寫到虛擬網(wǎng)絡(luò)設(shè)備上。
17.響應(yīng)被轉(zhuǎn)發(fā)到Local Socket,整個(gè)過程結(jié)束。
采用以上技術(shù)方案的原因
方案的絕妙之處在于步驟3和步驟15,通過步驟3和步驟15可以建立LocalTunnel作為LocalSocket的假想服務(wù)器。LocalTunnel只需要負(fù)責(zé)和Local Socket通信,其內(nèi)部也是由SocketChannel來實(shí)現(xiàn)。使用SocketChannel來負(fù)責(zé)Local Socket無需自己實(shí)現(xiàn)復(fù)雜的TCP/IP協(xié)議,同時(shí)有更大擴(kuò)展性,可以快速的實(shí)現(xiàn)TSL/SSL,以對(duì)https進(jìn)行抓包。
筆者曾經(jīng)自己實(shí)現(xiàn)TCP/IP協(xié)議(項(xiàng)目地址 :https://github.com/huolizhuminh/NetWorkPacketCapture 版本號(hào):1.0.3)和Local Socket進(jìn)行通信,但是穩(wěn)定性一直沒有Java的SocketChannel要好。也有其它的項(xiàng)目例如ToyShark:https://github.com/LipiLee/ToyShark 采用直接實(shí)現(xiàn)TCP/IP協(xié)議,效果也不理想。
https步驟

https步驟說明
https和http整個(gè)過程類似,只是多出了步驟7和步驟17以及步驟10和步驟14,多出的不走是對(duì)請(qǐng)求和響應(yīng)進(jìn)行加解密,在container中的是加密前的請(qǐng)求以及解密后的響應(yīng)。整個(gè)https加密的過程的實(shí)現(xiàn)參照Netty。
抓包說明
- 抓包前手機(jī)需要安裝app生成的根證書。
- 不是所有的APP都支持https抓包,目前測(cè)試支持的APP有簡書、騰訊新聞、qq瀏覽器、騰訊視屏,淘寶、拼多多,不支持的有鏈家、知乎、58同城等,也有半支持的如百度新聞。
- 不支持https的原因是在7.0之后,App默認(rèn)不支持手機(jī)自身安裝的根證書,如果是開發(fā)者,可以在Manifest清單文件中進(jìn)行設(shè)置。可以設(shè)置為所有版本都支持,也可以僅設(shè)置為debug模式下支持,具體的設(shè)置方法可參考博客:https://www.cnblogs.com/wytings/p/6954293.html ,也可以參考參考我的項(xiàng)目:https://github.com/huolizhuminh/AndroidSkills/tree/master/OkhttpDemos 。
抓包過程及效果
1.選擇需要抓包的APP

2.開啟抓包后會(huì)顯示每一條連接。

3.進(jìn)入查看包內(nèi)容

4.可查看歷史

5.在設(shè)置頁面設(shè)為為自動(dòng)保存解析內(nèi)容后或者在包查看頁面保存解析內(nèi)容后,可以dump 解析之后的數(shù)據(jù),地址為:sdcard/VpnCapture/Parsedata 。
6.也可查看并dump原始數(shù)據(jù),原始數(shù)據(jù)查看地址為:sdcard/VpnCapture/Conversation
參考項(xiàng)目
本項(xiàng)目主要參考的項(xiàng)目有:
- Okhttp:https://github.com/square/okhttp, 參考了其包解析功能。
- Netty: https://github.com/netty/netty ,參考了其利用JAVA的NIO的方式使用
https。 - Firewall:https://github.com/zheying/Firewall,參考了vpn方案。
- IP-Monitor:https://github.com/zhao007z4/IP-Monitor,參考了通過端口獲得包名的方案。
- AndroidHttpCapture:https://github.com/JZ-Darkal/AndroidHttpCapture 參考了證書的生成方案。
項(xiàng)目地址
Github: https://github.com/huolizhuminh/NetWorkPacketCapture
APP下載地址:https://sj.qq.com/myapp/detail.htm?apkName=com.minhui.networkcapture
聯(lián)系我:sysuzhuminh@gmail.com