本专利文件的公开内容部分包含受版权保护的材料。版权所有者不反对专利文件或专利公开的拓制,因为其出现在美国专利商标局专利文件或记录中,仅用于对本专利申请的申请过程的考虑,否则保留全部版权。
背景技术
在Microsoft Windows NT系统系统(即Windows 2000,XP,Vista,7,8,8.1及其服务器副本)上运行的防病毒软件(AV)的主要挑战之一是在打击威胁时需要访问操作系统(OS)的服务(如操作系统的内核模式功能和结构)。由于许多高级威胁(例如rootkit)损害或以其他方式篡改这些服务,所以AV通常在检测和/或消除这些威胁方面无效。
该问题的一个解决方案是使计算机脱机(通过关闭OS)并从受信任的环境扫描计算机的硬盘驱动器(HDD)。各种AV产品的设计旨在实现该方案,包括AVG Rescue CD,AviraAntiVir Rescue System和Kaspersky Rescue Disk。然而,这些实施方案中的每一个需要实质性的用户知识和涉及清理过程-配置可信环境,用户不仅必须从下载的ISO映像创建可启动光盘(CD)或从下载安装程序创建可启动通用串行总线(USB)磁盘,但也必须理解到足以通过计算机的基本输入/输出系统(BIOS)界面来修改计算机的启动顺序。鉴于不同的计算机制造商不同地实现其BIOS界面,后者对于典型的用户来说可能是相当具有挑战性的,因此不存在不同的计算机的用户可以执行的简单程序。实际上,用于进行被感染计算机的离线扫描和/或清理的常规方法可以包括以下方法:
1.识别在运行时无法移除的高级威胁(例如,抗性恶意软件)。
2.用户下载ISO映像或包括启动加载程序(即Syslinux)的安装程序,并创建可启动CD或USB存储设备。
3.用户关闭Windows OS。
4.计算机重新启动,其中央处理单元(CPU)从保护模式切换到实模式。
5.电脑运行开机自检(POST)。
6.用户进入BIOS并修改启动顺序,使计算机的CD-ROM或USB驱动器具有超过HDD的启动优先级。
7.从CD/USB设备加载启动加载程序(即Syslinux)并执行。
8.启动加载程序加载LinuxTM内核(即vmlinuz)和初始RAM磁盘(即initrd.lzm)。
9.CPU从实模式切换到保护模式,执行被传递给Linux内核。
10.Linux内核初始化,安装根文件系统,并显示用户界面(UI)。
11.用户指示计算机执行离线扫描(和清理任务),并在完成后重新启动计算机。
12.计算机重新启动并运行POST。
13.用户重新进入BIOS并将启动顺序恢复到先前的设置,使得HDD具有超过CD-ROM/USB驱动器的启动优先级(这避免了例如从相应的驱动器中忘记的CD或USB设备的后来非预期启动)。
14.Windows OS重新启动。
鉴于用户参与上述和其他类似的常规方法的过分需求,需要一种为计算机准备进行离线扫描和去除高级威胁的简单且用户友好的改进方法。
具体实施方式
根据本发明的实施方案,提供了准备用于计算设备(例如,运行基于WindowsTMNTTM的OS)脱机扫描和清理的新方法,一种有利的OS“切换”的方法。这种方法不需要附加的可移动媒体(如CD或USB存储设备)和/或修改存储在计算设备的HDD上的数据并减低了在准备计算设备的脱机扫描中用户参与和互动的需要(例如,对BIOS设置修改)。该方法可以提供用于在设备的HDD上进行离线扫描的所有必要的数据。
在现在过时的实模式操作系统中,包括MicrosoftTMDOSTM和Windows 3.X、95TM、98TM和METM,OS的“切换”相对简单,考虑到这些OS通过BIOS服务具有对物理硬件的完全控制,并通过无限制访问BIOS调用来提供对硬件的所有执行的程序控制。然而,现代操作系统,例如基于NT内核的Microsoft Windows系列(即Windows 2000TM,XPTM,VistaTM,7TM,8TM,8.1TM及其服务器副本)只能在系统启动的初始阶段(即操作系统启动的实模式阶段)短时间内使用BIOS调用。此后,这些操作系统将处理器切换或转换为保护模式,其中BIOS服务不可用,并且所有对硬件的访问都由操作系统的内核和相关驱动程序进行。例如,包括AVG RescueCD,Kaspersky Rescue Disk,Loadlin,coLinux和Kdump在内的常规产品和解决方案要么不适用于基于Windows NT的操作系统,要么不提供简单和用户友好的方式来准备计算机用于离线扫描和清理。
图1是根据本发明的一个实施方案的计算设备100和系统150的示意图,该系统150被配置为准备用于有限用户参与的设备离线扫描。计算设备100可以包括处理器102(例如,微处理器或其他数据处理设备)和存储器104(例如非易失性存储器如硬盘驱动器,易失性存储器,或两者)。根据其配置,计算设备100可以包括多个处理器和存储器。可以使用处理器102来运行操作系统,特别是基于Windows NT的OS,并且可以执行一个或多个软件应用程序。
如上所述,用于准备计算机(例如,运行基于Windows NT的OS)进行离线扫描的常规方法对于非精通的计算机用户来说难以沿循或执行。在本发明的优选实施方案中,系统150可以通过自动准备离线扫描用可信环境和消除对外部存储介质(例如,CD和USB设备)的需要以及对设备启动顺序设置修改的需要来减少用户参与的需要。例如,系统150可以(例如,当安装到计算设备100时)被配置为通过收集启动备用操作系统所需的信息(例如,使用BIOS服务),停止在所有处理器上的OS,并将模拟系统环境条件与在Windows OS的实模式阶段启动后通常存在的情况相符来切换基于Windows NT的OS以进行离线扫描。根据一个实施方案,系统150可以例如包括启动结构的安装包(以下称为ARLBoot结构)。该安装包可以包括可用于收集关于计算机系统设置的信息的用户模式实用程序(UMU)152,触发OS切换(从基于Windows NT的OS到诸如Linux OS的备用OS),并强制Windows OS关机。该软件包还可以包括配置为收集附加数据,将备用操作系统内核(例如,Linux内核)映射到存储器中,为内核配置系统环境,并启动内核的内核模式驱动程序(KMD)154。
系统150不应与使用处理器虚拟化的产品(例如coLinux)混淆,这些产品仅允许在同一计算设备上同时操作两个操作系统-这样的产品需要处理器支持,并且必须提前准备,即在用户打开电脑之前。
在某些实施方案中,UMU和KMD可以作为可下载包(即,来自因特网)提供,并且被配置为解包到计算设备的HDD。在一些实施方案中,UMU可以在解包包装后自动安装KMD,而无需用户交互。应当理解,UMU和KMD可以替代地作为单独的可下载部分提供。
图2是示出了使用ARLBoot准备用于计算设备离线扫描的示例性方法200的流程图。例如,方法200可以在ARLBoot下载到计算设备100上并由用户初始化之后(例如,当用户选择或激活包时,例如通过双击包文件),在基于Windows NT的OS正在设备上运行同时开始(在步骤202)。ARLBoot可以安装KMD(步骤204),收集数据并验证设备环境(步骤206),并将Linux内核映射到计算设备上的存储器(步骤208)。ARLBoot还可以通过注册的回调来启动OS的关闭(步骤210),并且在注册的回调中为Linux内核准备设备环境(步骤212)。在步骤214,ARLBoot可以将计算设备的控制转移或传递给Linux内核。然后,Linux内核可以启动和开始脱机扫描应用程序用于扫描和/或清理设备。
图3是示出了用于准备计算设备的离线扫描的详细示例性方法300的流程图。从OS“切换”的第一阶段开始,UMU可以收集在用户模式下可用的信息和/或参数(步骤302),包括Linux内核和初始RAM盘(例如,initrd)文件在计算设备的硬盘驱动器(例如,存储器104)上的定位,用于Linux内核的用户提供或默认命令行,提供给Linux内核的视频模式以及设备保留存储器的存储器映射[例如,使用系统提供的界面,例如通过Windows的应用程序编程接口(API)可用的SetupDiGetClassDevsEx、CM_Get_First_Log_Conf_Ex和/或CM_Get_Next_Res_Des_Ex]。
然后,UMU可以向KMD发出具有该信息的DeviceIO呼叫,并请求KMD发起启动LinuxOS(步骤304)。
在步骤306,KMD可以验证收集的信息和/或参数,并且可以收集附加信息,包括可用处理器的数量(例如,使用系统变量KeNumberProcessors),操作系统版本(例如,使用系统功能RtlGetVersion),系统存储器映射(例如,使用由系统功能RtlCmDecodeMemIoResource解码的系统注册表子项\Registry\Machine\HARDWARE\RESOURCEMAP\System Resources(系统资源)),存储在计算设备HDD上的Linux内核和RAM磁盘的路径和被Linux文件覆盖的存储器内容。
在步骤308,KMD可以解析Linux内核文件并确定保护模式入口点,例如通过读取位于文件偏移量0x01f1的结构setup_header。保护模式入口点的位置可以由setup_sects字段确定。随后可以使用setup_header结构来获取有关Linux内核的信息,并且可以作为在内核对计算设备给与控制时提供给Linux内核的启动参数的基础。
在步骤310,KMD可以读取Linux内核和RAM磁盘文件,并将它们映射到可用的非分页物理连续的存储器中,例如使用MmAllocateContiguousMemorySpecifyCache界面。这可以通过执行最大允许物理存储器地址和对齐要求(例如,setup_header结构的pref_address、initrd_addr_max和kernel_alignment项目)来实现。
如果在步骤310处物理上连续的存储器的分配失败(例如,由于低存储器条件或存储器碎片),则可以在步骤311确定存储器中的文件的目标物理地址。这可以使用由从UMU提供的设备保留的存储器映射和从注册表获取的系统注册表映射来进行。以这种方式,目标存储器区域不与任何物理设备保留的存储器和KMD使用的存储器重叠。然后,在步骤311a,文件可被读取到标准非分页存储器池。这可以包括检查和丢弃分配,使得分配的页面的物理地址不与目标存储器区域重叠。在某些实施方案中,该方法可另外包括重写存储器的规划,这涉及在步骤311b用文件(即,在步骤311a读取的文件)覆盖目标物理存储器。这可以刚好在切换操作系统之前发生。
在步骤312,KMD分配辅助数据结构,例如使用MmAllocateContiguousMemorySpecifyCache,使得这些结构属于可用的最低2千兆字节(GB)的物理存储器,并且不与目标存储器区域重叠(例如,在计划重写存储器的步骤311b的情况下)。这些数据结构可以包括Linux零页面,用于汇编代码执行OS切换的页面,页表项(PTE),Linux内核命令行,全局描述符表(GDT),中断描述符表(IDT)和用于计算设备的每个处理器的堆栈(Stack)。在某些实施方案中,这些数据结构中的一些可以包含静态数据(例如汇编代码,命令行等)。在这种情况下,也可以在步骤312适当地初始化这些特定结构。
在步骤314,KMD可以尝试访问Windows OS中可用的未记录的BIOS模拟器,例如使用系统提供的功能MmGetSystemRoutineAddress。模拟器界面可以包括x86BiosCall,x86BiosAllocateBuffer,x86BiosFreeBuffer,x86BiosReadMemory和x86BiosWriteMemory功能。如果模拟器可用并被初始化,则在步骤314a,KMD还可以使用模拟器来检索BIOS(例如,E820)存储器映射(例如,BIOS调用0x15)。此外,KMD可以使用模拟器来稍后将显示器的图形模式切换回文本模式(例如,BIOS调用0x10)。如果BIOS模拟器不可用,则可以使用在步骤306中获得的存储器映射(步骤314b)。
在步骤316,KMD可以填写Linux启动参数(例如,zero_page),例如使用在步骤308中获得的setup_header结构以及其他信息,包括视频模式参数(例如,预先设置或基于用户设置从BIOS模拟器调用0x10获得的),在步骤310中获得的存储器中的Linux内核和初始RAM盘的物理地址和大小,在步骤312中获得的存储器中的Linux内核命令行的地址以及在步骤314中获得的存储器映射。
在步骤318,KMD可以在Windows OS中注册最后机会关机通知,例如使用系统提供的功能IoRegisterLastChanceShutdownNotification,以便刚好在关闭系统之前调用其回调函数。
在步骤320,KMD可以从UMU完成DeviceIo呼叫,并且可以通知UMU关于第一阶段的状态(例如,成功或失败)。直到此时,系统没有进行任何修改,没有发生对系统稳定性的影响。
在步骤322,UMU可以启动计算机关机,例如使用系统提供的功能ExitWindowsEx。然后,关机可以继续进行到“最后机会关机通知”阶段(例如,在所有文件系统被刷新之后)。
在步骤324,可以调用在步骤318中注册的KMD的关机调度回调,其可以启动操作系统“切换”的第二阶段。
操作系统“切换”的第二阶段是刚好在计算机关闭之前(例如,恰好在ACPI呼叫之前)的状态。因此,在这个阶段,所有的用户进程已被终止,并且所有的数据已被刷新到HDD。这可能对可用的系统资源构成某些限制。在本发明的示例性实施方案中,KMD可以通过拥有提前分配的所有必要的资源来解决这个问题(例如,附加存储器可以在步骤314之后被分配,然后在步骤326中随后用适当的结构占据)。在步骤326,KMD可以准备新的控制结构以供处理器用于虚拟到物理存储器的转换(例如,分页)。可以为每个处理器架构定义这些结构(例如,x86、具有物理地址扩展的x86、x64等)。这些结构的格式是已知的,并在适当的处理器手册中有描述。可以在步骤312中分配的页面中创建控制结构,使得:最低2GB的存储器被翻译,使用大的(例如,4MB)页面,存储器被标记为读写和存在(例如,未分页到磁盘),虚拟与物理存储器的映射为1:1,因此存储器中任何字节的虚拟地址与其物理地址相同。
在步骤328,KMD可以将显示切换到文本模式。这可以使用BIOS模拟器(例如,BIOS调用0x10)(如果可用)或者通过直接写入到视频图形阵列(VGA)寄存器(例如,使用系统提供的例程WRITE_PORT_UCHAR)来实现。
在步骤330,KMD可以发出IPI呼叫(例如,使用系统提供的功能KeIpiGenericCall,其在Windows Server 2003TM和更高版本的Windows中可用),使得在该过程中后续步骤的相同代码在所有处理器上被执行。在早期版本的Windows(特别是Windows XP)上,实施类似的技术[例如使用发送到所有处理器的延迟过程调用,如通过KeInsertQueueDpc]。
在步骤332,KMD可以在每个处理器上执行以下操作:将IRQL升高到最大值(例如,KeRaiseIrql);禁止中断(例如,使用汇编指令CLI),通过写入CR3控制寄存器来切换页面表,使得最低2GB的存储器被映射1:1(例如,使用在步骤326中准备的控制结构);将全局描述符表(GDT)和中断描述符表(IDT)复制到在步骤312中分配的1:1映射的存储器区域中的新位置(例如,使用汇编指令SGDT/LGDT),使得它们不能被覆盖;并将堆栈切换到在步骤312中分配的新位置(例如,使用汇编指令MOV)。
在步骤334,KMD可以在除了处理器#0的所有处理器上执行以下操作(例如,处理器号可以由系统提供的功能KeGetCurrentProcessorNumber获得):将GDT和IDT切换到具有与在启动的第一阶段中Linux利用的那些相同的入口的最小表(例如,其可以包括采用在步骤332中使用的相同技术)并且跳转到位于步骤312中准备的辅助数据结构中的汇编代码。然后汇编代码可以:关闭分页(例如,清零CR0寄存器中的适当的位(bit));如果处理器是x64处理器架构,则将处理器切换到x86兼容模式(例如,通过使用RETFQ跳转到x86代码段);通过写入共享存储器位置来通知处理器#0;以及使用HLT指令停止处理器。在步骤334期间,KMD在处理器#0上等待所有其他处理器完成该步骤(例如,通过使用忙等待)。
如果在步骤310中物理连续存储器的分配失败并且计划进行重写目标物理存储器的附加步骤311b,则此时可以执行步骤311b,使得Linux内核映像和RAM盘被复制(从它们在步骤310被映射的位置)到它们在1:1空间中的目标地址,从而覆盖其中驻留的任何数据。在步骤336,KMD可以:将GDT和IDT切换到与在启动的第一阶段Linux利用的那些相同的入口的最小表(其可以包括采用在步骤332中使用的相同技术);关闭分页(例如,清除CR0寄存器中的适当的位);如果处理器是x64处理器架构,则将处理器切换到x86兼容模式(例如,通过使用RETFQ跳转到x86代码段);在切换到保护模式后,根据Linux内核的要求配置寄存器;并跳转到在步骤308中获得的保护模式内核入口点地址。
在步骤338,Linux内核可以自身解压缩,探测硬件并加载初始RAM磁盘。在步骤340,Linux内核可以从RAM磁盘启动初始化脚本(init脚本),这可以映射计算设备的HDD。这可能需要Linux内核使用与常规硬盘驱动控制器和磁盘相关联的驱动程序编译。
在映射磁盘之后,步骤340还可以包括利用初始化脚本来定位适当的安装文件夹(例如,ARLBoot安装文件夹),使用ext2文件系统定位包含准备好的磁盘映像的文件,并将根目录更改为这个文件。然后,标准Linux初始化进程可以启动以引发离线扫描用户界面(UI)。
应当理解,在方法200和300中所示的步骤仅仅是说明性的,并且可以修改或省略现有的步骤,可以添加附加步骤,并且可以改变某些步骤的顺序。
因此,本发明的实施方案有利地提供一个高效、方便的为运行保护模式的操作系统如基于Windows NT的操作系统的计算机准备脱机扫描的方法,消除了可移动介质如CD和USB设备的需要和用户修改计算机的BIOS设置的需要。
应当理解,前述主题可以体现为设备、系统、方法和/或计算机程序产品。因此,一些或全部主题内容可以体现在硬件和/或软件中(包括固件、常驻软件、微代码、状态机、门阵列等)。此外,所述主题可以在计算机可用或计算机可读存储介质上以计算机程序产品的形式出现,所述存储介质具有可通过指令执行系统或联合指令执行系统在介质中体现的计算机可用或计算机可读程序代码。计算机可用或计算机可读介质可以是可通过或联合指令执行系统、装置或设备容纳、存储、通信、传播或传输程序的任何介质。
计算机可用或计算机可读介质可以是例如电子、磁、光、电磁、红外或半导体系统、装置、设备或传播介质。计算机可读介质可以包括计算机存储介质和通信介质。
计算机存储介质包括用于存储诸如计算机可读指令、数据结构,程序模块或其他数据的信息的任何方法或技术中实现的易失性和非易失性、可移动和不可移动介质。计算机存储介质包括RAM、ROM、EEPROM、闪存或可用于存储信息并且可由指令执行系统访问的其它存储器技术。
通信介质通常体现为计算机可读指令,数据结构,程序模块或调制数据信号如载波或其他传输机制中的其他数据,并且包括任何信息传递介质(有线或无线)。调制数据信号可以被定义为具有以对信号中的信息进行编码的方式设置或改变的其一个或多个特征的信号。
当主题体现在计算机可执行指令的一般上下文中时,实施方案可以包括由一个或多个系统、计算机或其他设备执行的程序模块。通常,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等。通常,可以在各种实施方案中根据需要组合或分发程序模块的功能。
本领域普通技术人员将理解,本文中使用的术语“因特网”是指通过一组标准协议(例如TCP/IP和HTTP)链接在一起的计算机网络(公共和/或私有)的集合,形成全球分布式网络。虽然这个术语是指现在通常被称为互联网的内容,但它也旨在涵盖将来可能做出的变化,包括对现有协议的改变和添加。
因此,可以看出,有效地实现了上述目的,尤其在上述描述和附图中显而易见的上述目,并且由于实施上述方法以及关于系统所述的构造中在不脱离本发明的精神和范围的情况下可以做出某些变化,因此意欲包含在上述说明中并且附图中所示的所有内容应被解释为示例性的而不是限制性的。
还应当理解,所附权利要求旨在覆盖本文所描述的本发明的所有通用和具体特征以及在语言上可能落入本发明的范围的所有陈述。