作者:玛丽 | 来源:互联网 | 2023-06-13 20:16
本软件是本人的毕业设计“作品”。当年是因为Ubuntu而认识了Linux,进而知道了有个开源的图形界面开发工具——GTK+,机缘巧合之下在图书馆发现有一本刘文涛老师写的《Linux网络入侵检
本软件是本人的毕业设计“作品”。当年是因为Ubuntu而认识了Linux,进而知道了有个开源的图形界面开发工具——GTK+,机缘巧合之下在图书馆发现有一本刘文涛老师写的《Linux网络入侵检测系统》,翻开看看,觉得很好玩。Google之后,“歌”告诉我:没有人提供源代码?没有人自己尝试做过?……OK,哥自己干。
一、环境配置
1.由于本软件使用了libpcap,因此首先安装它(Update:到目前2010.7.4为止,选择的是最新版本1.1.1,2014.3.16下载时是1.5.3版):
1)downoad libpcap: http://www.tcpdump.org/release/
2)install the dependence packages oflibpcap:
sudo apt-get install flex
sudo apt-get install bison
3)install libpcap:
unzip
./configure
make
sudo make install
4)install rpm:
sudo apt-get install rpm
or you may receive following message:
error while loading shared libraries:libpcap.so.1: cannot open shared object file...
||
||== /usr/local/lib/
5)run the program as root, or you mayrelease:
a. no suitable device found(function pcap_lookupdev());
b. You don't have permissionto capture on that device (socket: Operation not permitted) (functionpcap_open(), pcap_open_live()).
2.安装tcpstat(到目前为止,选择的是最新版本1.5)
因为使用了GENERIC_LINK_OTHER,ETHER_ADDR_LEN等变量以及is_ip_packet(),get_ip_proto()等函数,安装tcpstat:http://www.frenchfries.net/paul/tcpstat/
3.安装tcpdump(到目前为止,选择的是最新版本4.1.1)
其实可以不用安装(*^__^*)嘻嘻……当时是因为用到了函数tcpport_string()和etheraddr_string()才装的,但运行时出现莫名其妙的问题,于是就把与tcpport_string()相关的所有变量、函数整体“移植”到我的程序中,而把etheraddr_string()函数舍弃掉了,换用了其它的方法,具体的替换方式可以参考刘文涛老师的《Linux网络入侵检测系统》和我的代码。
4.安装C和GTK/GNOME开发环境(熟练工种可以跳过此步^_^)
sudo apt-get install build-essential
sudo apt-get install gnome-core-devel
做GTK+的开发还得安装这个,以方便查看相关的API函数:sudo apt-get install devhelp
5.手动配置头文件路径(此步很重要)
第2步安装了tcpstat,现在要“include”它,得手动配置相关文件,使得编译器在编译时能够识别相关变量、结构体等,具体做法是将相关文件拷贝至/usr/local/include目录下:
首先在终端切换至/usr/local/include目录(而不是/usr/include目录,因为此目录中的相关头文件是系统的,所以使用“用户自己的include目录”),接着输入以下命令:sudomkdir tcpstat,创建一个文件夹tcpstat;
然后切换到该文件夹,输入以下命令:sudocp /home/ubuntu/Downloads/tcpstat-1.5/include/packetdump.h.(个人具体环境不同,相应的路径自己改变),将packetdump.h文件拷贝至tcpstat文件夹下,注意到在packetdump.h文件中引用了tcpstat.h,就如法炮制,把它也给拷过来。又注意到在tcpstat.h文件中引用了*.*文件,如法炮制(需要注意的是,诸如stdio.h,net/ethernet.h等系统自带的头文件就不用“炮”了,编译器知道去哪儿找这种头文件,需要“炮”的是ethernet_stub.h),接着接续“炮”……(总共“炮”了三个:packetdump.h、tcpstat.h、ethernet_stub.h)
接着在/usr/local/include目录下创建tcpstat-packetdump.h文件:sudogvim tcpstat-packetdump.h,在其中加入以下内容:#include
也许你会问:为什么这么干呢?不嫌麻烦吗?问的好!第1步安装成功libpcap后它会在/usr/local/include目录下创建一个pcap文件夹和三个头文件:pcap.h、pcap-bpf.h、pcap-namedb.h,大家看了这三个头文件的内容后就会明白的:-)
第2步中提到使用了is_ip_packet(),get_ip_proto()等函数,由于这两个函数在安装好的tcpstat目录下的lib/utils.c文件中,下面继续“炮”:
将utils.c文件拷贝至/usr/local/include/tcpstat目录下,接着在/usr/local/include目录下建一个tcpstat-utils.c文件,加入相应内容。
好了,一切就绪,切换到源代码目录下make(源代码将会在后面提供下载地址),咦~终端输出以下东东:
In file included from/usr/local/include/tcpstat/packetdump.h:33,
from/usr/local/include/tcpstat-packetdump.h:3,
from callback.h:11,
from main.c:3:
/usr/local/include/tcpstat/tcpstat.h:261:error: conflicting types for ‘inet_ntop’
/usr/include/arpa/inet.h:65: note:previous declaration of ‘inet_ntop’ was here
oh,由于头文件错综复杂,函数重复定义了,怎么办?将“炮”过去的tcpstat.h文件的第261行注释掉。同样的utils.c中也是这种问题,那就同样的注释掉。
6.万事具备,只欠你实践^_^
make之后,切换到root用户,接着输入./NIDS,敲下空格键,现在可以喝杯水了,当然有西瓜吃更好:-)
二、问题与改进
由于做毕设期间时间比较紧,因此只实现了ARP、IP、TCP协议的分析,诸如UDP、ICMP、HTTP、TCP连接过程等没有实现,还有就是没有和MySQL连接数据库。
在第3步中提到把etheraddr_string()函数舍弃掉了,换用了其它的方法,我记得是关于MAC地址输出的问题,由于干毕设进度,没有深究,或许有错误。
相较与刘老师的程序,改进的地方有:
1)使用GtkUIManager来实现界面中的菜单栏和工具栏(不过其中的很多功能都没有实现哦,在终端中有相应的文字输出),关于GtkUIManager可以参考http://live.gnome.org/GnomeLove_2fUIManagerTutorial 原来的链接失效了,现在是这个https://wiki.gnome.org/GnomeLove/UIManagerTutorial。
2)Content页面中的内容显示看起来更舒服,每一行显示16个字节的内容,且可打印字符用彩色显示,不过奇怪的是在Ubuntu10.04下显示的内容不齐(Update:Ubunu 13.10下也是这样,发现将系统的默认字体Ubuntu改为DejaVu Sans Mono就很神奇的显示正常了不知为毛Ubuntu字体显示会有问题,有时间再仔细研究),由于做毕设期间使用的9.10版,没有出现这种现象(不过在9.10下有时候程序会崩溃,由于时间原因,10.04下没发现,不知是GTK+的bug还是我的程序的问题)。截图分别如下(上面是Ubuntu9.10下的截图,下面是Ubuntu10.04下的截图):
关于分行友好显示十六进制内容和可打印字符内容,借鉴于www.tcpdump.org/sniffex.c。
3)Sniffer(下面的)和Content页面的内容都是动态显示的,即当捕获到一个数据包在界面显示时,屏幕会随着往下滚动。
比较奇怪的一个问题是Sniffer(上面的)和AlertEvent页面中的时间项与同一行的其它项显示的内容不在同一条直线上,而是往上偏点儿,不知是什么原因(Update:Ubuntu 13.10下依旧如此,怀疑也是字体问题?)。
由于时间的原因,刘老师书中所使用的旧的GtkClistwidget没有用新的GtkTreeView重写,这也是有待改进的地方。
另外就是没有使用pthread类方法,而是用的gdkthread类方法,而且只创建了一个线程,原书中的创建两个线程的妙处没那么多时间和精力去琢磨。
至于使用的网卡设备,可以根据具体条件自己修改后再编译运行,比如我提供的源代码中的是eth0,若是无线网卡就是wlan0,这个可以通过在终端输入ifconfig等命令查看活跃网卡。捕获到的数据包数量也可以自定义,我提供的源码中是100个。
下面是源代码的下载地址(注意其中的rules文件中每一行的每个“变量”之间仅以一个tab键隔开):
http://download.csdn.net/source/2514975