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版本本,有什么办法啊
手机硬件配置不支持。死心吧