tcpdump 作为一款开源的网络监听代码,大名鼎鼎,配合libpcap就是一款sniffer了。目前其支持
linux和windows,并且也有人修改了一下,出了android的版本,在android下只要有root权限的手机
,就可以使用tcpdump 这个工具来抓取所有应用的数据包,然后进行分析了。关于网络嗅探器的原理
不多说了,不在本篇博客的目的中。
但是,android 版本的tcpdump缺点也是比较明显的。主要表现在使用不方便上。
由于手机上屏幕尺寸限制,没有那么多的窗口显示,所以tcpdump目前是命令行调用的方式,直接
控制台上输出相应的数据信息。这样很多信息显示不全,特别内容更是无从看起。虽然tcpdump 提供
参数 -w 可以将完整的数据保存成pcap 格式的,但是实时性不高,一般是连接完了以后再使用
wireshark打开查看,很不方便。
基于这种情况,我在网上找了一篇博文转载到自己的博客上了
http://sunzeduo.blog.51cto.com/2758509/1346060
但是在测试过程中,发现
adb shell "./data/local/tcpdump -n -s 0 -w - | nc -l -p 12345"
adb forward tcp:12345 tcp:54321 && nc 127.0.0.1 54321 | wireshark -k -S -i -
这个命令执行的时候,出现了以下的问题:
1 nc命令本身android下面没有,从网上想搜索一下android下的netcap 结果竟然没有,最后自己不得不从android源码中将netcap.c 文件下载下来,自己用ndk给编译出来了一个可执行文件。
2 nc 127.0.0.1 54321 其实在我的机器上是不行的,这也是我按照上一篇博文的方法没有解决问题的根源。具体原因未知。
后来自己通过看tcpdump和nc的使用方法,总结了一下,找到了一条可以实现android设备上截图的网
络数据包在wireshark上实时显示的方法,记录如下。
步骤1 在pc上使用下面的命令
C:\Users\sun>nc -l -p 14444 | wireshark -k -S -i -
用nc 监听本地 14444 端口,并且将接收到的结果通过管道发送给wireshark
相当于pc上开了一个14444端口的tcp server端程序
步骤2
android 手机上以root权限执行下面的命令
shell@android:/ # tcpdump -s 0 -w - ip host 192.168.1.104 and ! 192.168.1.102 and ! 192.168.1.1 | nc 192.168.1.102 14444
使用这个命令,其中192.168.1.104 表示android手机本地的地址。
命令的含义是
获取主机192.168.1.104除了和主机192.168.1.1和192.168.1.102之外所有主机通信的ip包
也就是说排除 1.104 -- 1.1 以及 1.104 -- 1.102 这两路通信的ip包后,监听和记录其他所有的数据包。
为什么要这样写呢,以下几个地址我说一下大家就明白了
192.168.1.104 是android手机使用wifi时wifi局域网分配的局域网地址
192.168.1.102 是同android手机在同一个局域网中pc的局域网地址
192.168.1.1 是android手机和pc链接外网的出口网关地址
由于pc上是server端,而tcpdump 吐出来的android手机联网的包是通过 nc 192.168.1.102 14444 这个命令以客户端的方式来连接pc端102发给pc端的,pc接收到以后通过wireshark程序将pcap数据给呈现出来。如果不排除1.104--1.102 这路通信的ip包的话,直接的后果是wireshark会出现大量的毫无意义的android手机给pc传送pcap数据的包,我们通过tcpdump抓包毕竟是用来分析特定进程的网络数据的,自然不愿意让混杂着很多其他的无意义的数据。而1.104--1.1 这路数据的关闭,道理也是一样的,就是其实我们是想看到特定进程到外网的数据,而不是要看到局域网中发到路由器的数据,所以直接屏蔽掉即可。
通过上面两步操作,就可以看到wireshark中的滚滚数据了。
附件中 nc.exe pc上使用的nc
nc android上使用的nc 这个竟然在网上搜索了半天搜不到,后来我自己编译了一个,附带源码。
tcpdump android上使用的命令
扩展思路:
目前是使用命令行tcpdump,其实可以封装一下,做一个apk,这样每次就不用再必须用数据线啦 呵呵