SSN1672.1438 CN 1'.4994/T 中国观代欺有装备 201 1年第9期 总第121期
W i ndows Ro o tK i t进程隐藏与检测技术的研究 刘正宏 北京电子科技职业学院北京100176
摘 要:目前木马制造者趋于利用RootKit技术来隐藏它们的进程,危害信息与网络安全。重点从用户和内核两种模式深入 剖析Windows RootKit隐藏进程技术,并提出基于进程表的综合检测机制。测试证明:只有从用户和内核两种模式下应用 多种进程表检测技术,才是安全检测隐藏进程更为有效的方法。 关键词:Windows RootKit;远程线程注入;Dkom:进程表
Research on Windows RootKit hidden process and detection technology Liu Zhenghong Beijing vocational college ofelectronic science and technology,Beijing,100176,China Abstract:At present the designers of Trojan Horse tend to use the RootKit technique to hide their process and harm the safety of inform ̄ion and network.This article focuses on using the two modes of user and kernel,this thesis analyses in detail the hidden process technology in Windows RootKit.It also point out the detection mechanism based on processList.Test results proved that only applying various processList detecting technology from two modes of user and Kernel can we test the hidden process more safely and effectively. Key words:Windows RootKit;remotethread injection;Dkom;processList
随着网络的普及与发展,网络安全问题日益突出, 一部分木马制造者已将触角深入系统底层来隐藏木马, 通过修改操作系统内核来隐藏自己,欺骗用户,这就是 RootKit。RootKit的隐藏特性严重影响系统的安全性 和可靠性,而RootKit进程隐藏已成为管理员和安全检 测软件所面临的最为迫切的安全威胁。 1 Wi ndows RootKit介绍 Windows RootKit是一个程序的集合,用于实现自 身及系统中特定资源和活动的隐藏,破坏可信任计算机 的完整性。攻击者通过在系统中种植RootKit,维护一 个系统后门,以管理员权限控制系统,并且通过隐藏进 程、文件、端口、句柄、注册表项、键值等来隐藏攻 击行为。 2 W i ndows RootK i t进程隐藏技术分析 从运行环境和隐藏手段看,主要可归结为2类: 收稿日期:2011-01—11 作者简介:刘正宏,硕士,高级讲师,系主任。 24 (1)用户模式下,修改程序执行路径。 (2)内核模式下,控制和修改操作系统内核结构和 代码。 这两种方式都可以通过挂钩系统重要函数模块、 修改系统中重要数据结构等途径,对系统进程的相关信 息进行劫持与修改,以达隐藏进程的目的。 2.1修改程序执行路径,实现进程隐藏 在用户模式下,修改程序执行路径,实现进程隐藏 主要是通过远程线程注入技术。 2.1.1远程线程注入技术 是指通过在另一个进程中创建远程线程的方法进 入进程的内存地址空间。其核心是产生一个特殊的线 程,这个线程能够将一段执行代码连接到另一个进程所 处的内存空间里,作为另一个进程的其中一个非核心线 程来运行,从而达到交换数据隐藏自身的目的。其中远 程线程注入dll是该技术中最佳方法,为进程隐藏提供了 更大的灵活性。 2.1.2远程线程注入d1l,隐藏进程 远程线程注入dll其意义是将dll文件嵌入到正在运 行的系统进程当中。dll文件是由多个功能函数构成,它 并不能独立运行,所以在进程列表中并不会出现dl1。 hRemoteThred=CreateRemoteThread(hRemoteProce ss,NULL,0,pfnStarAddr,pszLibFileRemote,0,NULL);
2011年5月 2011年第9期 总第121期 中国观代孝 装备 SSN1 672—1438 CN11
-4994/1-
首先把一个实际为木马主体的dll文件(参数 pszLibFileRemote)通过WriteProcessMemory函数 载入内存,然后通过“线程注入”技术,即使用 CreateRemoteThread函数在远程进程中创建一个线程, 将其注入其他进程(地址pfnStarAddr)的内存空间,最后 这个dll里的代码就成为其他进程的一部分来实现了自 身的隐藏。 2.2控制和修改操作系统内核结构和代码,实现进 程隐藏 在内核模式下,Windows RootKit进程隐藏方法主 要有通过挂钩系统服务描述表(SSDT) ̄B直接修改操作 系统用于监控系统资源的数据(DKOM技术1。 2.2.1通过挂钩系统服务描述表(SSDT),实现进程 隐藏 SSDT表是函数地址表,其中存放了所有系统服 务函数的入口地址。系统服务调度程序通过查找 SSDT来调用相应的系统服务。因此,RootKit可以将 S SDT中的系统服务地址替换为自己代码的地址,由 RootKit代码调用真正的系统服务并对结果作相应 处理,再通过Hook劫持ZwQuerySystemlnformation或 NtQuerySystemlnformaion修改其返回数据,删除需要隐 藏的进程的信息。 2.2.2通过直接内核对象操作技术(DKOM),实现进 程隐藏 操作系统通过创建相关内核对象来登记和审计系 统资源,DKOM则通过修改这些内核对象来隐藏特定资 源,即主要通过修改活动进程列表实现进程隐藏。 (1)进程隐藏原理 Windows操作系统中,枚举进程使用的是活动进程 列表PsActiveProcessList,它是一个双向链表,每个结点 对应一个进程的EPROCESS数据结构,所有结点通过 EPROCESS结构中的ActiveProcessLinks双向指针链在 一起,通过修改两个指针可以隐藏指定进程。即把当前 进程的前一个进程的BLINK指向当前进程后一个进程 的FLINK,再把当前进程后一个进程的FLINK ̄向当前 进程前一个进程的FLINK( ̄H图1所示)。 、一..一..一..一.......…. 图1修改活动进程列表实现进程隐藏原理图 2011年5月 (2)进程隐藏实现 ①定位双向链表,确定当前进程。Windows具有唯 一的内核处理器控制块结构(KPRCB),它总是位于内 存地址0xffdffl20处,这个地址偏移0x124就是指向当前 ETHEREAD的指针,从这个ETHREAD再往下偏移一个 值就是当前进程的FLINK了(如图1所示)。这个值因系 统不同而各不相同,Windows2000下是0xA0,Windows xp下是0x88。 ②从P sActiveLink链表上摘下当前进程,实现 隐藏。Windows系统将所有的进程对象EPROCESS 链接到ACtiveProCes sLink上,但链表由一个未导 出内核全局变量PsActiveProceSsHead,通过遍历 ActiveProcessLink可以获得所有的进程信息,如果将一 个当前进程EPROCESS对象从PsActiveLink链表上摘 下来,NtQuerySystemlnformation ̄数最终遍历该链表返 回进程相关的信息,将无法检测到从PsActiveLink链表 中摘下的当前进程。部分实现代码是: ntStatus=PsLookupProcessByProcessld(Processld, &pEprocess);
RemoveEntryI.ist((PLIST ENTRY)((PUCHAR) pEprocess+0xA0)); RemoveEntryList((PLIST ENTRY)((PUCHAR) pEprocess+0x88));
通过调用PsLookupProcessByProcessId例程得到 指向指定Processld的EPROCESS对象的指针,然后调用 RemoveEntryList将其从链表上摘下。
3基于进程表的综合检测隐藏进程机制 3.1用户模式下的隐藏进程检测机制 3.1.1原理 每一个进程活动时都会暴露一些痕迹,包括打开 的句柄、窗口和创建的系统对象等,可以通过这些痕 迹检测,获取进程列表,检测隐藏进程。 3.1.2分析进程相关句柄获取进程列表 取得进程句柄后,可以用ZwQuerylnformationProcess 确定其PID。对于线程,可以调用ZwQuerylnformationThread 并得到其进程的ID。系统中所有的进程都是由某个进 程启动的,所以,可以通过检查其他进程(父进程或 csrss.exe)@的句柄来获取进程列表。 3.1.3直接使用系统调用获取进程列表 在用户模式下隐藏进程的常用方法是将自己 的代码或dIl注入其他的进程并截获ntdl1.dll中的
25