1. 引言

1.1学习背景

随着计算机技术和网络技术的发展,计算机系统和其他网络设备的复杂性越来越高,由此由入侵行为或者非法的操作等引起的问题也就越来越多。所以在计算机系统中或系统中的软件都使用日志记录其资源的使用情况和其他一些重要操作信息。通过对程序日志的统计分析,我们可以发现程序使用者的一些非法操作或其使用习惯。通过对网络日志的分析,我们可以了解到网站的访问情况和用户的使用习惯等,最重要的是在网络入侵或者威胁产生的时候,日志信息详细记录了这些情况,因此通过对日志的分析,可以发现入侵的行为或具有威胁的一些情况, 然后通过适当的处理,能够避免入侵或者解除威胁,或者降低损失。但是由于系统一般比较庞大,产生的日志信息量也是十分惊人的,同时曰志的记录信息不是很容易阅读,如果纯人工分析的话,所耗费的时间和精力是不可估量的。

1.2日志的特点

为了记录和维护计算机或其他网络设备的运行状况以及自身资源的使用情况,计算机系统或其他网络设备一般都会有相应的日志记录系统来记录有关曰常事件或者误操作警报的相应信息,例如操作和事件信息等。同样,在计算机中运行的软件也有相应的日志记录系。日志(Log)指的是按照时间发生的顺序系统记录对象的操作和其操作结果的集合。每条日志记录描述了一次单独的系统事件。通常情况下,这些记录的日志信息文件是一般的文本文件,可以直接打开阅读,这些信息中包含了时间信息或者子系统所特有的其他信息,主要有以下特点:

1)不易阅读

基本上各种类型日志的记录方式都是采用文本格式方式存储,并且各种不同类型的日志在文件中记录的字段各不相同,因此,如果不熟悉日志的存储格式,是难以获取其中的有效信息。并且有些日志类型是不釆用文本格式进行存储,需要借助相应的工具进行读取,否则难以兹得其中的日志信息。

2)日志数据量大

一般日志记录器记录了各种信息,有一般的运行信息,同时也存在一些警告等信息,通常一个日志文件每天产生的日志信息信息量一般有几十兆或更多,大的能够达到G的数量级,因此,要从这些庞大的数据量中获取有效的信息,是十分困难的事情。

3)获取困难

当前有许多的不同的系统和其他网络设备,各种设备中记录日志的方式各不相同,而且没有形成统一的日志记录规范。因此对不同日志的提取需要不同的方式去实现,所以如何获取各种日志信息也就变得比较困难。

4)不同类型日志之间存在一定的联系

同一类型的日志一般只记录了这个系统或软件的运行情况,并不能完全反应用户的整个活动过程。而用户一般会使用多个系统或者软件,且这些系统和软件之间存在着的一定的联系。所以,只有将与用户相关的多种类型的日志进行联立起来分析,才能反映用户详细的活动情况。

5)日志文件的安全性

一般系统或软件产生的日志信息是以文本方式存储在磁盘当中,这些曰志文件一般是釆用一定的格式进行存储,没有进行加密,并且日志文件的安全性不高。所以当入侵发生的时候,会将日志文件删除或者篡改日志中的信息,使分析软件不能获取日志信息或得到错误的日志信息,因此需要对日志的安全性进行考虑。正是由于日志具有以上的特点,所以在入侵发生或正在发生的时候,日志记录了重要的信息,如果能够在入侵发生后正在发生的时候通过日志信息捕获。

2. 获取日志文件

2.1开发环境与开发语言:

VS2013、C++、MFC、VC++6.0

2.2开发过程:

1.首先采用传统的控制台开发模式,采用VC++6.0开发工具,将获取到的系统日志信息显示出来,刚开始时也先测试简单信息的获取情况,采用windows API函数OpenEventLog()和ReadEventLog()操作系统日志文件,测试后成功,测试程序如图一:

           

                                                                     图一

2.接着试着获取详细信息,在前面的基础上通过添加函数,并尝试了好几回,最后也终于获取成功,测试程序如图二:


                                                                                 图二

3.在控制台测试成功的基础上,自己觉得使用MFC应该不是问题,慢慢的使用VS2013创建相对应的对话框后,将图一中实现的代码(从简单到复杂的开发思路)粘贴上去之后便出现了许多问题,最后还是挺悲伤的,特别是遇到32位时间的问题,一是EVENTLOGRECORD结构体中存放的日志文件的时间问题,二是VS2013中使用64位时间,而VC++6.0中使用的是32位,两者在转化之间存在许多问题,在调试过程中也遇到了许多错误。最后通过尝试多方法,并在VS2013中将项目属性改为多字节和在C++有处理器中添加 _USE_32BIT_TIME_T终于解决,最后终于实现成功,测试程式如图三:


                                                                           图三

4.在此基础上自己越来越有信心,最后很快便实现了详细信息的获取,且输出到txt文件保存,期间主要的问题是Edit控件的文本显示问题,特记录代码如下:默认情况下edit是32K richedit是64K;

CEditedit;  

edit.LimitText(-1); //创建后加上这句即可

最后终于实现成功,测试程式如图四:


                                                              图四

5.在综上测试程序的基础上,接下来就是远程控制项目的日志获取模块的实现,在从控端添加相应指令代码之后便开始尝试远程获取。这过程最困难的是远程远程传输:由于之前的MFC获取过程是一条一条的实现,本身日志文件也挺大,最后叠加之后显示,所以最后的信息量挺大,一般>10M,所以当信息在远程传输时便出现了许多问题,最后我换种思路,既然之前MFC获取过程是一条一条实现的,而一条的信息量不大,所以便采取一条一条地发送形式,而由于Socket对象不在之前的获取函数之中,所以便通过函数参数传递的形式将之前的函数形式改动了许多,就是将Socket对象传到获取函数之中,从而实现一条一条发送,成功界面如图五:


                                                                        图五

6.测试成功后便很快实现了将获取到的日志信息保存到txt文件之中,并在txt文件命名时考虑到获取时间间隔一般不会少于一分钟,故命名中的时间精确到分钟即可;考虑到不同时间获取同一服务器的的日志文件命名为重复,程序会在之前的文件之尾追加文本,造成重复,且不便查看,本程序采用添加时间来避免命名重复问题,经过windows txt命名规则的测试,并考虑到直观效果,最终决定将获取的日志文件统一命名形式为“ip(Log@日期-时间).txt”,例如10.6.178.252(Log@2014.12.02-12.38).txt,并在最后获取完毕时添加相应的提示指令,最后成功实现如下:



                                                                                          图六


                                                                                                         图七

3. 总结

通过系统日志文件的获取,自己在这个过程中学到了许多东西,特别是思维的锻炼,而不只是代码能力的提高。也深深地明白程序开发是一项枯燥而极具挑战力的工作,需要耐心、信心和用心。