本软件是本人的毕业设计"作品"。当年是因为Ubuntu而认识了Linux,进而知道了有个开源的图形界面开发工具--GTK+,机缘巧合之下在图书馆发现有一本刘文涛老师写的《Linux网络入侵检测系统》,翻开看看,觉得很好玩。Google之后,"歌"告诉我:没有人提供源代码?没有人自己尝试做过?……OK,哥自己干。 [b]一、环境配置 [/b]
[b]1.[/b][b]由于本软件使用了[/b][b]libpcap[/b][b],因此首先安装它(到目前为止,选择的是最新版本[/b][b]1.1.1[/b][b]): [/b]
1)downoad libpcap :http://www.tcpdump.org/release/ 2)install the dependence packages of libpcap: 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 may release: a. no suitable device found(function pcap_lookupdev()); b. You don't have permission to capture on that device (socket: Operation not permitted) (function pcap_open(), pcap_open_live()). 因为使用了GENERIC_LINK_OTHER,ETHER_ADDR_LEN等变量以及is_ip_packet(),get_ip_proto()等函数,安装tcpstat: http://www.frenchfries.net/paul/tcpstat/ 其实可以不用安装(*^__^*) 嘻嘻……当时是因为用到了函数tcpport_string()和etheraddr_string()才装的,但运行时出现莫名其妙的问题,于是就把与tcpport_string()相关的所有变量、函数整体"移植"到我的程序中,而把etheraddr_string()函数舍弃掉了,换用了其它的方法,具体的替换方式可以参考刘文涛老师的《Linux网络入侵检测系统》和我的代码。 sudo apt-get install build-essential sudo apt-get install gnome-core-devel 做GTK+的开发还得安装这个,以方便查看相关的API函数:sudo apt-get install devhelp 第2步安装了tcpstat,现在要"include"它,得手动配置相关文件,使得编译器在编译时能够识别相关变量、结构体等,具体做法是将相关文件拷贝至/usr/local/include目录下:
首先在终端切换至/usr/local/include目录(而不是/usr/include目录,因为此目录中的相关头文件是系统的,所以使用"用户自己的include目录"),接着输入以下命令:sudo mkdir tcpstat,创建一个文件夹tcpstat;
然后切换到该文件夹,输入以下命令:sudo cp /home/ubuntu/Downloads/tcpstat-1.5/include/packetd ump.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文件:sudo gvim 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中也是这种问题,那就同样的注释掉。 make之后,切换到root用户,接着输入./NIDS,敲下空格键,现在可以喝杯水了,当然有西瓜吃更好:-) 由于做毕设期间时间比较紧,因此只实现了ARP、IP、TCP协议的分析,诸如UDP、ICMP、HTTP、TCP连接过程等没有实现,还有就是没有和MySQL连接数据库。
在第3步中提到把etheraddr_string()函数舍弃掉了,换用了其它的方法,我记得是关于MAC地址输出的问题,由于干毕设进度,没有深究,或许有错误。
相较与刘老师的程序,改进的地方有:
1)使用GtkUIManager来实现界面中的菜单栏和工具栏(不过其中的很多功能都没有实现哦,在终端中有相应的文字输出),关于GtkUIManager可以参考http://live.gnome.org/GnomeLove_2fUIManagerTutoria l。
2)Content页面中的内容显示看起来更舒服,每一行显示16个字节的内容,且可打印字符用彩色显示,不过奇怪的是在Ubuntu10.04下显示的内容不齐,由于做毕设期间使用的9.10版,没有出现这种现象(不过在9.10下有时候程序会崩溃,由于时间原因,10.04下没发现,不知是GTK+的bug还是我的程序的问题)。截图分别如下(上面是Ubuntu9.10下的截图,下面是Ubuntu10.04下的截图):
关于分行友好显示十六进制内容和可打印字符内容,借鉴于www.tcpdump.org/sniffex.c。
3)Sniffer(下面的)和Content页面的内容都是动态显示的,即当捕获到一个数据包在界面显示时,屏幕会随着往下滚动。
比较奇怪的一个问题是Sniffer(上面的)和Alert Event页面中的时间项与同一行的其它项显示的内容不在同一条直线上,而是往上偏点儿,不知是什么原因。
由于时间的原因,刘老师书中所使用的旧的GtkClist widget没有用新的GtkTreeView重写,这也是有待改进的地方。
另外就是没有使用pthread类方法,而是用的gdkthread类方法,而且只创建了一个线程,原书中的创建两个线程的妙处没那么多时间和精力去琢磨。
至于使用的网卡设备,可以根据具体条件自己修改后再编译运行,比如我提供的源代码中的是eth0,若是无线网卡就是wlan0,这个可以通过在终端输入ifconfig等命令查看活跃网卡。捕获到的数据包数量也可以自定义,我提供的源码中是100个。 写完本文后我将投入到紧张的考研复习中,将有半年到一年的时间没法上网闲逛,上文中提到的相关问题我将没法和网友交流,望见谅。虽然我暂时没时间和大家一起探讨问题,但我又不想因为个人原因而将这么好的一个相互学习的机会给浪费掉,好的东西先分享,所以提供给大家,让大家先相互探讨,继续完善本软件。大家有什么好的想法、观点、解决办法等都可以发到我邮箱: river.shang@gmail.com,考研归来后,我会仔细查看的。 本软件的完成离不开众多人的关爱,没有他/她们,我将不会这么顺利的搞定它。他/她们是:
爸爸:放假在家期间,独自一人学习GTK+编程,无聊的时候,和爸爸一起玩游戏Mahjongg、Klondike和Mines等,其乐无穷。
妈妈:做的可口的饭菜使我在家享受到了在学校享受不到的神仙般的日子,有几个夜晚我敲着键盘,妈妈在旁边洗衣服静静地陪着我。有一次在电脑上为老爸和妈妈"弹奏"曲子--用的是VOS,得到他/她们的极大赞赏,他/她们对我的爱和鼓励、支持和包容是我前进的不竭动力。
小妹:在学校下载动画片带回家和她一起欣赏,带着她到处玩,和她在一起的日子是我在家渡过的最快乐的时光。
学校的好朋友:英子、琳妹妹、大小姐、小刚、哲哲、徒弟,感谢他/她们陪我在学校度过的毕设生活。记忆犹新的是英子的一句"老哥,我爱死你了"让我很感动。
以及所有爱我的人。
下面是源代码的下载地址(注意其中的rules文件中每一行的每个"变量"之间仅以一个tab键隔开):
http://download.csdn.net/source/2514975
[b]1.[/b][b]由于本软件使用了[/b][b]libpcap[/b][b],因此首先安装它(到目前为止,选择的是最新版本[/b][b]1.1.1[/b][b]): [/b]
1)downoad libpcap :http://www.tcpdump.org/release/ 2)install the dependence packages of libpcap: 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 may release: a. no suitable device found(function pcap_lookupdev()); b. You don't have permission to capture on that device (socket: Operation not permitted) (function pcap_open(), pcap_open_live()). 因为使用了GENERIC_LINK_OTHER,ETHER_ADDR_LEN等变量以及is_ip_packet(),get_ip_proto()等函数,安装tcpstat: http://www.frenchfries.net/paul/tcpstat/ 其实可以不用安装(*^__^*) 嘻嘻……当时是因为用到了函数tcpport_string()和etheraddr_string()才装的,但运行时出现莫名其妙的问题,于是就把与tcpport_string()相关的所有变量、函数整体"移植"到我的程序中,而把etheraddr_string()函数舍弃掉了,换用了其它的方法,具体的替换方式可以参考刘文涛老师的《Linux网络入侵检测系统》和我的代码。 sudo apt-get install build-essential sudo apt-get install gnome-core-devel 做GTK+的开发还得安装这个,以方便查看相关的API函数:sudo apt-get install devhelp 第2步安装了tcpstat,现在要"include"它,得手动配置相关文件,使得编译器在编译时能够识别相关变量、结构体等,具体做法是将相关文件拷贝至/usr/local/include目录下:
首先在终端切换至/usr/local/include目录(而不是/usr/include目录,因为此目录中的相关头文件是系统的,所以使用"用户自己的include目录"),接着输入以下命令:sudo mkdir tcpstat,创建一个文件夹tcpstat;
然后切换到该文件夹,输入以下命令:sudo cp /home/ubuntu/Downloads/tcpstat-1.5/include/packetd ump.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文件:sudo gvim 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中也是这种问题,那就同样的注释掉。 make之后,切换到root用户,接着输入./NIDS,敲下空格键,现在可以喝杯水了,当然有西瓜吃更好:-) 由于做毕设期间时间比较紧,因此只实现了ARP、IP、TCP协议的分析,诸如UDP、ICMP、HTTP、TCP连接过程等没有实现,还有就是没有和MySQL连接数据库。
在第3步中提到把etheraddr_string()函数舍弃掉了,换用了其它的方法,我记得是关于MAC地址输出的问题,由于干毕设进度,没有深究,或许有错误。
相较与刘老师的程序,改进的地方有:
1)使用GtkUIManager来实现界面中的菜单栏和工具栏(不过其中的很多功能都没有实现哦,在终端中有相应的文字输出),关于GtkUIManager可以参考http://live.gnome.org/GnomeLove_2fUIManagerTutoria l。
2)Content页面中的内容显示看起来更舒服,每一行显示16个字节的内容,且可打印字符用彩色显示,不过奇怪的是在Ubuntu10.04下显示的内容不齐,由于做毕设期间使用的9.10版,没有出现这种现象(不过在9.10下有时候程序会崩溃,由于时间原因,10.04下没发现,不知是GTK+的bug还是我的程序的问题)。截图分别如下(上面是Ubuntu9.10下的截图,下面是Ubuntu10.04下的截图):
关于分行友好显示十六进制内容和可打印字符内容,借鉴于www.tcpdump.org/sniffex.c。
3)Sniffer(下面的)和Content页面的内容都是动态显示的,即当捕获到一个数据包在界面显示时,屏幕会随着往下滚动。
比较奇怪的一个问题是Sniffer(上面的)和Alert Event页面中的时间项与同一行的其它项显示的内容不在同一条直线上,而是往上偏点儿,不知是什么原因。
由于时间的原因,刘老师书中所使用的旧的GtkClist widget没有用新的GtkTreeView重写,这也是有待改进的地方。
另外就是没有使用pthread类方法,而是用的gdkthread类方法,而且只创建了一个线程,原书中的创建两个线程的妙处没那么多时间和精力去琢磨。
至于使用的网卡设备,可以根据具体条件自己修改后再编译运行,比如我提供的源代码中的是eth0,若是无线网卡就是wlan0,这个可以通过在终端输入ifconfig等命令查看活跃网卡。捕获到的数据包数量也可以自定义,我提供的源码中是100个。 写完本文后我将投入到紧张的考研复习中,将有半年到一年的时间没法上网闲逛,上文中提到的相关问题我将没法和网友交流,望见谅。虽然我暂时没时间和大家一起探讨问题,但我又不想因为个人原因而将这么好的一个相互学习的机会给浪费掉,好的东西先分享,所以提供给大家,让大家先相互探讨,继续完善本软件。大家有什么好的想法、观点、解决办法等都可以发到我邮箱: river.shang@gmail.com,考研归来后,我会仔细查看的。 本软件的完成离不开众多人的关爱,没有他/她们,我将不会这么顺利的搞定它。他/她们是:
爸爸:放假在家期间,独自一人学习GTK+编程,无聊的时候,和爸爸一起玩游戏Mahjongg、Klondike和Mines等,其乐无穷。
妈妈:做的可口的饭菜使我在家享受到了在学校享受不到的神仙般的日子,有几个夜晚我敲着键盘,妈妈在旁边洗衣服静静地陪着我。有一次在电脑上为老爸和妈妈"弹奏"曲子--用的是VOS,得到他/她们的极大赞赏,他/她们对我的爱和鼓励、支持和包容是我前进的不竭动力。
小妹:在学校下载动画片带回家和她一起欣赏,带着她到处玩,和她在一起的日子是我在家渡过的最快乐的时光。
学校的好朋友:英子、琳妹妹、大小姐、小刚、哲哲、徒弟,感谢他/她们陪我在学校度过的毕设生活。记忆犹新的是英子的一句"老哥,我爱死你了"让我很感动。
以及所有爱我的人。
下面是源代码的下载地址(注意其中的rules文件中每一行的每个"变量"之间仅以一个tab键隔开):
http://download.csdn.net/source/2514975