




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
网络入侵取证布局设计By 黑海洋 (owasp 中国分会成员)引 言网络犯罪已成为全球性威胁计算机网络入侵取证是一门针对计算机网络入侵与犯罪进行证据获取、保存、分析和出示的计算机网络技术。目前,入侵取证的模式大致可分为两种,一种是在案发后,使用技术手段对相关计算机进行取证,主要是对被损坏的文件进行恢复和分析,同时,发现相关入侵信息;另一种,是取证机进行实时监测,对连接在网络中被保护终端的状态数据进行即时监测记录,类似与飞机上使用的黑匣子,一但发生入侵行为,便可通过对记录的数据进行分析,确定攻击源。本文研究网络入侵取证,在Win32平台下设计实现了由取证机及客户端信息采集系统构成的分布式网络入侵取证系统,包括链路层以太帧的捕获子系统(从网络传输底层获取追踪、取证所必须的MAC地址,IP地址,通讯内容等详细信息),被取证机的数据采集子系统(检测核心机密文件是否被篡改,重要进程的运行情况等)等;文中对网络数据包捕获,取证系统自身保护,系统间通讯给出了多种设计方案,并做了比较和探讨。一、入侵取证的意义与现状在无法有效防范网络、计算机犯罪的情况下,有效的打击网络的非法入侵者显得十分重要,计算取证技术为我们提供了手段,通过获取电子证据,寻找罪犯并将其绳之于法。计算机取证是一门针对计算机入侵与犯罪进行证据获取、保存、分析和出示的计算机网络技术。目前,入侵取证的模式大致可分为两种,一种是在案发后,使用技术手段度对相关计算机进行取证,主要是对损坏的文件进行恢复和分析,同时,发觉相关使用信息;另一种,是实时监测模式的取证机,它连接在网络中随时监测记录被保护终端的状态数据,类似与飞机上使用的黑匣子,一但发生入侵行为,便可通过对记录的数据进行分析,确定攻击源,依法打击入侵者。网络入侵已成为最主要的攻击手段,网络安全一直以来都是,网络应用进一步发展的核心问题。防火墙是传统入侵防范措施,在技术理论上,现代防火墙是一种先进而复杂的基于应用层的网关,经过仔细的配置,通常能够在内、外网之间提供安全的网络防护,降低网络被攻击的风险,但实践中发现,仅仅依靠防火墙是不够的,网络入侵检测和取证系统正成为其有效的补充。有效的监测、记录网络的数据包,是发现入侵行为,取证的重要手段。黑客攻击的重点通常是重要文件,例如,对网站的攻击常常是以恶意窜改网页文件的方式进行的。因此,主动监视关键文件已获取篡改迹象是入侵取证的关键。目前,国际上的入侵监测技术也正出于起步和探索阶段,同时,计算机取证还需要与相关的法律相结合,但是现行与之相关的法律尚不完善。已开发的一些取证工具有:The Coroners Toolkit“取证剖析工具”可以用于被删除文件的恢复、.TASK针对文件系统取证的命令行工具集合等软件。二、分布式网络入侵取证系统网络入侵取证系统的核心是取证机,取证机实时的获取网络数据和被取证机的各种重要信息并进行存储,并能对数据进行分析得出最终结论。取证机上应包含高性能网络监听部分用于获取网络数据源,监测网络中的全部活动;客户机信息采集部分接收、保存来自客户机信息收集器的各种信息;数据分析部分帮助网络管理员根据记录分析入侵行为。被取证机上包含信息收集器用于收集包括重要文件访问、篡改等重要的系统信息,并将其发回取证机。网络物理结构框架如图:网络入侵取证系统的流程如下(适当加点文字说明):三、网络入侵取证系统的设计及技术要点下面讨论网络入侵取证系统的原理,实现网络入侵取证系统中的主要模块。3.1网络数据采集实现网络监听技术可以有效捕获网络数据包是实现网络监测,入侵检测,入侵取证的系统的基石。使用网络监听技术可以发现入侵并对入侵者进行追踪定位,在对网络犯罪进行侦查取证时获取有关犯罪行为的重要信息,成为打击网络犯罪的有力手段。3.1.1网络监听的基本原理以太网数据传输是通过广播实现的,将要发送的数据包发往连接在一起的所有主机,包中包含着应该接收数据包主机的正确地址,只有与数据包中目标地址一致的那台主机才能接收。但是,当主机工作监听模式下,无论数据包中的目标地址是什么,只要经过自己网络接口,主机都将接收。当网络中的两台主机通信的时候,源主机将写有目的的主机地址的数据包发向目的主机。TCP/IP协议中数据包从IP层交给数据链路层,而网络接口是不会识别IP地址的,因此在网络接口数据包又增加了一部分以太帧头的信息。在帧头中有两个域,分别为只有网络接口才能识别的源主机和目的主机的物理地址,这是一个与IP地址相对应的48位的MAC地址。当数据帧到达一台主机的网络接口时,正常情况下,网络接口读入数据帧,如果数据帧中携带的物理地址是自己的或者是广播地址,则将数据帧交给上层协议软件,也就是IP层,否则就将这个帧丢弃。对于每一个到达网络接口的数据帧,都要进行这个过程。然而,当主机工作在监听模式下,所有的数据帧都将被交给上层协议软件处理。常用的以太网卡支持以下工作模式:广播模式、多播模式、直接模式和混杂模式。网卡在设置为广播模式时,它将会接收所有目的地址为广播地址的数据包,一般所有的网卡都会设置为这个模式。网卡在设置为多播模式时,当数据包的目的地址为多播地址,而且网卡地址是属于那个多播地址所代表的多播组时,网卡将接纳此数据包,即使一个网卡并不是一个多播组的成员,程序也可以将网卡设置为多播模式而接收那些多播的数据包。网卡在设置为直接模式时,只有当数据包的目的地址为网卡自己的地址时,网卡才接收它。网卡在设置为混杂模式时,它将接收所有经过的数据包,这个特性是编写网络监听程序的关键。3.1.2 用Libpcap软件包实现数据分组的捕获Libpcap(其Windows版本为Winpcap)是一种与系统无关,采用分组捕获机制的分组捕获函数库,用于访问数据链路层。Libcap在不同的平台上采用统一的编程接口,使用libcap编写的程序可自由的跨平台使用。Windows并未提供内置的分组捕获机制,这一功能由应用系统提供,Winpcap使用BPF虚拟机(NPF)补充了这一机制。NPF在Windows 95/98/ME中以VXD文件的方式实现,在windows2000中以SYS文件的方式实现。由于Libpcap的平台无关性及其优异的性能,下面将论述基于Libpcap的高性能网络监听器的实现。3.1.3 Libpcap的体系结构Libcap接口支持基于BSD数据过滤器(BPF)的数据过滤机制。Winpcap是基于NPF机制的,NPF于BPF最大的不同在于采用的内核缓存的形式不同。Libpcap是基于程序员的角度设计的,它帮助程序员实现了应用程序与操作系统内核的接口。Libpcap提供了一组强大而高效的函数来实现数据包的捕获,同时提供了用户数据缓存用于存储来自与内核的数据包,有效防止应用程序进入系统内核管理的存储区域,提高程序的健壮性。基于BSD的Libpcap结构Libpcap由二十多个C程序文件组成,按功能大致分为以下几个部分:1) 打开,读取设备,设置过滤部分2) 编译、优化、调试过滤部分3) 脱机方式监听部分4) 本地网络设置检测部分5) 主控程序及版本部分3.1.4 Libpcap数据包捕获程序流程1. 获取本地设备信息。通过函数pcap_lookupdev寻找系统中可用的网络接口设备,返回一个表示网络适配器的字符串。2. 打开设备开始监听会话通过函数pcap_open_live()建立监听会话。Pcap_t *pcap_open_live(char *device,int snaplen,int promisc,int to_ms,char *ebuf)其中:device为上一步中所提到的网络适配器的字符串,snaplen定义监听程序所捕获的最大字节数,promisc定义是否将网络适配器设置为混杂模式。to_ms定义读操作的时间。Ebuf函数调用失败时返回错误信息字符串。3. 设置过滤条件编辑过滤字符串,设置过滤器,制定要捕获的主机、协议等,可以有效的捕获指定类型的数据。通过函数pcap_compile将过滤字符串编译为二进制。常用的过滤字符串有“host 29”表示捕获主机29收发的数据帧,“tcp” 表示捕获协议类型为TCP的数据帧,“port 20” 表示捕获目的或源端口是20的数据帧等等,很多过滤字符串还能进行组合。由pcap_setfilter()函数进行内核过滤器的设置生效。 4. 执行捕获循环 每捕获一个数据包后就调用用户的回调函数对数据包进行处理,以上功能可通过调用以下两个函数实现pcap_dispatch,pcap_loop,它们的功能基本相同,唯一的差别在于pcap_loop在读取超时时不会返回。3.1.5 监听程序性能的调整在需提高监听程序性能时可做以下相应调整。1 调整用户级缓存。通过修改pcap_open_live()函数的源代码并重新编译后来调整用户级缓存。2 调整函数pcap_open_live()中的读操作等待时间值。通常出于效率可将该值设置的比较大;但当对响应时间要求比较高时,应将该值改小。3 设置严格的过虑条件。4 在基于WIN32平台,winpcap中还可以通过函数pcap_setbuff()来设置内核缓存,通常情况,要取得较好的性能应设置较大的内核缓存。3.1.6 数据帧的协议解析捕获后的数据帧经过解析才能得到我们想要的信息,如作为网络监听所需要的数据帧的源地址,目的地址,协议类型等信息。解析的过程是将数据帧中的数据按不同协议进行分析提取。首先,要按照不同协议数据组织格式定义效应数据类型,下面根据以太网网数据帧的格式及TCP/IP协议栈定义相关数据类型。定义以太帧的头部数据类型:typedef structUCHAR DestMac6;UCHAR SrcMac6;UCHAR Etype2;ETHHEADER;注意网络接口卡驱动程序会负责计算效验和,并取走帧中的前同步字符和效验字段。根据IP数据包的封装格式定义IP头部的相应数据类型:typedef struct UCHAR header_len:4; UCHAR version:4; UCHAR tos:8; / type of service USHORT total_len:16; / length of the packet USHORT ident:16; / unique identifier USHORT flags:16; UCHAR ttl:8; UCHAR proto:8; / protocol ( IP , TCP, UDP etc) USHORT checksum:16; UCHAR sourceIP4; UCHAR destIP4;IPHEADER;可根据以上示例定其他协议的相应数据结构。3.1.7网络监听程序实例以下将通过作者利用Winpcap及MFC开发的网络入侵取证系统的网络数据包捕获部分,来进一步阐述利用libpcap开发网络监听程序的方法。以下仅分析程序的监听部分。1 数据类型定义为了实现捕获数据的解析定义了相关数据类型:(在文件decode.h中定义)/定义协议类型名称char *Proto = Reserved, ICMP, IGMP, GGP, IP, ST, TCP, UCL, EGP, IGP, BBN-RCC-MON, NVP-II, PUP, ARGUS, EMCON, XNET, CHAOS, UDP, MUX, DCN-MEAS, HMP, PRM, XNS-IDP, TRUNK-1, TRUNK-2, LEAF-1, LEAF-2, RDP, IRTP, ISO-TP4, NETBLT,MFE-NSP, MERIT-INP, SEP, 3PC, IDPR, XTP, DDP, IDPR-CMTP, TP+, IL, SIP, SDRP, SIP-SR, SIP-FRAG, IDRP, RSVP, GRE, MHRP, BNA, SIPP-ESP, SIPP-AH, I-NLSP, SWIPE, NHRP, unassigned, unassigned,unassigned, unassigned, unassigned, unassigned,any host internal protocol, CFTP, any local network, SAT-EXPAK, KRYPTOLAN, RVD, IPPC, any distributed file system, SAT-MON, VISA, IPCV, CPNX, CPHB, WSN, PVP, BR-SAT-MON, SUN-ND, WB-MON, WB-EXPAK, ISO-IP, VMTP, SECURE-VMTP, VINES, TTP, NSFNET-IGP, DGP, TCF, IGRP, OSPFIGP, Sprite-RPC, LARP, MTP, AX.25, IPIP, MICP, SCC-SP, ETHERIP, ENCAP, any private encryption scheme, GMTP;typedef struct /定义以太帧的头部数据类型UCHAR DestMac6;UCHAR SrcMac6;UCHAR Etype2; ETHHEADER;typedef struct /IP头部的数据类型 UCHAR header_len:4; UCHAR version:4; UCHAR tos:8; / type of service USHORT total_len:16; / length of the packet USHORT ident:16; / unique identifier USHORT flags:16; UCHAR ttl:8; UCHAR proto:8; / protocol ( IP , TCP, UDP etc) USHORT checksum:16; UCHAR sourceIP4; UCHAR destIP4; IPHEADER;typedef struct /定义端口数据类型用于解析TCP和UDP中的源端口和目的端口USHORT srcPort;USHORT decPort;PORT;2 监听和解析过程的实现pcap_t* fp;UINT listen(LPVOID Param )bpf_u_int32 mask;bpf_u_int32 net; CString strerr;struct bpf_program filter;char ebufPCAP_ERRBUF_SIZE;char *adapter; if (!m_continue) fp=NULL;return 0;tt= sizeof(Proto) / sizeof(char *);/ 1.查找本地网络适配器adapter=(char*)pcap_lookupdev(ebuf);pcap_lookupnet(adapter,&net,&mask,ebuf);if(adapter = NULL)strerr.Format(PCAP error:%s,ebuf); MessageBox(NULL,strerr,NULL,0);return 1;/ 2.建立监听会话/ Note: the adapter may not proper adapter!fp = pcap_open_live(adapter, 2000, 1, 20, ebuf); char f_app250;for (int i=0;i250;i+) f_appi=0;filter_app.TrimLeft();filter_app.TrimRight();strcpy(f_app,(LPCSTR)(filter_app);/filter_app为全局字符变量,在其他部分设定 /表示过滤规则字符串。 if(fp = NULL)strerr.Format(PCAP error:%s,ebuf); MessageBox(NULL,strerr,NULL,0);return 1; if(pcap_datalink(fp) != DLT_EN10MB) /返回数据链路层的类型 MessageBox(NULL,Not Ethernet 10MB adapter!,NULL,0);pcap_close(fp);return 1; pcap_compile(fp,&filter,f_app,0,0);pcap_setfilter(fp,&filter);/,0,net/ 3.建立捕获循环pcap_loop(fp, 0, dispatcher_handler, NULL);/ dispatcher_handler为数据包处理回调函数/ 4.关闭设备. pcap_close(fp);fp=NULL;return 0;3 数据包处理回调函数。函数将解析后得到后的信息,显示在对话框中的ListView控件中,并将全部数据帧的内容以十六进制显示在文本框中。void dispatcher_handler(u_char *,const struct pcap_pkthdr *header, const u_char *pkt_data)if (!m_continue) :AfxEndThread(CREATE_SUSPENDED );CGuicapDlg * m_dlg=dynamic_cast(:AfxGetApp()-GetMainWnd();ETHHEADER *eth_header = (ETHHEADER *)pkt_data;/解析数据包的以太帧头部CTime t = CTime:GetCurrentTime();/获取当前时间 CString item; item.Format(%02d:%02d:%02d,t.GetHour(),t.GetMinute(),t.GetSecond();m_dlg-m_list.InsertItem(0, item, -1);item.Format(%ld,header-len); m_dlg-m_list.SetItemText(0, 1, item);if (header-len = ETHHEADERSIZE)/ 解析数据包的IP头部IPHEADER *ip_header=(IPHEADER *)(pkt_data+14);if (ip_header-proto 99)strcpy(strType ,IP/UNKNOWN); elsestrcpy(strType, Protoip_header-proto);/ 解析出协议类型 item.Format(%02X-%02X-%02X-%02X-%02X-%02X, eth_header-DestMac0,eth_header-DestMac1, eth_header-DestMac2, eth_header-DestMac3,eth_header-DestMac4, eth_header-DestMac5);/提取目的MAC地址m_dlg-m_list.SetItemText(0,2,item); item.Format(%d.%d.%d.%d,ip_header-destIP0 ,ip_header-destIP1,ip_header-destIP2,ip_header-destIP3);/ 提取目的IP地址 m_dlg-m_list.SetItemText(0,3,item);item.Format(%02X-%02X-%02X-%02X-%02X-%02X, eth_header-SrcMac0,eth_header-SrcMac1, eth_header-SrcMac2, eth_header-SrcMac3,eth_header-SrcMac4, eth_header-SrcMac5);/ 提取源MAC地址m_dlg-m_list.SetItemText(0,4,item); item.Format(%d.%d.%d.%d,ip_header-sourceIP0 ,ip_header-sourceIP1,ip_header-sourceIP2,ip_header-sourceIP3);/ 提取源IP地址m_dlg-m_list.SetItemText(0,5,item);item.Format(%s,strType);/显示协议类型m_dlg-m_list.SetItemText(0,6,item);item.Format(%d,ip_header-ttl );/ 提取TTLm_dlg-m_list.SetItemText(0,7,item);if (strcmp(TCP,strType)=0)|(strcmp(UDP,strType)=0)/如果协议是UDP,TCP进一步解析端口号PORT *port=(PORT *)(pkt_data+14+20);/ 解析端口号item.Format(%d,ntohs(port-decPort );/注意为了正确的显示端口需要将网络字顺序转变为主机字节顺序使用函数ntohsm_dlg-m_list.SetItemText(0,8,item);item.Format(%d,ntohs(port-srcPort );m_dlg-m_list.SetItemText(0,9,item);m_dlg-m_text=;CString tmp;/在文本框中显示数据帧的内容UCHAR *p = (UCHAR *)pkt_data;char ret2;ret0=13;ret1=0;for(int i = 0; i len; i+)tmp.Format(%02X , *p+); m_dlg-m_text+=tmp;if( (i + 1) % 25= 0)m_dlg-m_text+=rn;m_dlg-UpdateData(false);3.2 被取证机信息采集器的设计与实现被取证机信息采集器有两种设计倾向,一种是信息采集器仅负责收集信息,并直接传回取证机;另一种则是信息采集器有一定的信息分析处理功能。前者,被取证机的负担较轻,但是取证机的负担相对较重,在被取证机数目较多的情况下可能引起较大网络流量;后者,采用智能信息采集器,有效减轻取证机负担和网络流量,但被取证机的负担较重,可能会对被取证机的使用造成影响。3.2.1 核心文件信息采集以下讨论有关采集器对核心文件信息采集的实现。采集器将及时发现核心文件的篡改情况,并将信息发回取证机。对核心文件进行完整性校对可以采用多种方法实现,例如,采用MD5报文摘要算法对文件进行完整性校对。作者开发的信息采集器是在WIN32平台上实现的,所以采用有关的文件属性的API进行实现(这些函数已被封装在MFC的CFile类中)。随时,获取核心文件的信息,并与以前的相关信息比较,发现改动便将信息传回取证机。通过CPU时钟控制对核心文件的扫描时间。MFC实现如下:CString CScan:scan(CString filename)bool m_exist; CFileStatus status; CString msg=; if(CFile:GetStatus(LPCSTR)filename,status) /获取文件信息 CString at; at.Format(%d-%d-%d,%02d:%02d:%02d, status.m_atime.GetYear(), status.m_atime.GetMonth(), status.m_atime.GetDay(), status.m_atime.GetHour(), status.m_atime.GetMinute(), status.m_atime.GetSecond(); CString ct; ct.Format(%d-%d-%d,%02d:%02d:%02d, status.m_ctime.GetYear(), status.m_ctime.GetMonth(), status.m_ctime.GetDay(), status.m_ctime.GetHour(), status.m_ctime.GetMinute(), status.m_ctime.GetSecond(); CString mt; mt.Format(%d-%d-%d,%02d:%02d:%02d, status.m_mtime.GetYear(), status.m_mtime.GetMonth(), status.m_mtime.GetDay(), status.m_mtime.GetHour(), status.m_mtime.GetMinute(), status.m_mtime.GetSecond(); m_exist=false; CString tmp; tmp.Format(%d,status.m_size); for (int i=0;im_stack.size();i+) /进行信息比对 if (m_stacki.filename=filename) TRACE(name=%s,filename); m_exist=true; if (m_stacki.accesstime!=at)/访问时间比对 msg+=Accessed; m_stacki.accesstime=at; ; if (m_stacki.createtime!=ct) /生成时间比对 msg+=created; m_stacki.createtime=ct; ; if (m_stacki.modifytime!=mt) /修改时间比对 msg+=Modified; m_stacki.modifytime =mt; ; if (m_stacki.size!=status.m_size) /文件大小比对 msg+=resized; m_stacki.size =status.m_size; ; ; ; if (!m_exist) TRACE (not exist=%d,m_stack.size(); fileinfo aa; aa.accesstime =at; aa.createtime =ct; aa.modifytime =mt; aa.filename =filename; aa.size =status.m_size ; m_stack.push_back(aa); ; errMsg=msg; return msg; else/文件被删除 m_exist=false; for (int i=0;ifirst)=0)&(itr-second!=0)msg.Format(%s;%s;%sn,m_s.strMac,itr-first,stoped);sendmsg(msg);itr-second=0;return;if (m_th.IsExist(itr-first)!=0)&(itr-second=0)msg.Format(%s;%s;%sn,m_s.strMac,itr-first,start);sendmsg(msg);itr-second=1;return; ;msg.Format(%s%sn,m_s.strMac,exist); TRACE (%d,parse);sendmsg(msg);msg=;以下是CMythread片断void CMythread:snap()m_array.RemoveAll();HANDLE hwnd=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);PROCESSENTRY32 lppe;lppe.dwSize=sizeof(PROCESSENTRY32); bool isok=Process32First(hwnd,&lppe);while (isok)m_array.Add(lppe);lppe.dwSize=sizeof(PROCESSENTRY32);isok=Process32Next(hwnd,&lppe);int CMythread:IsExist(CString key)int con=0; CString cmp;for (int i=0;im_array.GetSize();i+)cmp=(CString)m_arrayi.szExeFile;cmp.MakeUpper();key.MakeUpper();if (cmp=key)con+; return con; 3.3采集器与取证机间的通讯采集器必须及时将所收集到的信息发回取证机,通讯上实现方式可采用SOCKET编程实现,通过流式套接字实现客户机和服务器的通讯。以下给出VC6下实现的部分源码:void CFilesysDlg:sendmsg(CString msg)/客户端消息发送/* if (m_socket!=NULL)closesocket(m_socket);m_socket=NULL;*/m_socket=socket(AF_INET,SOCK_STREAM,0);ASSERT(m_socket!=NULL);/CDialog:OnOK();SOCKADDR_IN m_addr;m_addr.sin_family=AF_INET;m_addr.sin_addr.S_un.S_addr=inet_addr(server_ip);m_addr.sin_port=htons(8080);int ret=0;ret=connect(m_socket,(LPSOCKADDR)&m_addr,sizeof(m_addr);if (ret=SOCKET_ERROR)CString strerr;strerr.Format(%d,WSAGetLastError();MessageBox(Connect Error!+strerr,NULL,0);return; ret=send(m_socket,msg.GetBuffer(0),msg.GetLength(),0);if (ret=SOCKET_ERROR)MessageBox(Send Failed!,NULL,0);closesocket(m_socket);/以下是服务器端信息接受的实现m_socket=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN m_addr;m_addr.sin_family=AF_INET;m_addr.sin_addr.S_un.S_addr=INADDR_ANY;m_addr.sin_port=htons(8080);int ret=0;int error=0;ret=bind(m_socket,(LPSOCKADDR)&m_addr,sizeof(m_addr);if (ret=SOCKET_ERROR)TRACE(Bind Error!);return 1;ret=listen(m_socket,SOMAXCONN);if (ret=SOCKET_ERROR)TRACE(Listen Error!);return 1;while(1)SOCKET s=accept(m_socket,NULL,NULL);if (s=SOCKET_ERROR)TRACE(Accept Error!);return 1;char buf255;/将接受的数据保存在缓冲区中for (int j=0;j255;j+) bufj=0;ret=recv(s,buf,255,0);注意在win32平台上套接字在使用前要进行初始化方法如下:WSADATA wsaData;WORD version=MAKEWORD(2,0);int ret=WSAStartup(version,&wsaData);同时,由于以上服务器端程序采用了阻塞工作方式,实现最好采用多线程模式,在程序中将以上部分放置在工作线程中。采用分布式组件结构将信息接收模块设计成远程组件,放置在取证机上,而信息采集器作为客户端对其进行调用,在调用过程中将信息传回。作者在WIN32平台上采用COM技术实现,经实验测定效果很好。组件技术的实现方案,有以下一些优点:COM构架中,服务器端对象无状态化的设计思想,缓解了服务器资源对系统的限制。COM中MQ(Message Queue)的概念与其的无状态对象缓冲池有效的减少了冗余资源的消耗,提高了服务器的使用效率。被取证机上只须安装COM代理即可实现通讯。因此,采用组建技术通讯与SOCKET编程相比资源占用较少,效率较高。组件的编写通过VC6.0的ATL模板实现,以下是源码片断:STDMETHODIMP CScan:log(BSTR strin, SHORT *ok)/该函数用于记录客户端发回的信息AFX_MANAGE_STATE(AfxGetStaticModuleState()/ TODO: Add your implementation code here/tt=CTime:GetCurrentTime();/t.Format(%d-%d-%d %02d:%02d:%02d,tt.GetYear(),tt.GetMonth
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论