1、2023 年第 10 期132计算机应用信息技术与信息化基于虚拟化平台的隐藏进程检测技术陈立娜1 季保启1CHEN Lina JI Baoqi 摘要 传统的安全服务模式,一般将自己的安全服务实体置于用户的操作内部,这样会产生巨大的资源开销和浪费。针对上述问题,设计了一种基于虚拟化技术的无代理隐藏进程检测技术。在分析 Windows 操作系统内部进程和线程调度机制的基础上,利用 VMM(虚拟机监视器)中的 VM(虚拟机透视图)技术获取和分析进程,识别隐藏进程。该技术将服务器实体设置在受保护操作系统之外,在受保护操作系统内部没有插件和代理进程,克服了传统安全服务的缺点。实验证明,所提出的方法可以有
2、效检测出几乎所有类型的 Rootkit 隐藏的进程,既节省了计算资源,又提高了安全性。关键词 无代理技术;虚拟化技术;隐藏进程检测;虚拟机监视器;调度机制 doi:10.3969/j.issn.1672-9528.2023.10.0281.菏泽家政职业学院 山东菏泽 2740000 引言随着互联网技术的飞速发展,信息安全问题逐渐成为人们关注的重点。恶意代码为了保护自己的进程不被 Windows系统自带的任务管理器发现,采用进程隐藏技术躲避安全软件和系统进程管理器的检测。而当前随着云计算技术的飞速发展,虚拟化技术的广泛使用,如何保护虚拟机信息安全,及时检测出虚拟机内部的隐藏进程,成为反病毒工作者
3、的一个重要任务。由于虚拟机检测器具有全局视角和良好的数据隔离性,许多学者提出了一些解决方案。文献 1 利用虚拟化技术从客户虚拟机外部截获虚拟机内系统调用,并应用系统调用关联技术将系统内的系统调用相互关联,以实现对客户虚拟机内部系统调用的监控。文献 2 利用内存虚拟化技术,确保只有被修改过的代码可以在内核态运行,来保证内核的完整性,以达到防御代码注入的攻击。文献 3 提出了一个VMM-based 模型来检测和预防所有内核完整性破坏的攻击,并为策略的指定与执行设计了一个访问控制模式用来保证客户操作系统的完整性。文献 4 调用门技术,直接操作内核对象,通过修改内核进程表的方式隐藏进程。文献 5 通过
4、改进Rootkit检测技术,提出了基于物理内存扫描的检测思路。在前人研究的基础上,本文分析了 Windows 内核的数据结构、进程和线程的调度机制,并基于 VMware 平台,在Windows XP sp2 操作系统虚拟机上进行了实验,实现了无代理的隐藏进程检测技术。1 隐藏过程的机制当前主要的进程隐藏的方法纷繁复杂,给隐藏进程的检测带来困难,总体上隐藏进程的方法可以分为四类。第一类,API HOOK 类型 Root_kit,挂钩系统调用6-7。在用户模式下,用户的程序为了完成工作有时会调用 Wind32 API 和 Native API,有些 Root_kit 可以对这些 API 进行拦截,
5、并且插入自己的恶意代码。一种方法是修改 PE 文件导入表(import address table,IAT),一个文件的 IAT 中保存的是该文件在运行时需要的调用的所有链接库,以及链接库中需要调用的所有库函数。文件运行时会通过读取 IAT 的保存信息来调用自己的函数,而 Root_kit 将 IAT 的内容进行修改使得文件在运行时,会调用自己的恶意代码。另一种方法为 inline hook,其做法是将拦截到的函数进行修改,函数代码内容的前一段修改为无条件跳转指令 JMP,跳转到自己恶意代码的位置,然后使得自己恶意代码执行结束后再跳转回被拦截函数被修改的部分,进而使得原函数功能完整完成,又运行
6、自己的恶意代码。第二类,直接内核对象操作技术(direct kernel object manipulation,DKOM)类型 Root_kit8-9。Windows 通过创建内核对象来实现对系统内进程的表示与管理,DKOM 类的Root_kit 可以对自己的内核对象的内容进行修改,使得自己的内核对象 EPROCESS 从链表上消失。这样,系统在调用ntquerysysteminformation 时就无法返回该进程的有关信息。第三类,系统服务描述符表(system service descriptor table,SSDT)挂钩类型 Root_kit10。SSDT 保存着所有系统服务函数的
7、入口地址,系统服务调度程序会通过读取 SSDT查找系统服务函数的入口地址,此类 Root_kit 可以通过修改SSDT 的内容将入口地址替换为自己恶意代码的入口地址,再由恶意代码调用真正的系统服务函数,最后劫持 zwquery-2023 年第 10 期133计算机应用信息技术与信息化systeminformation 或 ntquerysysteminformation 函数,抹去自己进程的信息。第四类,远程线程注入动态链接库(dynamic link li-brary,DLL)类型 Root_kit11。其核心思想是将 DLL 注入到正在运行的进程当中,作为该进程的一部分来执行,DLL 是由
8、功能函数组成的文件,不会独立运行,进而进程列表中并不会出现 DLL。首先使用 writeorocessmemory 函数将 DLL写入内存,再调用 createremotethread 函数在远程进程中创建一个线程执行写入内存的 DLL,这样来实现进程的隐藏。以上描写的隐藏进程的方法,都避免不了一个事实,无论是进程本身信息被从系统 API 返回的结果中删除,还是进程的执行路径发生了变化,或者进程本身的 EPROCESS 内核对象从链表中消失,其自身内核变量都并未消失。2 隐藏进程检测方法本文中,基于 VMware 平台实现了 Windows/XP sp2 操作系统单核模式且非物理地址扩展方式下
9、的隐藏进程检测,由于需要从客户虚拟机中探测数据,借助了 VMware 提供的工具 Vprobe 实现了无插件透视虚拟机的目的。其核心思想是遍历 Windows 的分发数据库,找出系统中所有的线程,反推线程所属进程,找出系统所有存在的进程。利用此方法,以上描述的前三类隐藏进程都可以十分有效地被检测出,而对于远程线程注入 DLL 类型 Root_kit 隐藏的 DLL 不能够有效辨认,但是仍然可以检测并收集到其进程的有效信息,为第三方软件或者其他识别恶意代码的软件和程序提供支持。隐藏进程检测功能共分五个阶段。第一阶段,探寻ntoskrnl.exe 基 地 址。第 二 阶 段,获 取 psiniti
10、al system pro-cess 内核变量相对偏移量并读取其数值。第三阶段,遍历EPROCSS 链表并记录链表上进程信息。第四阶段,遍历分发数据库,重构系统进程信息。第五阶段,报告收集与结果分析,交叉对比两次结果,识别隐藏进程。接下来对各阶段分别进行详细的描述。2.1 探寻 ntoskrnl.exe 加载基地址经研究发现,系统处在系统地址空间和用户地址空间两种状态下,需不同的流程寻找 ntoskrnl.exe 的虚拟机地址。Ring0(系统地址空间)状态下,由 GDT 的 0 x30 段基地址为入口,经过 KPCR 和 DBGKD_GET_VERSION64 结构,找到PsLoadedMo
11、duleList 结构,该结构与核模块的 _LDR_DATA_TABLE_ENTRY 结构形成了双向链表,最后通过遍历此双向链表可以获取 ntoskrnl.exe 数据结构 _LDR_DATA_TABLE_ENTRY 的基地址,最后从该结构中读取 ntoskrnl.exe 的加载地址。在 ring3(用户地址空间)状态下,流程稍有不同,如图 1 所示。这种情况下无须遍历内核模块数据结构的双向链表,ntoskrnl.exe 作为首个被加载的内核模块,_LDR_DATA_TABLE_ENTRY 结构的 ininitializationorderLinks 的域值即为ntoskrnl.exe 数据结
12、构 _LDR_DATA_TABLE_ENTRY 的基地址,最后也是从该结构中读出 ntoskrnl.exe 的加载基地址。KPCR+0 x34 KdVersionBlockGDT 0 x30DBGKD_GET_VERSION64+0 x18 PsLoadedModuleList_LDR_DATA_TABLE_ENTRYNtoskrnl.exe_LDR_DATA_TABLE_ENTRY+0 x10 InInitializationOrderLinks图 1 Ring3 状态探寻 ntoskrnl.exe 流程图2.2 定位内核变量 psinitialsystemprocessPE 文件格式是为了
13、使得执行体可以在不同的 CPU 工作指令下执行而设计的,因此有层次分明的结构,对此结构进行深入分析有助于对可执行体的了解。在探测到 ntoskrnl.exe的虚拟基地址后,需要从次入口开始分析 ntoskrnl.exe 的 PE文件格式,寻找到所需要的导出的内核变量 psinitialsystem-process,如图 2 所示。PE文件组成DOS头部+0 x00 WORD e_magic 值为0 x5A4DLONG e_lfanewPE头部+0 x00 DWORD Signature 值为0 x4550+0 x78 IMAGE_DATA_DIRECTORY DataDirectoryIMAG
14、E_NUMBERROF_DIRECTORY_ENTRIES块表导出表+0 x1C AddressOfFunctions 指向函数地址表的RVA+0 x20 AddressOfNames 指向函数名地址表的RVA+0 x24 AddressOfNameOrdinals 指向函数名序号表的RVA图 2 ntoskrnl.exe 部分结构图导出表中的三个关键域值分别指向函数地址表、函数名表和函数名序号表,这三项表中不仅包括 ntoskrnl.exe 所导出的函数,也包含其导出的内核变量。通过分析这三个导出表就可以得出 psinitialsystemprocess 的值。关系图如图 3 所示。Addr
15、essOfNameOrdinalsAddressOfNamesAddressOfFunctionsNumberOfNamesNumberOfFunctionsnBase(假设值为x)nName函数入口地址RVA函数入口地址RVA函数入口地址RVA函数入口地址RVAFileName.dll,01ba0RVARVARVAMyFunction2,0MyFunction3,0MyFunction1,0ab1MyFunc1 函数(序号x+1)MyFunc1 函数(序号x+1)MyFunc1 函数(序号x+1)无名函数(序号x)从上至下,依次为函数地址表、函数名表和函数序号表_IMAGE_EXPORT_D
16、IRECTORY图 3 函数地址表、函数名表和函数名序号表关系图2023 年第 10 期134计算机应用信息技术与信息化如图 3 所示,在 _IMAGE_EXPORT_DIRECTORY 结构中 nbase 为 ntoskrnl.exe 的虚拟基地址,NumberOfFunctions域值为导出表中共包含的表项数目,AddressOfFunctions、AddressOfNames 和 AddressOfNameOrdinals 分别为:函数地址表、函数名表和函数名序号表。首先通过名称与函数名表定位 psinitialsystemprocess 变量的序号。然后,通过序号与函数名序号表定位 p
17、sinitialsystemprocess 在函数名地址表中的位置。最后,通过函数名地址表读出 psinitialsystemprocess的 RVA(相对偏移地址),RVA+nbase 即为需要的变量的虚拟地址,而通过 VProbes 脚本读出目标地址内容即可读出变量的内容。通过 PEview 软件分析操作系统内核文件 ntoskrnl.exe 得到的 PsInitialSystemProcess 如图 4 所示,图中的 0 x0008A454就是其相对偏移量,其中 0 x037D 为其在函数名序号表中的序号,ntoskrnl.exe 虚拟基地址与此相对偏移量之和,就是PsInitialSy
18、stemProcess 的虚拟地址。图 4 PEview 工具分析 ntoskrnl.exe 定位 PsInitialSystemProcess2.3 遍历 EPROCESS 双向链表每个进程由一个 EPROCESS 所表示,其中 EPROCESS结构中含有进程的进程 ID、镜像名称即为进程的名称、线程占用 CPU 总时间、进程下属线程指针域和将 EPROCESS连接到双向链表里的 Active Process Link 域。Active Process Link 位于 EPROCESS 的 0 x88 处,读取图中 Flink 的值,再减去 0 x88 就是下一个进程 EPROCESS 结构
19、的基地址。这样循环往复就可以遍历整个活动进程链表,同时将链表上的信息都保存下来,图 5 为 EPROCESS 的双向链表结构。EPROCESSKPOCESSThreadListHeadProcess IDActive Process LinkImagefile NameBlinkFlinkEPROCESSKPOCESSProcess IDActive Process LinkImagefile NameBlinkFlinkEPROCESSKPOCESSThreadListHeadProcess IDActive Process LinkImagefile NameBlinkFlinkThrea
20、dListHead图 5 EPROCESS 双向链表结构虽然有些进程可以做到将自己从用户的任务管理器中消除掉,但因其不能够从此 EPROCESS 的双向链表上摘除,仅仅是遍历此链表已经有一定的检测隐藏进程的能力,所以其还不能够达到检测到所有的隐藏进程。因为有些进程可以自己的内核数据结构从此链表上摘除,所以还需全面寻找系统内有可能存在着隐藏的进程信息。2.4 遍历分发数据库由于线程分发数据库的三个关键内核变量没有被导出,外部无从得知每个队列是否非空,无从得知每个队列的起始和结束,从而不能够有序地分别对 Windows/XP 中的 32 个等待队列和 1 个就绪队列进行遍历。本文采取的方法如下。(
21、1)遍历 EPROCESS 的双向链表。(2)根据 EPROCESS 和 ETHREAD 结构关系,遍历线程链表。(3)将得到的线程称为已知线程。(4)基于所有已知线程,遍历每一个线程所在的队列。在图 6 可以看到 ETHREAD 数据结构的四个重要域,WaitListEntry 和 QueueListEntry 是线程参与调度的两个重要域,ThreadListEntry 域连接的是一个进程的当前所有线程,ThreadProcess 域指向自己的进程。从图中还可以看到,进程的线程之间有着复杂的连接关系,这之间的连接关系其实就是线程间的等待关系,或是在就绪队列中的等待关系。对线程分发数据库的遍历
22、,实际上就是遍历 Wait、Queue 和Thread 这三个队列上的所有线程,并由线程遍历其进程。KTHREADETHREAD+0 x220 ThreadProcess+0 x60 WaitListEntry+0 x118 QueueListEntry+0 x1b0 ThreadListEntryPROCESS 1PROCESS 2PROCESS 3WaitQueue图 6 线程等待就绪对列关系示意图对于可以将自己的内核数据结构进行修改从而将本身的EPROCESS 从链表上摘除的隐藏进程,通过将两次遍历结果交叉对比,从而识别此类隐藏进程。3 在 VMware 平台上实验本文基于 VMware
23、 虚拟化平台,对操作系统 Windows/XP进行了隐藏进程检测的实验。实验环境:Windows/XP sp2 操作系统、单核模式、非物理地址扩展寻址模式,DKOM 类型进程隐藏工具 FU_Root_kit。如图 7 所示,在客户虚拟机中开启任务管理器和 FU_Root_kit 进程隐藏工具。将进程 ID 为 488 的 Devcpp.exe 进程使用 FU_Root_kit 隐藏,可以看出图中任务管理器显示出总共有 29 个进程,但任务管理器中已经看不到了 Devcpp.exe 2023 年第 10 期135计算机应用信息技术与信息化的有关信息,也就意味着用户也无法终结该进程。图 7 客户虚
24、拟机 FU_Root_kit 隐藏进程示意图图 8 显示的是进行隐藏进程检测的实验结果,可以从该图中看出结果统计到了 30 个进程,并且显示了进程 Devcpp.exe 的有关信息。从该实验可以证实,本文可以有效检测利用 DKOM 类型的 Root_kit 所隐藏的进程。图 8 隐藏进程检测结果事实上,本文的隐藏进程检测方法,可以应对大多数类型的 Root_kit 进行检测,如表 1 所示。表 1 Root_kit 检测表Root_kit 名称类型原理是否检测成功AFX Root_kit用户层API 挂钩无忧隐藏用户层API 挂钩CCRoot_kit-0.1内核层SSDT 挂钩agony-ri
25、ng0内核层SSDT 挂钩NTRoot_kit内核层SSDT 挂钩phide2内核层DKOMFU内核层DKOMFUTo内核层DKOM本文的方案可以有效检测各种 Root_kit 隐藏的进程,对用户的透明性良好,且无须向客户操作系统中植入任何插件,克服了检测系统被恶意代码破坏、占用客户虚拟机系统资源的弱点。4 总结本文设计了一种基于虚拟化技术的无代理进程检测技术,通过对正在运行的虚拟机的线程分发数据库和进程EPROCESS 链表的遍历,并对进程和线程关键域数据的收集与分析,找出系统中利用 Root_kit 工具将自己隐藏起来的进程,并读出这些进程的镜像名称、进程ID和EPROCESS地址。通过在
26、 VMware 平台上进行实验验证,证明了本文所建构的系统能够有效检测出几乎所有类型的 Rootkit 隐藏的进程。本文研究的技术优势在于:第一,无须在客户虚拟机中植入插件,克服了检测系统被恶意代码破坏的缺点,由于检测系统只是利用虚拟机监视器,克服了部署困难和系统完整性难以控制的缺点;第二,几乎不占用客户虚拟机的系统资源;第三,对利用绝大多数类型的 Root_kit 所隐藏的进程都可以有效检测。参考文献:1 LI B,LI J X,WO T Y,et al.A VMM-based system call inter-position framework for program monitori
27、ngC/16th IEEE International Conference on Parallel and Distributed Systems.Piscataway:IEEE,2010:706-711.2 SESHADRI A,LUK M,QU N,et al.SecVisor:a tiny hypervisor to provide lifetime kernel code integrity for commodity OSesJ.Operating systems review,2007,41(6):335-350.3 XU M,JIANG X,SANDHU R,et al.Tow
28、ards a VMM-based usage control framework for OS kernel integrity protectionC/In Proceedings of the 12th ACM Symposium on Access Control Models and Technologies.New York:As-sociation for Computing Machinery,2007:7180.4 潘茂如,曹天杰.基于直接操作内核对象的进程隐藏技术研究 J.计算机工程,2010,36(18):138-140.5 周天阳,朱俊虎,王清贤.基于 VMM 的 Roo
29、kit 及其检测技术研究 J.计算机科学,2011,38(12):77-81.6 李伟,苏璞睿.基于内核驱动的恶意代码动态检测技术 J.中国科学院大学学报,2010,27(5):695-703.7 李博,沃天宇,胡春明,等.基于 VMM 的操作系统隐藏对象关联检测技术 J.软件学报,2013(2):405-420.8 白光冬,郭耀,陈向群.一种基于交叉视图的 Windows Rootkit 检测方法 J.计算机科学,2009,36(8):133-137.9 胡和君,范明钰.基于内存搜索的隐藏进程检测技术 J.计算机应用,2009,29(1):175-177.10张文晓,戴航,黄东旭.基于虚拟机的Rootkit 检测系统J.计算机技术与发展,2012,22(7):128-13111 王璟,武东英.基于内存扫描的隐藏进程检测技术 J.计算机应用,2009,29(6):89-91【作者简介】陈立娜(1990),女,山东菏泽人,硕士研究生,工程师,研究方向:计算机软件。季保启(1982),男,山东菏泽人,硕士研究生,网络工程师,研究方向:计算机技术应用。(收稿日期:2023-05-22 修回日期:2023-06-13)
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100