一. 无论在windows下,还是在ubuntu下使用wireshark,都要先将 tcpdump 和 busybox 这两个程序push到手机
1. 到
http://www.strazzere.com/android/tcpdump 下载一个tcpdump并push到手机
adb remount
adb push tcpdump /system/bin
adb shell chmod 777 /system/bin/tcpdump
adb remount
adb push tcpdump /system/bin
adb shell chmod 777 /system/bin/tcpdump
2. 下载一个busybox并push到手机,这是因为我们要使用busybox中的nc工具
adb remount
adb push tcpdump /system/bin
adb shell chmod 777 /system/bin/busybox
二. 在ubuntu下使用脚本更方便
最好使用python脚本sharkdroid.py,安装2.7版本的python,如果安装了3.3版本的python,稍微改下脚本即可。
当然,也可以直接敲脚本中的命令。
1. 安装wireshark
sudo apt-get install wireshark
2. 安装nc
一般来说ubuntu集成了nc程序,所以不用安装
3. 运行脚本
python sharkdroid.py 表达式
sharkdroid.py 的参数即为 tcpdump 的表达式,用法如下:
分析SIP报文: python sharkdroid.py udp port 5060
分析HTTP报文:python sharkdroid.py tcp port 80
分析TCP报文: python sharkdroid.py tcp
sharkdroid.py 的内容
import
sys
import
os
import
subprocess
if
len(sys.argv) < 2:
print
"Can't process with no tcpdump expression"
exit(1)
try
:
pid = os.fork()
if
pid > 0: // 父进程
command=
'adb
shell
"tcpdump -n -s 0 -U -n -w - %s | busybox nc -lp12345"'
%
' '
.join(sys.argv[1:])
subprocess.call(command, shell=True)
else
: // 子进程
subprocess.call(
"sleep 3"
, shell=True)
subprocess.call(
"adb forward tcp:12345 tcp:12345"
, shell=True)
subprocess.call(
"nc 127.0.0.1 12345 | wireshark -k -S -i -"
, shell=True)
except OSError, e:
sys.stderr.write(
"fork #2 failed: (%d) %s \n"
% (e.errno, e.strerror))
解析:sys.argv[1:] 表示从第2个到最后1个命令行参数组成的数组
例如:命令行为sharkdroid.py tcp port 80,则
sys.argv[1:]表示数组['tcp','port','80']
.join 用于连接字符串数组
例如:s = ['a','b','c','d']
print ''.join(s)
print '-'.join(s)
输出结果:
abcd
a-b-c-d
因此,
' '
.join(sys.argv[1:])可能是udp port 5060或 tcp port 80,即第2到最后1个命令行参数,中间用空格隔开
%s和% 前者表示一个格式化字符串,后者表示用来代替前者的字符串,显然,这里用
' '
.join(sys.argv[1:])去代替%s
因此,对于命令行
sharkdroid.py tcp port 80,
实际上command =
'adb
shell
"tcpdump -n -s 0 -U -n -w - tcp port 80 | busybox nc -lp12345"'
对于命令行
sharkdroid.py udp port 5060,
实际上command =
'adb
shell
"tcpdump -n -s 0 -U -n -w - udp port 5060 | busybox nc -lp12345"'
tcpdump的选项
-n 不把网络地址转换成名字;
-nn 不把网络地址和端口转换成名字
-s 0 抓取整个数据包,-s是用来指定抓取包的多少个字节的,默认为68字节,0表示抓取整个包
-U 使得当tcpdump在使用-w选项时,其文件写入与包的保存同步,
即当每个数据包被保存时,它将及时被写入文件中,而不是等文件的输出缓冲已满时才真正写入此文件
-w 把包数据直接写入文件而不进行分析和打印输出
通过 os.fork() 创建了一个子进程;
在父进程中进入adb shell,然后在手机上通过tcpdump抓包,重定向到nc -l创建的TCP服务器,
nc-lp12345 会在手机的12345端口启动一个TCP服务器,默认情况下在该端口接收所有的标准输入和输出,
但是这里通过重定向接收tcpdump重定向来的包
在子进程用adb forward将手机12345端口重定向到PC的123456端口,然后用nc连接本PC的12345端口,并重定向到wireshark
注:
nc即netcat,在网络工具中有“瑞士军刀”的美称,
在不同的网络连接之间建立一个通道,TCP或UDP包可通过该通道传输
。
nc
[-options] hostname port[s] [ports] ... // 想要连接到某处
nc -l -p port [-options] [hostname] [port] // 绑定端口等待连接
usage: nc [-46DdhklnrStUuvzC] [-iinterval] [-Pproxy_username] [-p source_port ]
[-s source_ip_address ] [-TToS] [-wtimeout] [-Xproxy_protocol]
[-x proxy_address[: port]] [hostname] [port[s] ]
参数:-C 类似-L选项,一直不断连接
-d 后台执行
-e prog 程序重定向,一旦连接,就执行
-g gateway source-routing hop point[s], up to 8
-G num source-routing pointer:4,8,12,...
-h 帮助信息
-i secs 延时的间隔
-l 监听模式,用于入站连接
-n 指定数字的IP地址,不能用hostname
-o file 记录十六进制的传输
-p port 本地端口号
-r 任意指定本地及远程端口
-s addr 本地源地址
-u UDP模式
-v 详细输出,用两个-v能得到更详细的内容
-w secs timeout的时间
-z 将输入输出关掉,用于扫描时
wireshark [ -vh ] [ -DklLnpQS ] [ -a <captureautostop condition> ] ...
[ -b <capturering buffer option> ] ...
[ -B <capturebuffer size> ]
[ -c <capturepacket count> ] [ -f <capture filter> ]
[ -g <packetnumber>] [ -i <capture
interface
>] [ -m <font>]
[ -N <nameresolving flags> ] [ -o <preference/recent setting> ] ...
[ -r<infile> ] [ -R <read (display) filter> ] [ -s <capture snaplen> ]
[ -t <time stamp format> ] [ -w <savefile> ] [ -y <capture link type> ]
[ -X <eXtension option> ] [ -z <statistics> ] [ <infile>]
-k 指定wireshark立即开始捕捉。这个选项需要和-i参数配合使用来指定捕捉产生在哪个接口的包
-S wireshark在捕捉数据后立即显示它们,通过在一个进程捕捉数据,另一个进程显示数据
这和捕捉选项对话框中的"Update list of packets in real time/实时显示数据"功能相同
-i
设置用户进行捕捉的接口或管道