APP下载

基于VMM的Windows文件系统监控

2016-08-05李清宝冯培钧周登元

计算机应用与软件 2016年7期
关键词:页表调用原型

张 擂 李清宝 冯培钧 周登元

(解放军信息工程大学 河南 郑州 450000) (数学工程与先进计算国家重点实验室 河南 郑州 450000)



基于VMM的Windows文件系统监控

张擂李清宝冯培钧周登元

(解放军信息工程大学河南 郑州 450000) (数学工程与先进计算国家重点实验室河南 郑州 450000)

摘要文件系统监控是文件保护的基础。针对现有文件系统监控容易被恶意软件破坏的问题,提出一种基于VMM的Windows文件系统监控方法。该方法利用硬件虚拟化技术,通过监控系统调用监控文件系统操作,且监控手段对客户系统透明,保证实施的监控安全可信。最后设计并实现了相应的原型系统,同时对原型系统的监控效果和时间开销进行测试。实验结果表明,原型系统能够监控常见的Windows文件系统操作,并且时间开销在可接受的范围内。

关键词文件系统监控VMM文件保护

0引言

文件在操作系统的各类功能中都充当着十分重要的角色,如可执行文件决定着系统行为;文档文件保存着用户信息;配置文件决定着系统状态。攻击者常将文件作为攻击目标或攻击文件以辅助进行其他攻击,如篡改可执行文件以实现对系统的控制;篡改配置文件从而关闭系统的保护功能;篡改文档文件来影响用户决策等。文件保护是保护计算机系统的必要功能,系统内的文件通过文件系统管理,故文件系统监控更是文件保护的基础。

近几年,针对文件的攻击呈增长趋势,造成了严重的经济损失和信任危机,给企业运行和公众生活造成了重大影响。文件保护的严峻形势表明传统文件系统监控[1-3]不足以应对最新的威胁。传统文件系统监控大多使用API HOOK[1]、SSDT HOOK[1]、文件系统过滤驱动[2]和文件系统微过滤驱动[3]实现,这些监控方法和攻击手段位于同一特权级或更低特权级,导致攻击者可以绕过或破坏对文件系统实施的监控。虚拟机监控器VMM(Virtual Machine Monitor)位于客户操作系统和硬件之间,相对客户操作系统拥有更高的特权,故基于VMM的监控文件系统是解决现有威胁的一个重要思路。传统基于软件实现的VMM性能开销太大,但较新的CPU都提供了对硬件虚拟化的支持,硬件虚拟化技术能够使VMM的性能开销大幅降低。本文利用Intel系列CPU提供的硬件虚拟化机制,基于开源项目NewBluePill,实现无法被用户层或内核层中的恶意软件破坏的Windows文件系统监控。

1硬件虚拟化技术与NewBluePill

硬件虚拟化技术主要有Intel-VT和AMD-V两种,这两种技术的设计原则类似。本文基于Intel-VT技术。VT技术引入新的指令和运行模式,VMM位于VMX root模式,客户系统位于VMX non-root模式。两种模式的转换过程如图1所示,VMXON指令和VMXOFF指令分别用于开启和关闭VMM。开启VMM后,VMM通过VMLAUNCH启动客户系统。在客户系统的运行过程中,当执行到某些指令或遇到某些事件时,触发#VMEXIT事件从而陷入VMM,位于root模式的VMM获得控制。VMM执行对陷入事件的处理后,通过VMRESUME指令恢复客户系统的执行。

图1 VT技术模式转换过程

触发#VMEXIT事件的指令和事件分为无条件和有条件两类。无条件触发包括如CPUID、GETSEC等指令,执行这些指令会立刻陷入VMM,此时触发#VMEXIT事件的指令并没有执行,系统状态为该指令执行前的状态。其他触发#VMEXIT事件的指令和所有触发#VMEXIT事件的事件都属于有条件陷入,拦截这些指令和事件需要对虚拟机控制结构VMCS(Virtual-Machine Control Structure)进行相应的配置。基于VT技术实现VMM时,会有一个事件分发函数作为#VMEXIT事件处理的入口,VMCS中的VM_EXIT_REASON成员保存每次触发#VMEXIT事件的原因。

Intel-VT技术经过多年的发展已经历了几个版本,从VT-X起引入了新的地址翻译机制扩展页表EPT(Extended Page Table)。该机制在原有虚拟地址到物理地址的翻译机制之上增加一层新的地址翻译机制,开启EPT机制之后,原有的物理地址变成客户物理地址,客户物理地址和物理内存不再对应,客户物理地址需要由VMM利用EPT机制翻译成主机物理地址,主机物理地址可以用于访问物理内存。EPT的地址翻译过程和数据结构与虚拟内存机制类似,EPT的顶级页表地址保存在VMCS中。

NewBluePill项目诞生于2007年,由Invisible Things Lab开发,现在对外公开的版本是NBP-0.32-public版本。该项目能够在系统运行过程中动态加载和卸载,并且使用自己的页表,在操作系统中无法看到NewBluePill占用的内存。最重要的是NewBluePill仅支持一个客户VM,不包含VM间同步、IO虚拟化等不需要的功能,适合对单个系统进行监控。NewBluePill同时支持Intel-VT和AMD-V两种虚拟化技术,本文基于Intel-VT技术。VT技术下,NewBluePill定义的#VMEXIT事件处理入口函数为VmxVmexitHandler,该函数负责客户系统现场的保存与恢复,并调用下一级处理函数HvmEventCallback。HvmEventCallback调用VmxDispatchEvent,然后根据VM_EXIT_REASON调用相应的事件处理函数。

2基于VMM的文件系统监控

监控文件系统的关键是监控各种文件系统操作,通过对Windows文件的系统分析,总结出常用的文件系统操作包括:新建文件、新建目录、删除文件、删除目录、重命名文件、重命名目录、打开文件、关闭文件、读文件、写文件、修改文件属性、修改目录属性。本文通过对这些常用文件系统操作进行全面监控,保证对文件系统进行监控的全面性。

2.1文件系统操作监控

在VMM中监控文件系统操作,需要文件系统操作触发#VMEXIT事件从而陷入VMM。但是Intel-VT技术没有提供使文件系统操作陷入VMM的机制,所以需要使用虚拟机内省VMI(Virtual Machine Introspection)技术使文件系统操作陷入VMM。通过对上述文件系统操作进行调试跟踪,结果表明上述操作都通过系统调用实现其功能,如表1所示。

表1 文件系统操作和系统调用对应关系

从表1可以看出,重命名等多个文件系统操作都通过NtSetInformationFile系统调用实现。在截获到系统调用NtSetInformationFile后,需要进一步分析此次拦截的系统调用所对应的文件系统操作。调试分析的结果表明该系统调用的第三个参数可以用来区分不同的文件系统操作。所以只要实现了基于VMM的监控系统调用,就可以基于VMM分别监控上述文件系统操作。

2.2基于VMM的系统调用监控

系统调用是处理器提供的在用户模式调用内核模式功能的机制,较新的Intel处理器同时支持三种系统调用机制,Windows操作系统在不同的处理器模式使用不同的系统调用机制,本文对这三种机制都进行监控。

2.2.1基于中断处理的系统调用

最早的系统调用通过软中断的方式实现,在中断向量表的第0x80项保存系统调用入口函数,应用层的代码通过INT 80H指令执行系统调用。

文献[6]重写中断描述符表中的中断处理函数指针,使其指向未分配物理内存的虚拟地址。当执行系统调用时会发生缺页PF(Page Fault)异常,对VMCS进行正确的配置可以导致PF异常陷入VMM,随后在VMM中判断导致PF异常的指令是否为INT 80H,从而实现监控INT 80H方式的系统调用。这种监控方式存在一大不足,即位于内核层的攻击者可以发现0x80项中断服务的处理函数指针并非指向中断服务处理函数,从而发现VMM的存在,攻击者进而可以将其改回原值或改为恶意函数。文献[5]修改IDTR中的IDT表大小,导致通过INT方式触发超过最大值的中断时产生通常保护GP(general protection)异常。由于要监控0x80号中断,所以可以设置的IDTR最大值为0x7F。这种监控方式有两个不足:首先这种方式使得大于0x7F的INT中断都陷入VMM,而陷入VMM是一个开销十分大的操作,这导致了大量无关时间开销;其次这种方式也对客户操作系统非透明,位于内核的攻击者可以发现IDTR的大小存在异常,并可以方便地将其改回0xFF。文献[4]将中断处理函数的入口指令改为VMMCALL指令,从而使INT 80H中断陷入VMM。这种方法同样存在对客户系统不透明的问题,攻击者可以发现保护所做的修改并可以破坏实施的保护。文献[8]仿照文献[6]的思路,通过影子页表保证监控的透明性。文献[8]不直接修改IDT中服务函数的地址,而是修改服务函数地址在影子页表中的表项,通过第二级地址翻译过程将其指向一个非法地址,从而引发PF异常。位于内核层的攻击者通过读IDT表中的表项只能得到合法的处理函数地址,所以无法发现监控的存在。

考虑上述监控方法存在的时间开销和透明性问题,本文借鉴文献[8]的研究,使用EPT页表代替影子页表来实现第二级地址翻译。首先修改NewBluePill的初始化函数,为EPT页表分配空间,并在客户物理地址和主机物理地址间建立映射关系,此时建立的映射关系使客户物理地址A映射到同一主机物理地址A。然后修改EPT页表中0x80项中断处理函数地址的页表项,将其改为不存在物理内存的主机物理地址。最后修改NewBluePill的VMCS初始化函数,在其中开启EPT机制,并配置好顶级EPT页目录。相比文献[8]的研究,使用硬件提供的EPT机制有更好的时间效率。

2.2.2SYSENTER快速系统调用

SYSENTER是Intel系列CPU提供的快速系统调用机制,它借助模式专用寄存器MSR(Model Specific Register)省去系统调用过程中的权限检查和内存访问操作,减少了系统调用的时间开销。使用SYSENTER指令发起系统调用时,RIP的值来自于IA32_SYSENTER_EIP,RSP的值来自于IA32_SYSENTER_ESP,CS的段选择子来自于IA32_SYSENTER_CS的0到15位,SS的段选择子为CS的段选择子加8,并且CS和SS寄存器的不可见部分不由段描述符表获得,而由硬编码直接赋值。

文献[4]利用无条件陷入VMM的VMMCALL指令,将IA32_SYSENTER_EIP所指地址处的指令改为VMMCALL指令,使攻击者通过SYSENTER指令进入内核时立刻陷入VMM。但这种方法存在对客户系统不透明的问题,攻击者可以发现监控功能对系统的修改并可以进一步破坏实施的监控。文献[7]重写MSR寄存器IA32_SYSENTER_EIP的内容,将其改为一个未分配物理内存的虚拟地址。当系统执行SYSENTER指令时会引起PF异常,通过配置VMCS可以使PF异常陷入VMM。在VMM对PF异常的处理过程中判断引发PF异常的指令是否为SYSENTER,实现对SYSENTER的监控。文献[5]修改IA32_SYSENTER_CS为全0,使SYSENTER指令产生GP异常,然后在VMM中监控GP异常。根据Intel指令手册,SYSENTER指令产生GP异常时指令的其他功能都没有执行,所以需要在VMM中修改客户机状态来模拟SYSENTER指令的全部功能。这种方法同样影响SYSRET指令,所以需要在陷入VMM之后根据触发#VMEXIT事件的指令来进一步区分,并且对SYSRET指令的功能进行模拟。

文献[7]和文献[5]都通过修改MSR寄存器实现,但是文献[7]截获的是PF异常,PF异常在系统中出现频率很高,导致系统陷入VMM的频率很高,对系统影响很大。文献[5]截获的是GP异常,该异常在系统正常运行的过程中几乎不会出现,陷入VMM的频率非常低,所以本文参考文献[5]的方法监控通过SYSENTER指令的系统调用。

本文首先修改NewBluePill初始化VMCS的过程,修改其中对异常位图的初始化,使GP异常触发VMEXIT事件。然后在NewBluePill中注册处理因异常所触发VMEXIT事件的事件处理函数,并在该函数中模拟SYSENTER和SYSRET指令的功能。最后修改NewBluePill的初始化函数,在初始化工作的末尾对IA32_SYSENTER_CS进行修改,将其改为全0。SYSENTER通过内部电路获得MSR内容而不是RDMSR指令,所以本文在VMM中对RDMSR指令进行监控。如果读取的MSR是被修改的,则返回原来的正确值,这样可以在不影响SYSENTER指令的同时保证客户系统无法发现MSR寄存器被修改,实现透明监控。

2.2.3SYSCALL快速系统调用

SYSCALL也是Intel系列CPU提供的快速系统调用机制,但它只支持64位模式,64位Windows操作系统在切换到64位模式后都使用该系统调用机制。由于它仅支持64位模式,所以它相对于SYSENTER还省去了CPU模式检查的功能。此外,SYSCALL不修改RSP,需要进入内核后系统调用处理函数负责切换RSP。使用SYSCALL指令发起系统调用时,RIP的值来自于IA32_LSTAR, CS的段选择子来自于IA32_STAR的32到47位,SS的段选择子为CS的段选择子加8,并且CS和SS寄存器的不可见部分也不由段描述符表获得,而是由硬编码直接赋值。

文献[4]将IA32_LSTAR处的指令改为VMALL指令,从而使攻击者通过SYSCALL指令进入内核时陷入VMM。但这种方法存在对客户系统不透明的问题,攻击者可以发现所做的修改并可以破坏实施的监控。文献[6]通过修改IA32_LSTAR为未分配物理内存的虚拟地址,当系统执行SYSCALL指令时会引起PF异常,通过配置VMCS可以使该异常陷入VMM。文献[5]修改IA32_EFER的SCE位为0,使系统不支持SYSCALL和SYSEXIT指令,导致通过SYSCALL指令执行系统调用时会产生未定义指令UD(Undefined Instruction)异常,通过配置VMCS可以使UD异常陷入VMM。

文献[6]和文献[5]的方法都通过修改MSR实现,但文献[6]的方法拦截的是PF异常。根据前文的分析可知,这种方法陷入VMM太频繁,对系统性能影响太大。文献[5]的方法只影响SYSCALL和SYSEXIT两条指令,没有不必要的陷入,故本文采用文献[5]的方法监控通过SYSCALL机制的系统调用。

由于UD异常产生于SYSCALL和SYSEXIT功能的最初阶段,所以产生UD异常时指令的其他功能都没有执行,需要在VMM中对SYSCALL和SYSEXIT指令的功能进行模拟。本文首先修改NewBluePill初始化VMCS的过程,修改其中对异常位图的初始化,使UD异常触发VMEXIT事件。然后在NewBluePill中注册处理因异常所触发VMEXIT事件的事件处理函数,并在该函数中模拟SYSCALL和SYSEXIT指令的功能。最后修改NewBluePill的初始化函数,在初始化工作的末尾修改IA32_EFER的SCE位为0。由于该方法也通过修改MSR实现,破坏了监控的透明性,故采用同SYSENTER快速系统调用相同的处理方法保证监控的透明性。

2.3系统调用参数解析

实现了基于VMM监控系统调用,也就实现了基于VMM监控文件系统操作,从而实现了基于VMM监控文件系统。但是监控文件系统的目的是保护文件,由于系统内的不同文件往往有不同的保护需求,所以需要在监控到文件系统操作对应的系统调用后解析出此次操作的文件路径。根据解析文件路径的方式可以将上述系统调用分为两类:一类参数中包含操作对象的完整路径,一类参数中包含操作对象的文件句柄。

NtCreateFile、NtOpenFile和NtDeleteFile都包含一个类型为POBJECT_ATTRIBUTES的参数,它是一个指针类型,指向一个OBJECT_ATTRIBUTES类型的对象。该对象的第三个成员ObjectName为指向一个UNICODE_STRING对象的指针,该UNICODE_STRING对象中的第三个参数指向的UNICODE字符串就是完整文件路径。解析过程中需要注意两点:一是在64位Windows系统中指针按照8字节对齐存放,UNICODE_STRING结构的前两个参数为双字节长度,所以第二个参数之后空四个字节才是第三个参数的内容;二是64位Windows系统默认通过RCX、RDX、R8、R9传递前四个参数,但通过SYSCALL指令刚进入内核的系统调用分发函数时,第三个参数不在R8中而在R10中,系统调用分发函数负责将R10中的参数移动到R8中,所以在监控到SYSCALL系统调用时应该在R10中获得所需要的参数。其过程如图2所示。

NtReadFile、NtReadFileScatter、NtClose、NtWriteFile、NtWriteFileGather和NtSetInformationFile通过参数中的文件句柄确定操作的文件。截获到这些系统调用后,需要通过文件句柄获得对应的文件完整路径。本文利用Windows提供的函数通过句柄获得文件路径,首先使用ObReferenceObjectByHandle函数获得句柄对应的文件对象,然后使用IoQueryFileDosDeviceName获得文件的完整路径,其过程如图3所示。

图2 第一类参数解析过程  图3 第二类参数解析过程

3性能分析

3.1原型系统

本文的实验环境是Window 7 SP1 X64系统。为了对文件系统监控的效果和开销进行测试,本文实现了一个文件系统监控原型系统,原型系统架构如图4所示。

图4 测试系统架构

系统调用监控模块使用上文描述的监控方法对系统调用进行监控,文件系统操作执行系统调用时陷入VMM。VMM中的系统调用监控模块截获到文件系统操作对应的系统调用后,调用文件路径解析模块解析出此次操作文件的路径,进一步可以根据文件路径决定是继续执行文件系统操作还是阻止文件系统操作直接返回错误。

3.2文件系统监控效果测试

3.2.1监控有效性测试

本节对原型系统监控文件系统的有效性进行测试,测试原型系统是否能够监控到上文列出的文件系统操作。

首先测试针对文件的文件系统操作。本文在原型系统的系统调用监控模块中实现对文件操作的各种监控,使之阻止对文件的各类文件系统操作。测试结果如表2所示。

表2 监控针对文件的文件系统操作效果

从测试结果可以看出,原型系统对上文列出的文件系统操作都成功实施了监控,并可以根据需要阻止针对特定文件的操作。接下来测试目录下的文件系统操作,采用上述相同的测试方法,阻止目录下的各类文件系统操作。测试结果如表3所示。

表3 监控目录下的文件系统操作效果

从测试结果可以看出,原型系统对上文列出的目录下的文件系统操作都成功实施了监控,并可以根据需要阻止特定目录下的文件系统操作。

3.2.2监控透明性测试

本节对监控的透明性进行测试,测试原型系统是否对客户系统透明。原型系统主要修改两个位置:一是EPT页表,二是MSR寄存器。

EPT页表位于VMM中。本文借鉴NewBluePill的思想。NewBluePill使用两个页表,一个客户系统使用一个VMM使用,修改客户系统的页表项将VMM使用的虚拟地址都重定向到无关物理地址,从而使客户系统无法访问VMM的内容。本文使用EPT机制,但采用同样的思想使VMM的内容对客户系统透明。由于客户系统无法访问EPT内容,所以客户系统无法得知80H号中断处理函数的地址未分配物理内存。

Intel处理器规定系统只能通过RDMSR指令获得MSR内容。透明性测试以IA32_EFER为例,监控SYSCALL指令需要修改它。开启原型系统前,使用RDMSR指令获得IA32_EFER的内容为0xd01。开启原型系统后,使用WRMSR指令将IA32_EFER内容改为0xd00,但通过RDMSR指令在客户系统中获得IA32_EFER的内容还是0xd01,在VMM中已可以监控到由SYSCALL指令产生的UD异常。

3.3时间开销测试

本节对监控的时间开销进行测试。测试时间开销时文件系统监控模块不阻止任何操作,即测试正常处理的时间开销。考虑到系统运行的时间可能会被许多情况影响,本文对每个测试项测量10次取平均值。

首先对INT 80H、SYSETER、SYSRET、SYSCALL和SYSEXIT这五条陷入VMM的指令进行单独测试,测试分为对文件系统相关系统调用和文件系统无关系统调用进行。对文件系统无关系统调用的测试结果如表4所示。

表4 对于文件系统无关系统调用,陷入

从测试结果可以看出,对文件系统无关的系统调用,原型系统为系统调用相关的指令引入了10倍左右的时间开销。引入这么多时间开销主要是因为陷入VMM本身就是一件时间开销很大的事件。但这仅为陷入指令的开销,若考虑整个系统调用过程,这些时间开销就微不足道了。例如COPYFILE命令的执行时间为47 100 μs,系统调用指令增加的时间不到其十分之一。对文件系统相关系统调用的测试结果如表5所示。

表5 对于文件系统相关系统调用,陷入

陷入VMM后,根据解析参数的方式不同执行的时间会有不同,以上以NtOpenFile和NtReadFile测试为例。这两个系统调用分别代表两类不同的参数解析方式,其中NtOpenFile的参数中包含路径,NtReadFile的参数中仅包含文件句柄。从测试数据可以看出,NtOpenFile引入最高17倍的时间开销,NtReadFile引入最高35倍的时间开销,这主要是因为依据句柄解析路径需要消耗更多的时间。并且从数据中可以看出,根据句柄解析路径的时间相比从参数中直接获得路径增加的绝对时间为1500 μs左右。从数据可知,该方法为引起陷入的指令引入了大量的时间开销,但考虑整个文件系统操作处理过程,引入的开销影响就弱化了,如表6所示。

表6 文件系统操作时间开销测试结果   单位:μs

上述数据以通过SYSCALL指令的系统调用机制为基础。从测试数据可以看出,对于整个文件系统操作处理过程,原型系统增加的相对时间开销都在可以接受的范围内。从数据中还发现,对于文件系统操作,原型系统增加的绝对时间开销大于陷入指令增加的绝对时间开销,这是由于一个文件系统操作往往涉及多个系统调用,会多次陷入VMM。

4结语

本文在分析硬件虚拟化机制和Windows文件系统的基础上,利用虚拟机内省技术,提出了一个基于VMM的Windows文件系统监控方法。最后实现了一个文件系统监控原型系统,并对原型系统的保护效果和时间开销进行测试和分析。利用上文提出的方法可以在VMM中对常用文件系统操作进行监控,但对存在快捷方式、文件链接的情况需要进一步研究。

参考文献

[1] 张连成.主机主动入侵防御系统的研究与实现[D].解放军信息工程大学,2007.

[2] 范学斌.一种新型文件安全控制系统模型[D].解放军信息工程大学,2012.

[3] 张立建.Windows内核关键技术研究及其在内网安全中的应用[D].北京邮电大学,2013.

[4] Belay A,Bittau A,Mashtizadeh A J,et al.Dune:Safe User-level Access to Privileged CPU Features[C].OSDI,2012.2012:335-348.

[5] Pfoh J,Schneider C,Eckert C.Nitro:Hardware-based system call tracing for virtual machines[M].Advances in Information and Computer Security,Springer,2011:96-112.

[6] 李博,李建欣,胡春明,等.基于VMM层系统调用分析的软件完整性验证[J].计算机研究与发展,2011,48(8):1438-1446.

[7] Dinaburg A,Royal P,Sharif M,et al.Ether:malware analysis via hardware virtualization extensions[C]//Proceedings of the 15th ACM conference on Computer and communications security,2008.ACM,2008:51-62.

[8] 彭华,周安民,刘亮,等.基于虚拟机架构的文件系统监控[J].信息安全与通信保密,2012(7):108-110.

[9] 王晓娣.基于虚拟机架构的恶意行为跟踪系统[D].华中科技大学,2013.

收稿日期:2015-03-01。国家核高基科技重大专项(2013JH00103-04);信息工程大学未来基金项目(1201);数学工程与先进计算国家重点实验室开放课题(2013A11)。张擂,硕士生,主研领域:信息安全与可信计算。李清宝,教授。冯培钧,硕士生。周登元,硕士生。

中图分类号TP309

文献标识码A

DOI:10.3969/j.issn.1000-386x.2016.07.067

WINDOWS FILE SYSTEM MONITORING BASED ON VMM

Zhang LeiLi QingbaoFeng PeijunZhou Dengyuan

(PLAInformationEngineeringUniversity,Zhengzhou450000,Henan,China) (StateKeyLaboratoryofMathematicalEngineeringandAdvancedComputing,Zhengzhou450000,Henan,China)

AbstractFile system monitoring is the foundation of file protection. In view of the problem that existing file system monitoring is easily destroyed by malware, this paper puts forward a VMM-based method to monitor Windows file system. The method uses hardware virtualisation technology and monitors the file system operation through monitoring system call. The implemented monitoring is guaranteed to be secure and trusted because it is transparent to clients. Corresponding prototype system is designed and implemented, at the same time the monitoring effect and time overhead of the prototype system are tested. Experimental results show that the prototype system can monitor the operations of common Windows file system, and the time overhead is within the acceptable range.

KeywordsFile system monitoringVirtual machine monitor (VMM)File protection

猜你喜欢

页表调用原型
更正
作者更正
包裹的一切
勘 误
核电项目物项调用管理的应用研究
更正
LabWindows/CVI下基于ActiveX技术的Excel调用
《哈姆雷特》的《圣经》叙事原型考证
基于系统调用的恶意软件检测技术研究
论《西藏隐秘岁月》的原型复现