如何在安卓手机上实现抢包

前锋扣顶学院安卓开发为你解答:

Tcpdump是最快捷方便的抢包方式,也可以加深对网络协议的理解。在安卓系统下,可以通过以下方式抢到包:

在1 Android上启动tcpdump

android设备可以将tcpdump的可执行文件上传到android设备,然后通过mac远程登录Android设备运行tcpdump,前提是Android设备已经root。步骤如下:

下载安卓版tcpdump作为安卓系统编译的tcpdump版本。

通过adb将tcpdump上传到android设备。

通过adb push将tcpdump文件上传到特定目录,这里我们选择/sdcard/data目录。

在android设备上运行tcpdump

通过adb shell登录设备,执行tcpdump。/tcpdump是最后一步。

2.分析tcpdump的输出

通过以上步骤成功运行tcpdump后,可以分析输出网络包内容,iOS设备和Android设备输出一致。我们先来分析以下几种基本格式:

图中的红框是一个ip包的详细记录,还有几个类似的记录。这里我们重点分析第一个字段的各个部分的含义。

14:37:41.615018很简单,就是收到包的时间。

17.143.164.37 . 5223是发送方的ip地址和端口号(5223是端口号)。

10.29.44.140.036是我安卓的ip地址和端口号。

标志[第页]

是tcp数据包报头部分第14字节的p位。这个字节中包含的几个标志非常重要,后面我会分别详细解释。这里,p位表示接收方需要立即将数据包推送到应用层。

序列1:54

tcp数据包的序列号,1是起始值,54是结束值。Tcp被认为是一个流,因为tcp数据包携带的每个字节都有一个标签(序列号)。1:54表示总共接受54个字节,三次握手阶段用一个字节,所以传输总长度为53个字节。

Ack 101 TCP包的ack号Ack 101表示序列号为100的字节已经确认,下一个预期的序列号从101开始。

Win 255 win表示tcp数据包的发送方作为接收方可以接受的字节数。这里,赢了

255表示ip为17.143.164.37的主机也可以接受255字节。

Options [NOp,nop,…] options[…]表示tcp包的选项区,nop为no。

opera的缩写,没有实际用途,主要用于填充,因为按照协议opertion区必须是4字节的倍数。

选项[…TS val 2381386761]TS

Val是tcp包的时间戳,但是这个时间戳和设备的系统时间无关。一开始是随机值,后来随着系统时钟增长。这个时间戳的主要目的是在seq的序列号出界并从0开始之后确认包的顺序。

选项[… ecr 427050796] ts ecr主要用于计算RTT。例如,如果A向B发送一个tcp数据包,A将在数据包中引入TS。

收到val和B后,按照ack包中的原样返回该值。收到B的ack包后,A可以根据本地时钟计算RTT。该值只在ack包中有效,非ack包的ecr值为0。

长度53这个长度是应用层传输的数据大小,不包括tcp的报头。该值与上面分析的序列1:54一致。

以上是一个基本的tcp包结构。你可以根据上面的分析来理解其他几个包。我们做应用的时候面对的更多的是/music 4 kid/music 4 kid . github . io/blob/master/images/TCP header . png?raw = true](/music 4 kid/music 4 kid . github . io/blob/master/images/TCP header . png?raw=true)"

width="1056 " >

3.1个TCP标志(TCP报头的第14个字节)

让我们仔细看看上面提到的标志的概念,它位于tcp中。

头的第14个字节包含8位,即上图中的CWR到FIN。这八位有特定的功能,即:CWR、ECE、URG、ACK、PSH、RST、SYN、FIN。

CWR和ECE这两个标志用于在拥塞时协作。

控件通常与应用层没有什么关系。当发送方的数据包ECE(ECN-Echo)为0时,表示存在冲突。在接收方返回的数据包中,CWR(拥塞

窗口缩小)是1,表明拥塞的消息被接收和处理。让我们把注意力集中在另外六面旗帜上。

紧急的

URG代表紧急,表示该数据包优先级高,需要先发送给对方处理。像我们平时用终端的时候,经常用ctrl+c来结束一个任务,所以这个命令产生的网络包需要是紧急的。

命令正确应答

也就是我们熟悉的ack包,用来告诉对方最后一个包已经成功接收。但一般情况下,一个包不单独发送ack,在下一个要发送的包中设置ack位,这属于tcp的优化机制。参见延迟。

ack .

PSH推送正如我们上面解释的,当接收方接收到P位标志包时,需要立即将其交给应用层进行处理。一般我们在http下载。

您可以看到,请求的最后一个数据包中设置了p位。

RST复位位表示数据包的发送方即将断开当前连接。在http请求的末尾,您通常可以看到数据包设置了RST位。

synchronizing同步

发送连接请求时会设置Syn位,大家熟悉的tcp三次握手就是SYN和ack位的配合:SYN->;syn+ack-& gt;ack .

鳍状物

当结束位被置位时,意味着发送方已经没有数据要发送了,然后连接会单向关闭,接收方通常会回复一个ack包。接收器可以通过以相同的方式发送FIN来关闭两个方向的连接。

这八面国旗的首字母是:CEU。乍一看,很难记住。我脑洞大开,把它们组合成了supr。

咖啡馆,当然没有super和一个E,我也能凑合。我们在使用tcpdump的时候,经常会看到这些标志,[S],[P],[R],[F],[。].其他的就好理解了。的特殊点。]是一个占位符。当没有设置其他标志时,显示该占位符,这通常意味着ack。

3.2 tcpdump更多使用参数

在这一部分,我们来看看tcpdump的一些常用命令参数。文章开头的tcpdump命令是这样的:sudo tcpdump -i rvi0 -AAl。

-i rvi0 -AAl都属于参数部分。常见的有:

-i,要监视的网卡的名称,以及-i rvi0监视虚拟网卡。如果未设置,默认情况下,它会监控所有网卡流量。

-A,用ASCII码显示拦截的流量,一般用于网页或app中的http请求。-AA可以获得更多信息。

-X,使用ASCII码和十六进制来显示包的内容,类似于上面的-A。-XX可以显示更多的信息(比如链路层的头)。

-n,在不解析主机名的情况下,tcpdump将优先考虑临时主机的名称。-nn不显示主机名和端口名(例如,端口443将显示为https)。

-s,截取的数据包字节的长度。默认情况下,tcpdump将显示96字节的长度。要获得完整的长度,可以使用-s0或-s1600。

-c,只拦截指定数量的数据包,然后退出。

-v,显示更多有用的信息,还可以使用-vv -vvv增加显示的信息量。

Src,表示ip数据包发送者的地址。

Dst,表示ip数据包的接收方地址。

端口,表示tcp数据包发送方或接收方的端口号。

And,or,not,操作方法,字面意思。

以上物品是我个人常用的。有关更多参数,请参考该详细文档。如果有兴趣,可以分析以下例子来练习:

TCP dump ' TCP[13]& amp;16!=0'

tcpdump src端口80和tcp

tcpdump -vv src百度而非dst端口23

tcpdump-nnvvS src 192 . 0 . 1.100和dst端口443

4.用tcpdump分析http完成请求。

说到这里,我们来看看实战中一个完整的http请求流程。sudo tcpdump-I rvi 0-AAL src 60 . 28 . 215 . 123 or

夏令时60.28.215.123

前面六个包都列出来了,10.29.44.240是我安卓的ip地址,60.28.215.123是知乎服务器的ip地址,安卓发的包在红框,服务器发的包在白框。Packet1是android三次握手的第一个syn包,packet2是服务器。

Ack+syn包,packet3是android ack包。在这三个数据包之后,tcp的三次握手就完成了。

Packet4是android发的http。

请求.长度只有240字节,所以发送一个包。当然,标志的P位被设置,请求需要被应用层立即处理。Spdy出现在包里,喜欢。

Packet5是服务器ack刚收到的一个包,长度为0,所以这只是一个ack包。

Packet6是服务器返回给http的响应,1388字节。Packet5和packet6都用seq 241来确认数据包,当然是为了增加ack的成功率。

中间有几个包,我就不仔细分析了。最后,让我们看看最后几个请求完成的数据包:

最后两个包相对简单。android发送FIN+ACK包后断开连接,服务器直接发送RST包后断开连接。