A. 如何在 Android 手機上實現抓包
千鋒扣丁學堂Android開發為您解答:
tcpmp是最快捷方便的抓包方式,還可以加深對網路協議的理解。android下可以通過如下方式抓包:
1 Android上啟動tcpmp
Android設備可以把tcpmp的可執行文件上傳到android設備上,然後通過mac遠程登錄android設備運行tcpmp,前提是這台android設備必須已經root過。步驟如下:
下載android版本的tcpmp為android系統編譯的tcpmp版本。
通過adb將tcpmp上傳到android設備
通過adb push將tcpmp文件上傳到特定的目錄,這里我們選擇/sdcard/data目錄。
在android設備上運行tcpmp
通過adb shell登陸設備,並執行tcpmp,最後一步執行./tcpmp即可。
2. 分析tcpmp輸出
經過上面的步驟成功運行tcpmp之後,接下來就可以分析輸出的網路包內容了,iOS設備和Android設備的輸出是一致的。我們先來解析下幾個基本的格式:
圖中紅色方框內的部分是一個ip包的詳細記錄,類似的紀錄還有好幾條。這里我們著重分析第一條的各部分欄位含義。
14:37:41.615018 很簡單,是該包接收到的時間。
17.143.164.37.5223 是發送方的ip地址及埠號(5223是埠號)。
10.29.44.140.58036 是我android的ip地址及埠號。
Flags [P.]
是tcp包header部分的第14個位元組的P位。這個位元組所包含的幾個flag很重要,後面我會單獨詳細講解。這里P位表示接受方需要馬上將包push到應用層。
seq 1:54
tcp包的seq號,1是起始值,54結束值。tcp之所以被認為是流,是因為tcp包所攜帶的每一個位元組都有標號(seq號)。1:54表明總共有54個位元組被接受,其中一個位元組是三次握手階段所使用,所以一共發送的長度是53位元組。
ack 101 tcp包的ack號,ack 101表明seq號為100的位元組已被確認收到,下一個期望接收的seq號從101開始。
win 255 win表示的是tcp包發送方,作為接受方還可以接受的位元組數。這里win
255表明ip為17.143.164.37的主機還可以接受255個位元組。
options [nop,nop,…] options[…]表示的是該tcp包的options區域,nop是no
opertion的縮寫,沒什麼實際用途,主要是用做padding,因為options區域按協議規定必須是4位元組的倍數。
options[… TS val 2381386761] ts
val這個值是tcp包的時間戳,不過這個時間戳和設備的系統時間沒啥關系,剛開始是隨機值,後面隨著系統時鍾自增長。這個時間戳主要用處是seq序列號越界從0重新開始後,可以確認包的順序。
options[… ecr 427050796] ts ecr這個值主要用來計算RTT。比如A發送一個tcp包給B,A會在包里帶上TS
val,B收到之後在ack包里再把這個值原樣返回,A收到B的ack包之後再根據本地時鍾就可以計算出RTT了。這個值只在ack包里有效,非ack包ecr的值就為0.
length 53 這個length是應用層傳過來的數據大小,不包括tcp的header。這個值和我們上面分析的seq 1:54是一致的。
以上就是一個基本的tcp包結構,大家可以按照上面的分析再把其他幾個包理解下。我們在做應用的時候面對的更多是http協議,但對一個http請求是怎麼通過tcp/ip分解成一個個的packet,然後怎麼在網路上穩定可靠的傳輸,要有個基本的印象。下面我們再看下tcpmp更多的功能,這些功能都是基於對tcp/ip協議的理解,遇到不理解的建議多google下相關的技術概念。
3. tcpmp知識拓展
再繼續深入tcpmp之前,先貼上一張tcp header格式圖,常看常新。
[https://github.com/music4kid/music4kid.github.io/blob/master/images/tcpheader.png?raw=true](https://github.com/music4kid/music4kid.github.io/blob/master/images/tcpheader.png?raw=true)"
width="1056">
3.1 TCP Flags(tcp header第十四個位元組)
我們再仔細看下上面提到的flags概念,flags位於tcp
header的第十四個位元組,包含8個比特位,也就是上圖的CWR到FIN。這8個比特位都有特定的功能用途,分別是:CWR,ECE,URG,ACK,PSH,RST,SYN,FIN。
CWR ,ECE 兩個flag是用來配合做congestion
control的,一般情況下和應用層關系不大。發送方的包ECE(ECN-Echo)為0的時候表示出現了congestion,接收方回的包里CWR(Congestion
Window Reced)為1表明收到congestion信息並做了處理。我們重點看其他六個flag。
URG
URG代表Urgent,表明包的優先順序高,需要優先傳送對方並處理。像我們平時使用terminal的時候經常ctrl+c來結束某個任務,這種命令產生的網路數據包就需要urgent。
ACK
也就是我們所熟悉的ack包,用來告訴對方上一個數據包已經成功收到。不過一般不會為了ack單獨發送一個包,都是在下一個要發送的packet里設置ack位,這屬於tcp的優化機制,參見delayed
ack。
PSH Push我們上面解釋過,接收方接收到P位的flag包需要馬上將包交給應用層處理,一般我們在http
request的最後一個包里都能看到P位被設置。
RST Reset位,表明packet的發送方馬上就要斷開當前連接了。在http請求結束的時候一般可以看到一個數據包設置了RST位。
SYN
SYN位在發送建立連接請求的時候會設置,我們所熟悉的tcp三次握手就是syn和ack位的配合:syn->syn+ack->ack。
FIN
Finish位設置了就表示發送方沒有更多的數據要發送了,之後就要單向關閉連接了,接收方一般會回一個ack包。接收方再同理發送一個FIN就可以雙向關閉連接了。
這8個flag首字母分別是:C E U A P R S F。初看難以記憶,我腦洞了下,把它們組合成 supr
cafe,當然少了super少了個e,我可以將就下。我們在使用tcpmp的時候會經常看到這幾個flag,[S],[P],[R],[F],[.]。其他幾個都好理解,[.]特殊點,是個佔位符,沒有其他flag被設置的時候就顯示這個佔位符,一般表示ack。
3.2 tcpmp 更多使用參數
這部分我們來看下tcpmp常用的一些命令參數。文章最開始部分的tcpmp命令是這樣的:sudo tcpmp -i rvi0 -AAl。
-i rvi0 -AAl都是屬於參數部分。常見的有這些:
-i, 要監聽的網卡名稱,-i rvi0監聽虛擬網卡。不設置的時候默認監聽所有網卡流量。
-A, 用ASCII碼展示所截取的流量,一般用於網頁或者app里http請求。-AA可以獲取更多的信息。
-X,用ASCII碼和hex來展示包的內容,和上面的-A比較像。-XX可以展示更多的信息(比如link layer的header)。
-n,不解析hostname,tcpmp會優先暫時主機的名字。-nn則不展示主機名和埠名(比如443埠會被展示成https)。
-s,截取的包位元組長度,默認情況下tcpmp會展示96位元組的長度,要獲取完整的長度可以用-s0或者-s1600。
-c,只截取指定數目的包,然後退出。
-v,展示更多的有用信息,還可以用-vv -vvv增加信息的展示量。
src,指明ip包的發送方地址。
dst,指明ip包的接收方地址。
port,指明tcp包發送方或者接收方的埠號。
and,or,not,操作法,字面意思。
上面幾個是我個人比較常用的,更多的參數可以參考這個詳細文檔。有興趣的可以分析下面幾個例子練習下:
tcpmp 『tcp[13] & 16!=0』
tcpmp src port 80 and tcp
tcpmp -vv src and not dst port 23
tcpmp -nnvvS src 192.0.1.100 and dst port 443
4. 用tcpmp分析http完整請求
說了這么多,我們再來實戰下,看一個完整的http請求流程。sudo tcpmp -i rvi0 -AAl src 60.28.215.123 or
dst 60.28.215.123
列出了6個前面的packet,10.29.44.240是我android的ip地址,60.28.215.123是知乎server的ip地址,紅色方框內是android發出的packet,白色方框內是server發出的packet。packet1是android三次握手的第一個syn包,packet2是server
ack+syn的包,packet3是android ack的包。這3個packet之後tcp的三次握手就完成了。
packet4是android發出的http
request。長度只有240個位元組,所以一個packet就發過去了,當然還設置了flags的P位,request需要馬上被應用層處理。包裡面出現了spdy,點贊。
packet5是server ack剛收到的包,長度位0,所以這僅僅是一個ack包。
packet6是server返回http的response了,1388個位元組。packet5和packet6都ack了seq為241的包,當然是為了增加ack的成功率。
中間還有好幾個packet就不仔細分析了,最後再看下請求完成的最後幾個包:
最後兩個packet比較簡單,android發送個FIN+ACK的包就斷開連接了,server直接發送了一個RST包後也斷開連接了。
B. 安卓http和https的區別
https為加密的,一般用於錢財相關,如支付寶網站,網上銀行等
HTTPS(Secure Hypertext Transfer Protocol)安全超文本傳輸協議
它是一個安全通信通道,它基於HTTP開發,用於在客戶計算機和伺服器之間交換信息。它使用安全套接字層(SSL)進行信息交換,簡單來說它是HTTP的安全版。
它是由Netscape開發並內置於其瀏覽器中,用於對數據進行壓縮和解壓操作,並返回網路上傳送回的結果。HTTPS實際上應用了Netscape的安全全套接字層(SSL)作為HTTP應用層的子層。(HTTPS使用埠443,而不是象HTTP那樣使用埠80來和TCP/IP進行通信。)SSL使用40 位關鍵字作為RC4流加密演算法,這對於商業信息的加密是合適的。HTTPS和SSL支持使用X.509數字認證,如果需要的話用戶可以確認發送者是誰。
HTTPS和HTTP的區別:
https協議需要到ca申請證書,一般免費證書很少,需要交費。
http是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議
http和https使用的是完全不同的連接方式用的埠也不一樣,前者是80,後者是443。
http的連接很簡單,是無狀態的
HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議 要比http協議安全
HTTPS解決的問題:
1 . 信任主機的問題. 採用https 的server 必須從CA 申請一個用於證明伺服器用途類型的證書. 改證書只有用於對應的server 的時候,客戶度才信任次主機. 所以目前所有的銀行系統網站,關鍵部分應用都是https 的. 客戶通過信任該證書,從而信任了該主機. 其實這樣做效率很低,但是銀行更側重安全. 這一點對我們沒有任何意義,我們的server ,採用的證書不管自己issue 還是從公眾的地方issue, 客戶端都是自己人,所以我們也就肯定信任該server.
2 . 通訊過程中的數據的泄密和被竄改
1. 一般意義上的https, 就是 server 有一個證書.
a) 主要目的是保證server 就是他聲稱的server. 這個跟第一點一樣.
b) 服務端和客戶端之間的所有通訊,都是加密的.
i. 具體講,是客戶端產生一個對稱的密鑰,通過server 的證書來交換密鑰. 一般意義上的握手過程.
ii. 加下來所有的信息往來就都是加密的. 第三方即使截獲,也沒有任何意義.因為他沒有密鑰. 當然竄改也就沒有什麼意義了.
2. 少許對客戶端有要求的情況下,會要求客戶端也必須有一個證書.
a) 這里客戶端證書,其實就類似表示個人信息的時候,除了用戶名/密碼, 還有一個CA 認證過的身份. 應為個人證書一般來說上別人無法模擬的,所有這樣能夠更深的確認自己的身份.
b) 目前少數個人銀行的專業版是這種做法,具體證書可能是拿U盤作為一個備份的載體.
HTTPS 一定是繁瑣的.
a) 本來簡單的http協議,一個get一個response. 由於https 要還密鑰和確認加密演算法的需要.單握手就需要6/7 個往返.
i. 任何應用中,過多的round trip 肯定影響性能.
b) 接下來才是具體的http協議,每一次響應或者請求, 都要求客戶端和服務端對會話的內容做加密/解密.
i. 盡管對稱加密/解密效率比較高,可是仍然要消耗過多的CPU,為此有專門的SSL 晶元. 如果CPU 信能比較低的話,肯定會降低性能,從而不能serve 更多的請求.
ii. 加密後數據量的影響. 所以,才會出現那麼多的安全認證提示
C. 安卓手機在撥號欄輸入*#什麼的能查看自己的手機硬體就是屏幕型號,CPU,和GPU了能的東西不要安裝軟體啊
*#12580*369# 顯示,Phone,H/W,第一次打電話,內存,CSC信息.
*#*#4986*2650468#*#* PDA、 Phone、 H/W、 RFCallDate
*#*#1234#*#* 顯示PDA 及 Phone等固件信息
*#*#1111#*#* FTA SW 版本
*#*#2222#*#* FTA HW 版本
*#*#44336#*#* PDA 、Phone、 CSC、 Build Time、 Changelist number
*#06# 顯示IMEI號.
各項硬體測試
*#*#0283#*#* Audio Loopback Control
*#*#0*#*#* LCD 測試
*#*#0673#*#* 或
*#*#0289#*#* Melody 測試
*#*#0842#*#* 裝置測試,例如振動、亮度
*#*#2663#*#* 觸控屏幕版本
*#*#2664#*#* 觸控屏幕測試
*#*#0588#*#* 接近感應器測試
*#0589# 背光燈感應器測試.
*#*#3264#*#* 內存版本
*#0782# 實時時鍾測試.
*#0673# 聲音測試模式.
*#0*# 通用測試,有好多項測試.
*#0228# ADC Reading 其中有網路信息,其它的我也不知道是什麼.
*#32489# 加密信息.
*#2263# 射頻頻段選擇,如:gsm1800mhz,wcdma2100mhz等,我在galaxy tab上試好象沒作用,這個可能還要硬體支持的.
*#9090# Diagnostic ConfiguratioN
*#7284# USB UART I2C Mode Control
*#872564# USB Logging Control
*#4238378# GCF Configuration
*#1575# GPS控制菜單
*#3214789650# LBS Test Mode
*#745# RIL Dump Menu
*#746# Debug Dump Menu.
*#9900# 系統轉存模式.
*#44336# PDA 、Phone、 CSC、 Build Time、 Changelist number各項硬體測試
*#2663# TSP / TSK firmware update.
*#03# NAND Flash S/N.
*#273283*255*3282*# 數據創建菜單.
*#273283*255*663282*# 開啟一個能讓你備份媒體文件的地方,例如相片、聲音及影片等
*#3282*727336*# Data Usage Status.
*#526#或
*#528# WLAN工程模式.
*#80# Unknown.
*#07# 測試歷史記錄.
*#3214789# GCF Mode Status.
*#272886# Auto Answer Selection.
*#8736364# OTA Update Menu.
*#301279# HSDPA/HSUPA 控制菜單.
*#7353# Quick Test Menu.
*2767*4387264636# Sellout SMS / PCODE view.
*#7465625# View Phone Lock Status.
*7465625*638*# Configure Network Lock MCC/MNC.
#7465625*638*# Insert Network Lock Keycode.
*7465625*782*# Configure Network Lock NSP.
#7465625*782*# Insert Partitial Network Lock Keycode.
*7465625*77*# Insert Network Lock Keycode SP.
#7465625*77*# Insert Operator Lock Keycode.
*7465625*27*# Insert Network Lock Keycode NSP/CP.
#7465625*27*# Insert Content Provider Keycode.
在撥號面板中輸入就可執行,但不保證所有代碼在你的手機上都可執行。
*#*#4636#*#*顯示手機信息、電池信息、電池記錄、使用統計數據、WiFi 信息
*#*#7780#*#* 或*#7780# 重設為原廠設定,不會刪除預設程序,及 SD 卡檔案。
*2767*3855# 重設為原廠設定,會刪除 SD 卡所有檔案。
*#*#34971539#*#* 顯示相機相機韌體版本,或更新相機韌體
*#*#7594#*#* 當長按關機按鈕時,會出現一個切換手機模式的窗口,包括: 靜音模式、飛航模式及關機,你可以用以上代碼,直接變成關機按鈕。
*#*#273283*255*663282*#*#* 開啟一個能讓你備份媒體文件的地方,例如相片、聲音及影片等
*#*#197328640#*#* 啟動服務模式,可以測試手機部分設置及更改設定
WLAN、 GPS 及藍牙
*#*#232339#*#* 或
*#*#526#*#* 或
*#*#528#*#* WLAN 測試
*#*#232338#*#* 顯示 WiFi MAC 地址
*#3214789650# 進入GPS工程模式
*#*#1472365#*#* GPS 測試
*#*#1575#*#* 其它 GPS 測試
*#*#232331#*#* 藍牙測試
*#232337# 或
*#*#232337#*#* 顯示藍牙裝置地址
*#*#8255#*#* 啟動 GTalk 服務監視器
顯示手機軟體版本的代碼
*2767*4387264636# 顯示產品代碼,這個不知能不能更改,如果不可以的話,在這可以看自己手機的版本.
D. 我老婆還是用安卓442版本,升級個443升級不到,我現在都用444版本本,有什麼辦法啊
手機硬體配置不支持。死心吧