Xmonitor系统活动监控系统设计文档.docx
- 文档编号:29860547
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:16
- 大小:171.73KB
Xmonitor系统活动监控系统设计文档.docx
《Xmonitor系统活动监控系统设计文档.docx》由会员分享,可在线阅读,更多相关《Xmonitor系统活动监控系统设计文档.docx(16页珍藏版)》请在冰豆网上搜索。
Xmonitor系统活动监控系统设计文档
Xmonitor系统活动监控系统设计文档
1.功能
该系统能监控域网内Windows系统节点机的系统活动(SystemActivity),在服务器上的图形用户界面显示监控信息。
能够监控的系统活动包括网络包的收发,文件的修改与创建,进程的执行,CPU使用率,电子邮件的收发。
2.体系结构
2.1体系结构图
2.1体系结构说明
如图所示,整个系统部署在一个局域网内,有若干个客户端节点和一个服务器节点。
每个客户端节点就是一个被监控的PC机。
每个客户端上运行一个ClientAgent,并且安装了数个探测器(Probe)。
探测器可以监测该机器本地的各类需要监控的信息,它们由ClientAgent统一管理。
ClientAgent将各探测器收集的信息发给服务器。
服务器节点上部署一个MSDE数据库,并且运行一个ServerDaemon和一个用户界面。
ServerDaemon负责接收各客户端发来的信息,用户界面显示各个客户端节点的各类被监控信息。
图中每个ClientAgent都可以根据用户需要加载若干个或者全部的探测器,为了便于显示,该图只画了一个ClientAgent加载全部探测器的情况。
活动模拟器是为测试方便所提供的,用按一定格式构造的文本文件信息来模拟各种活动,它提供与探测器一样的接口,也可以加载道ClientAgent上,图中省去了一条连线。
3.模块划分
3.1系统模块图
3.2模块介绍
如图所示:
整个系统包括9个模块(每个矩形框代表一个模块),分为3层:
1)服务器:
包括ServerDaemon模块和用户界面模块。
服务器Daemon负责接受客户端传过来的ActivityMessage,正确解析后存入数据库中。
用户界面从数据库中读取数据显示在图形界面上。
2)客户端Agent:
以 Windows服务形式存在。
它装载本地的各种探测器和模拟器,收集本地的各种信息,构造ActivityMessage发送给ServerDaemon.
3)客户端探测器和模拟器:
包括5种类型的探测器(网络,文件,进程,CPU,邮件)和一个事件模拟器。
它们都以动态链接库(DLL)形式存在,给ClientAgent提供统一的调用接口。
各探测器通过各自的探测技术监视系统的活动,收集系统活动信息传给ClientAgent。
模拟器通过读取事件模拟文件来将事件消息传给ClientAgent。
4服务器模块的实现
4.1用户界面模块
4.2ServerDaemon模块
4.2.1功能
监听局域网内其他机器上的ClientDaemon。
维护当前局域网内活动主机的列表,接收从ClientDaemon发送过来的数据,解析后存入数据库,供前台XmonitorGUI程序读取显示,并定期(每60分钟)清理数据库中的过时信息,保证数据库不溢出。
该模块以系统服务的方式在后台运行,用户可以通过XmonitorGUI对该模块进行启停操作。
4.2.2基本思想
采用多线程及异步通讯机制,构建能够快速处理多个连接和大量数据信息的网络服务器。
接收到的数据包利用一个队列来管理。
ServerDaemon与每一个ClientDaemon都保持一个TCP的常连接用于传输数据,该TCP连接由ServerDaemon发起。
整个ServerDaemon共有三个线程,线程一负责两个任务:
1、监听新加入的主机,与之建立TCP连接,更新活动主机列表(活动主机列表中包含TCP连接的信息);2、监听所有TCP连接,当有数据到来时,接收数据包并加入队列。
线程二负责解析数据包队列中的数据,并更新数据库。
线程三是一个垃圾收集程序,它定期清理数据库中的过时信息。
4.2.3数据库设计
数据库名为trendinfo,共包含6个表,分别为:
cpuinfo,fileinfo,netinfo,processinfo,mailinfo,nodeinfo。
其中nodeinfo用于记录当前被监控主机的信息,其余5个表用于记录相应的监控信息。
表的设计如下:
表名
字段名
字段类型
字段含义
cpuinfo
childip
varchar
活动主机ip
cpuusage
int
cpu利用率
eventtime
datetime
采集该记录的系统时间
fileinfo
childip
varchar
活动主机ip
event
varchar
文件操作类型
filename
varchar
文件名
eventtime
datetime
采集该记录的系统时间
netinfo
childip
varchar
活动主机ip
repeatnum
int
相同特性的网络包个数
direction
varchar
网络包的流向
protocol
varchar
传输层协议
tcpflag
int
tcp包中的flag值(非tcp包则为0
remoteip
varchar
网络包的远端地址
remoteport
int
网络包的远端端口
packetsize
int
网络包的大小
eventtime
datetime
采集该记录的系统时间
processinfo
childip
varchar
活动主机ip
event
varchar
进程活动类型
processname
varchar
进程对应的文件名
eventtime
datetime
采集该记录的系统时间
mailinfo
childip
varchar
活动主机ip
mailsubject
varchar
邮件主题
mailsender
varchar
邮件发送者
mailrecv
varchar
邮件接收者
attached
varchar
附件信息
eventtime
datetime
采集该记录的系统时间
nodeinfo
childip
varchar
主机ip
childname
varchar
主机名
active
int
该主机当前是否是活动状态
4.2.4启动之初的身份识别协议
为了免除客户端主机的配置工作并增强整个系统使用时的灵活性,本系统设计了一个身份识别协议:
1、每个ClientDaemon启动后,发送广播包
2、ServerDaemon在监听到
3、ClientDaemon等待ServerDaemon发起TCP连接,连接建立成功后,暂停发送
4、ServerDaemon启动后,发送广播包
协议的最后一条用于处理以下情况:
当ServerDaemon被异常中止,或是系统需要更换机器作为监控节点的时候,ClientDaemon会发觉TCP连接的失效,此时ClientDaemon进入等待状态。
在ServerDaemon重新启动后,发送
4.2.5ClientDaemon状态侦测协议
ServerDaemon必须及时对被监控主机的状态改变作出反应。
本系统认为ClientDaemon中止即意味着相应的主机离开监控系统。
ServerDaemon记录每次接收到数据的时间,定期检查nodeinfo中所有’active’字段为真的节点上次发送数据的时间,若时间超过一定阀值,则将其’active’字段设置为假,并从活动主机列表中将其删除。
4.2.6活动主机列表使用的数据结构
ServerDaemon维护一个当前活动主机的列表,每个活动主机都对应一个child_connection结构:
typedefstruct{
SOCKETsocket;//ServerDaemon用来从该主机接
//收数据的TCPsocket;
char*remote_ip;//该活动主机的ip地址;
。
。
。
unsignedlonglast_data_time;//上次ServerDaemon从该主机接收到数
//据的时间
}child_connection
5ClientAgent的实现
5.1功能
ClientAgent运行在每个客户端上,提供探测器与ServerDaemon之间的接口。
各种不同类的探测器采集到的数据都要经过ClientAgent统一发给ServerDaemon。
5.2接口的实现
●ClientAgent与ServerDaemon:
每个新启动的Daemon在局域网内发广播消息通知自己的加入,收到对应Daemon的回应后建立TCP常连接,此后通过Socket传输数据。
每个活动的ClientAgent都与唯一的ServerDaemon建立常连接。
●ClientAgent和探测器(模拟器):
ClientAgent利用各探测器(或模拟器)的DLL提供的输出函数来控制探测器(或模拟器)的运作,并且通过设置回调函数和共享内存机制来获取各DLL收集到的数据。
由于ClientAgent与DLL之间提供统一接口,ClientAgent上还可以扩展各种不同的探测器,只要符合统一接口,就能加入系统,为整个监控系统提供更多类型的系统活动信息。
6探测器和模拟器的实现
6.1基本原理
探测器与模拟器以DLL形式存在,供ClientAgent调用.各探测器DLL分别命名为net.dll,file.dll,proc.dll,cpu.dll,mail.dll,模拟器的DLL命名为simulator.dll。
这些dll文件放在一个probe文件夹下。
ClientAgent启动后将从该文件依次加载这些DLL。
6.2各DLL的公共接口
为了便于统一管理,各DLL为ClientAgent提供统一的接口,共有输出函数如下:
●EXPORTBOOLEANWINAPIStart(void)
//启动服务函数,agent调用该函数开始探测器的服务。
具体操作为启动一个线程,该线程定期调用回调函数(pCallback所指向的agent中的函数),将探测消息或模拟文件的消息传给agent。
●EXPORTBOOLEANWINAPIStop(void)
//停止服务函数,具体操作为停止线程。
●EXPORTintWINAPIGetType(void)
//获取服务类型,AGENT通过调用该函数获得不同的探测器类型。
●EXPORTBOOLEANWINAPISetCallbackFunc(CALLBACKFUNCpCallback)
//设置回调函数,AGENT调用该函数将函数指针pCallback指向一个具体函数,该函数可以取得探测消息或模拟消息。
6.3网络包探测器
6.3.1功能
能够监视系统中网络流量的动态变化情况。
6.3.2基本思想及关键技术
监视网络流量,驱动中建立一个普通的设备,然后通过IOCTL_PF_SET_EXTENSION_POINTER操作将你的内核模式的过滤钩子挂接到系统默认的IPFILTERDRV过滤驱动程序上,这样就可以在自己的过滤钩子里面实现完整的基于包的各种分析和过滤的处理了。
对IPFILTERDRV挂钩是通过下面的函数调用进行挂钩:
PF_SET_EXTENSION_HOOK_INFOextensionHook={IpHookFilter,};
IoBuildDeviceIoControlRequest(IOCTL_PF_SET_EXTENSION_POINTER,ipGlobal.getIpDevice(),(PVOID)&extensionHook,sizeof(PF_SET_EXTENSION_HOOK_INFO),NULL,0,FALSE,&event,&IoStatus);
IoCallDriver(ipGlobal.getIpDevice(),Irp);
然后我们在IPHookFilter中进行数据包的日志记录。
6.4文件探测器
6.4.1功能
通过文件系统的过滤器来捕获系统的IO请求,过滤出文件的创建,删除,修改事件。
6.4.2实现的结构图
6.5进程探测器
6.5.1功能
能够监视系统中进程的动态变化情况,如进程的启动、终止。
6.5.2基本思想及关键技术
监视系统中进程变化情况采取的是在系统中添加一个设备驱动程序(\\Device\\Procmon),该驱动程序能动态监视系统中任意进程的创建与销毁。
这是通过PsSetCreateProcessNotifyRoutine()函数来实现的,它向系统注册了一个回调函数,该函数原型如下:
NTSTATUS
PsSetCreateProcessNotifyRoutine(
INPCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
INBOOLEAN Remove
);
VOID
(*PCREATE_PROCESS_NOTIFY_ROUTINE)(
INHANDLE ParentId,
INHANDLE ProcessId,
INBOOLEAN Create
);
该CALLBACK函数只提供了进程ID,并没有提供进程名。
那么我们要进一步通过进程ID来获取进程名。
这需要用到一个未公开的函数PsLookupProcessByProcessId()。
函数原形如下:
NTSTATUS
PsLookupProcessByProcessId(
INULONGulProcId,
OUTPEPROCESS*pEProcess
);
函数输出的EPROCESS结构中的偏移0x1FC指向当前进程名。
首先建立一个设备,由RtlInitUnicodeString、IoCreateDevice两个函数完成;
然后向系统注册监测线程创建和销毁的回调函数,并处理设备对象操作;
当驱动程序监测到有进程动态变化时,将对应的情况存入申请的内核缓冲区中,当process探测器定期查询时,将向该驱动程序发出获取信息的命令,驱动程序收到该命令后,将把保存的信息发送给探测器;
最后探测器再将收到的数据发给clientagent,由它转交给serverdaemon。
6.6CPU探测器
6.5.1功能
能够以一定的间隔(可由用户设置)收集cpu的利用率。
6.5.2基本思想及关键技术
利用windows提供的性能计数器能够监视各种系统活动,如cpu利用率、内存使用情况、磁盘利用率等等。
对此,windows系统提供了一组API函数进行操作,其处理流程如下:
使用PdhOpenQuery函数打开一个query(查询);
使用PdhAddCounter函数向所打开的query添加counter,收集所希望监视的信息;
使用PdhCollectQueryData函数启动query进行查询;
使用PdhGetFormattedCounterValue函数从保存性能信息的counter中格式化地读取数据;
调用callback函数将获得的数据传给clientagent。
睡眠一段时间,重复3)、4)两步。
6.5.3CPU.DLL的实现
在Start()接口中创建一个监视器线程来收集cpu利用率信息。
该进程调用以下两个函数:
voidMonitorCreate(char*path)//创建查询和添加计算器;
输入:
path:
为待查询对象的路径,在本探测器中为cpu的路径,\\Processor(_Total)\\%ProcessorTime。
voidCollectInfo()//收集cpu的使用信息并传给clientagent。
6.7电子邮件探测器
6.5.1功能
能够监测到用邮件客户端(如Foxmail,OutlookExpress)利用POP3和SMTP和议收发电子邮件的信息。
收集到每次邮件操作(发或收)的邮件主题,发信人,收信人列表,附件文件名列表,并将这些信息及时通过ClientAgent传到服务器。
6.5.2实现基本思想
采用基于WinsockSPI数据报过滤技术,往SPI协议链挂钩,截获所有网络连接远程端口为25(SMTP)和110(POP3)的收发数据报,参照SMTP和POP3协议的规则,将有用信息提取出来,构造消息传给ClientAgent.
6.5.3MAIL.DLL组成
1)MAIL.DLL特有的共享数据
●charMsgQueue[MAX_MSG][MAX_CHAR]={0};//消息缓冲区
●intfront=0;//消息缓冲区的读指针
●intrear=0;//消息缓冲区的写指针
以上三项构成各进程共享消息缓冲循环队列。
各邮件客户端进程(如Foxmail)挂载的mail.dll负责获取信息,构造消息填入缓冲队列。
Agent进程挂载的mail.dll的服务线程负责定期将缓冲队列内的消息取出传给AGENT的私有空间。
对缓冲队列的操作需要互斥。
2)MAIL.DLL特有的输出函数
●intWSPAPIWSPStartup(WORDwVersionRequested,LPWSPDATAlpWSPData,LPWSAPROTOCOL_INFOWlpProtocolInfo,WSPUPCALLTABLEupcallTable,LPWSPPROC_TABLElpProcTable)
//SPI入口函数,利用这个函数完成SPI的挂钩,这里没有挂钩所有的函数,只
//截获了我们所需要的几个,分别是lpWSPConnect,lpWSPAccept,lpWSPSend,
●EXPORTBOOLEANWINAPIStart(void)
//启动服务函数,Agent调用该函数开始探测器的服务。
具体操作为启动一个线程,该线程定期调用回调函数(pCallback所指向的AGENT中的函数),将探测到的邮件信息通过以字符消息的形式传给agent。
●EXPORTBOOLEANWINAPIStop(void)
//停止服务函数,具体操作为停止线程。
●EXPORTintWINAPIGetType(void)
//获取服务类型,AGENT通过调用该函数获得不同的探测器类型。
●EXPORTBOOLEANWINAPISetCallbackFunc(CALLBACKFUNCpCallback)
//设置回调函数,AGENT调用该函数将函数指针pCallback指向一个具体函数,该函数可以取得探测器获取的邮件信息。
4)SPI服务提供者钩子函数
●intWSPAPIWSPConnect(SOCKETs,conststructsockaddrFAR*name,···)
//判断连接钩子函数
功能:
判断新的连接请求是否为smtp和pop3的连接请求。
●intWSPAPIWSPSend(SOCKETs,LPWSABUFlpBuffers,···)
//截获发送包的钩子函数,
功能:
截获发往远程端口25和110的数据,并且分析提取有用信息
●intWSPAPIWSPRecv(SOCKETs,LPWSABUFlpBuffers,···)
//截获接收包的钩子函数,
功能:
截获来自远程端口25和110的数据,并且提取有用信息
5)收发邮件状态标志
由于一封邮件的收发需要通过多次调用WSPSend和SPRecv完成,而且POP3的一次会话可以收多封邮件。
所以需要设置一些邮件发送状态标志,来判断该次发送的具体内容,或者作为邮件收取结束的标志,以辅助分析。
●boolsmtp_flag=false;//该标志为真表示已经建立一个smtp连接
●boolsmtp_content_flag=false;//该标志为真表示正在发送邮件正文包括附件
●boolsmtp_attachment_flag=false;//该标志表示有smtp无附件
●boolpop3_flag=false;//该标志为真表示已经建立一个pop3连接
●boolpop3_RETR_flag=false;//为真表示刚发过一个RETR,开始取邮件
●boolpop3_attachment_flag=false;//该标志表示有pop3有无附件
6.5.4邮件分析基本算法
1)STMP发邮件
●WSPConnect()函数捕获对远程SMTP服务器的连接请求,将smtp_flag置为true;
●每次WSPSend()在调用系统的发送函数前,如果得知smtp_flag为真,则要将待发送的消息(lpBuffers->buf)做如下分析:
i.如果该消息的前几个字符为“RCPT”,则表示该包后面的内容为一个接收者的邮件地址,将它提取加入临时的接收者字符串中。
ii.如果该消息中包含“From:
”和”To:
”关键字,则表示该消息中包含邮件头内容,可以从中提取发送者和主题信息,放入相应的临时内存区。
并且将smtp_content_flag置为真。
iii.如果smtp_content_flag为真,表示该消息属于邮件的正文和附件,要开始提取附件文件名。
以“attachment”和“filename”为关键字循环获取附件文件名,获取第一个附件后将smtp_attachment_flag置为真。
iv.如果该消息的前几个字符为“QUIT”,表示邮件发送完毕,连接即将关闭,此时将以上获得的包含各种信息的字符串按一定格式构造一条消息,写入共享区的消息缓冲队列中。
并且将所有smtp标志置为false。
2)POP3收邮件
●WSPConnect()函数捕获对远程POP3服务器的连接请求,将pop3_flag置为true;
●每次WSPSend()在调用系统的发送函数前,如果得知pop3_flag为真,则要将待发送的消息(lpBuffers->buf)做如下分析和处理:
v.如果该消息的前几个字符为“RETR”,表示发出一个取邮件的命令。
如果此时pop3_RETR_flag,表示在此之前刚刚取完一封邮件,构造好邮件信息消息写入消息缓冲队列。
反之,如果此时pop3_RETR_flag为假,表示这是这次POP3连接中的第一次取邮件,将pop3_RETR_flag置为真后退出。
vi.如果该消息的前几个字符为“QUIT”,如果此时pop3_RETR_flag,表示刚刚取完一封邮件,构造好邮件信息消息写入消息缓冲队列。
最后将所有所有pop3标志置为false.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Xmonitor 系统 活动 监控 设计 文档