7C00.ME/houmu 2012-09-23

智能手机网络抓包程序报告

一、 作业要求

1、作业内容:开发一个程序,实现智能手机网络数据抓取的功能,系统不限,针对对象不限(WiFi,蓝牙,GPRS等都可以)。

2、组织形式:分小组进行,小组成员最多3人且分工明确,要指定小组长。

3、作业提交:源代码、文档(电子版和打印版)、演示。

二、 作业研究

1、系统平台选择

做智能手机应用程序,尤其是这种和底层功能比较接近的应用程序,目前还没有一种比较好的技术方案可以一次开发,同时适用于几乎所有的系统,如iPhone、Android、Windows Mobile等。即使是Java ME也不能很好的做到这一点。所以在做正式的之前,必须要对平台做出选择。

基于下面的考虑,我们选择了Google的Android操作系统。从主观因素上考虑,对于目前的智能手机操作系统,我们接触和研究较多的是Android,在(且只在)Android平台上做过应用开发,对Android平台上的应用开发比较熟悉。从客观因素上考虑,Android是一个开源的手机操作系统,对于我们研究探索很有利,而iPhone和Windows Mobile则是一个封闭的手机操作系统,能够获得资料相对有限;另外,Android手机在智能手机占有的市场份额非常巨大,这决定了开发Android平台上的智能手机抓包程序具有相当大的实用性。

2、开发方案研究

在确定了Android平台上,我们开始在互联网和图书馆上查阅与Android、网络数据抓取等主题相关的文章和书籍。由于Android系统具有Linux和Java部分”血缘”的特点,所以还查阅与Linux和Java中网络、数据抓取等主题有关的文章。经过一番努力,我们总结出了在智能手机网络数据抓取的几个基本方案,并对他们做简要的分析。

A. tcpdump+Java解析

使用tcpdump(安卓系统底层的Linux工具)抓取网络数据,并转存到文件中,使用Java文件操作方法解析这个文件,并展示到用户界面上。这是我们所采用的方案,将在后面具体说明。

B. tcpdump+Jpcap解析

使用tcpdump抓取网络数据,并转存到网络中,而根据tcpdump转存文件是libpcap文件格式特点,使用libpcap的Java实现jpcap(或jnetpcap,下面统称jpcap)进行解析。这个方案和上面的方案相比,优点是不用自己实现文件解析的类了。缺点是在Android上在这个作业中,我们需要调用到的jpcap相关的方法是很有限的,但是却要包含一系列完整的jar文件,无意是增大了最终程序的大小,对于手机这种资源敏感的设备,这样做的代价太大。同时原本是为桌面平台开发的jpcap向Android平台移植(部分代码需要交叉编译),难度虽然不是很大,但是存在一定的不确定性。

C. libpcap+NDK

使用libcap 和Android NDK。Android提供了NDK的开发套件,可以使用C和C++语言来编写Android的类库。Libcap是Linux上一个非常程序的网络抓包代码库,本身用C语言实现。所以可以考虑把二者相结合,实现想要的功能。具体来说就是用NDK把libcap编译成Android应用层可以调用的底层库并提供响应的函数接口,在应用层实现用户交互和简单的逻辑处理的主要功能。这个方案的优势是在运行效率和开发灵活性上有很大的尝试空间,但是NDK对于我们而言非常陌生,其本身学习曲线也比较长,在我们有限的作业时间里面,这套方案不太合适。

D. socket+NDK

使用socket和Android NDK,这套方案,和libpcap和Android的方案,基本思路是一致的。不同点在于,使用自己实现的Socket代替了现有的Libpcap库,这样和上一套方案相比,程序的体积可以更加轻巧。不过这个需要对Linux Socket编程非常熟悉,同时熟悉Android的交叉编译。虽然我们在这些知识方面有一定的了解,同时也很有兴趣,但是和上面的方案一样,实施这个方案的时间成本太大,可行性弱。

三、 作业方案说明

经过上述的研究,我们最终采取了Tcpdump + JavaIO的方案。我们把最终完成的Android应用程序称为Andump,意为Android和Tcpdump二者结合。

1、程序功能设计

在开始开发之前,先要确定程序计划实现功能,以及暂不考虑实现的功能。对于Andump,我们计划实现以下功能:

功能A,调用tcpdump进行抓包,并转存到指定的文件中;

功能B,从指定文件中读取抓包数据,并友好的展示给用户;

功能C,能够指定抓包的类型,如tcp、udp、ip(暂定实现这三种类型的划分);

功能D,能够方便地控制tcpdump的运行,开始和停止(暂定只实现这两种控制);

功能E,其他可能必须实现的辅助功能。

2、程序基本框架

针对需要上述实现的各个功能,并结合Android平台应用程序开发的基本方法,经过分析,我们制定了Andump程序的基本框架,如下图所示。

如上图所示,整个程序由四个核心模块组成。下面详细说明每个功能模块的作用。

3、模块设计说明

(a)存储设定模块

对应的类:DumpSettings。

这个模块属于辅助模块,实现目的是为了保存运行时在模块间需要经常使用的一些数据。如数据包类型的选择设定等。通过单例模式实现了这个类,保证了数据的唯一性。同时提供了生成tcpdump完整命令的方法。

与其他模块的联系,供配置模块设置抓包时运行参数(抓包类型和是否屏蔽调试通信信息),供抓包模块获取完整的运行命令。

(b)控制模块

对应的类:ControlActivity。

这个模块位于各个模块的中心,也是用户主要面对的模块。这个模块的主要作用包括,

调用其他模块(ConfigActivity、DumpService和ReadActivity)并接受其他模块调用返回的信息;提供功能D的用户接口(下面会说明这里为什么不是实现功能D)。

与其他模块的联系,可以启动其他各个模块。

(c)设置模块

对应的类:ConfigActivity。

这个模块由控制模块启动,完成功能C(指定抓取数据包的类型),调用完成之后返回控制模块。在实际开发过程中,我们发现Android模拟器和Eclipse一直在进行大量的无关通信,这些通信的数据内容主要是提供给开发工具使用一些调试信息,对于实际应用没有任何作用,所以提供了一个关闭这些调试信息的捕获的选项。

与其他模块的联系,配置信息保存在一个单例对象中,用于规划tcpdump的执行命令,供抓包模块使用。

(d)抓包模块

对应的类:DumpService。

这个模块运行在系统后台,实现功能A和功能D,同时根据设置模块的选项辅助实现功能C(应该说是功能C的本质实现者)。这个模块的主要实现方法是在Android的后台开启一个服务,这个服务使用Java中运行时调用功能,即调用Runtime.getRuntime().exec(String)方法,开启一个Tcpdump子进程。(Tcpdump是Linux底层的程序,可以实现网络数据的抓取。通过配置tcpdump的参数选项,可以实现数据存储和过滤的功能。)关闭这个子进程就可以停止抓包活动了。

与其他模块的联系,接受控制模块的控制信息以开始和停止抓包;把抓取的数据存储在文件中,供读包模块使用。

(e)读包模块

对应的:ReadActivity。

这个模块实现功能B,一方面要实现对抓包模块获取的模块进行读取分析,另一方面还要把他们展示到用户界面上来。由于Android系统对于UI线程时间响应敏感,所以对抓包文件的读取使用了后台线程。每次抓包的数据量也是很多的,一次性显示出来对于手机内存资源的消耗太大,所以使用了简单的分页处理。

与其他模块的联系,读取抓包模块获取的存储文件。

(f)文件数据分析相关的类

对应的类:cn.todd.andump.layerReader下面各个类。

这些类主要是按照读二进制文件的方式按照TCP/IP的协议规范逐字节或字节块的分析其含义,然后存储在一定的数据结构中。文件格式参考了这篇文章:http://www.360doc.com/content/11/1117/17/8151417_165252820.shtml

(g)其他实用工具类

对应的类:cn.toddapp.andump.util下各个类。

这些类与Android的UI实现机制有一定的联系,为UI的提供一些辅助方法。

这里从宏观的角度说明了各个模块的设计思路,具体实现,可以从代码中参考。这里不再赘述了。

四、 作业成果说明

1、 基本说明

这次作业实现了一个Android系统智能手机网络数据抓取的应用程序Andump。由于条件限制,我们只在Android SDK的Android模拟器上做了测试。同时由于时间限制,测试工作也不是非常充分,对运行时的正确性和稳定性不能做出完全的保证。但是总体上而言,Andump具备了完整的网络数据的抓取的功能,在绝大多数使用情况下可以正常的工作。

2、如何使用

本项目定位为一个学习研究型项目,所以只以源代码的形式发布,不发布直接安装使用的二进制文件。使用前,请导入到Eclipse项目中,编译后安装到Android虚拟机上运行。Android虚拟机必须分配足够大(大于32M)的Sdcard。

3、使用演示

从Eclipse启动以后,首先看到的画面如下图所示。

点击扳手样图标按钮,进入到配置界面,如右上图所示。

我们可以根据需要设置响应的运行参数,如下图

之后,点击back按钮返回到主界面。此时点击Start按钮,开始抓包系统界面托盘会显示正在Andump程序正在运行。三个按钮会同时做出响应的改变。如下图所示。

这是按键盘上的Home键(不要按Back键,不然会退出程序),打开浏览器,如下图,

打开一个网页以后,可以通过拖出系统托盘,点击Andump一栏后返回到Andump的主页面。这时点击Stop按钮,停止抓包,Read按钮和扳手按钮可以使用了。点击Read,进入数据包查看界面。界面上显示了一个列表,显示了某一个时间,抓取到数据包的大小。点击列表上的任一兰,可以查看数据包的详细信息,如下图所示。

正如我们看到的,抓取到的一个数据包中两个IP地址,一个是10.0.2.15,这是虚拟机的虚拟Ip地址,另一个是74.125.71.104,这是Google主页的Ip地址,而我们刚才访问的正是Google的主页,证明我们的数据抓取是正确的。

当然这里也部分实现了分页的功能。点击Menu键可以看到有下一页的菜单按钮,点击会进入下一页(上一页的功能还有待完善)。如下图所示。

可以看到,点击Next之后,界面上的数据列表进行了刷新。

五、 后记

经过几个晚上的奋斗,我们最终完成了这款智能手机网络数据抓包程序。在这个过程中对TCP/IP协议、Android应用开发、Java文件读取等技术都有了更加深入的了解。其实按照本文做出这个Android应用,本身并没有特别有复杂或者高端的技术,更重要的是在确定最终选取本文所要使用的方案的过程。

刘老师给出的题目要求很简明,这对于我们完成作业来说,有利有弊。弊端在于,刚拿到作业要求的时候,会有一种”无处下手”的感觉,因为作业要求给的信息太少。好处则是,我们在完成作业的时候更加的自由。所以,在一开始我们想到了上文提到的四种方案,当然,也可能还有其他更好的解决方案,但是对于完成一个作业,自己能够在正式开始做的时候,想到这么多的方案,还是很少有的。其中作业要求的宽松是其中一个重要因素。

当然,我们做出来的这个应用还有需要改进的地方,初步打算,再做一定修改之后,把我们的代码放到网上,开发源代码,让更多的人一起来完善它。