Windows 内核级进程隐藏、侦测技术 .pdf
Windows内核级进程隐藏、侦测技术
Windowsxx内核级进程隐藏、侦测技术
信息对抗是目前发展的一个重要的方向,为了更好的防御,必须去
深入的了解敌人进攻的招式。信息对抗促使信息技术飞速的发展。
下面我选取了信息对抗技术的中一个很小一角关于windows内核级
病毒隐藏技术和反病毒侦测技术作为议题详细讨论。
驱动程序是运行在系统信任的Ring0下在代码,她拥有对系统任
何软件和硬件的访问权限。这意味着内核驱动可以访问所有的系统
资源,可以读取所有的内存空间,而且也被允许执行CPU的特权指
令,如,读取CPU控制寄存器的当前值等。而处于用户模式下的程
序如果试图从内核空间中读取一个字节或者试图执行像MOV
EAX,CR3这样的汇编指令都会被立即终止掉。不过,这种强大的底
线是驱动程序的一个很小的错误就会让整个系统崩溃。所以对隐藏
和反隐藏技术来说都提供了一个极好的环境。但是又对攻击者和反
查杀者提出了更高的技术要求。
DriverEntry是内核模式驱动程序主入口点常用的名字,她的作
用和main,WinMain,是一样的。
DriverEntry的第一个参数是一个指针,指向一个刚被初始化的
驱动程序对象,该对象就代表你的驱动程序,DriverEntry的第二
个参数是设备服务键的键名。DriverEntry函数返回一个NTSTATUS
值。NTSTATUS实际就是一个长整型,但你应该使用NTSTATUS定义
该函数的返回值而不是LONG,这样代码的可读性会更好。大部分内
核模式支持例程都返回NTSTATUS状态代码,你可以在DDK头文件
NTSTATUS.H中找到NTSTATUS的代码列表。
DriverEntry的作用主要就是创建设备对象,建立设备对象的符
号链接,设置好各个类型的回调函数等。
例如:
externC
NTSTATUS
DriverEntry(INPDRIVER_OBJECTDriverObject,IN
PUNICODE_STRINGRegistryPath)
DriverObject-DriverUnload=DriverUnload;--1
DriverObject-DriverExtension-AddDevice=AddDevice;
DriverObject-DriverStartIo=StartIo;
DriverObject-MajorFunction[IRP_MJ_PNP]=DispatchPnp;--2
DriverObject-MajorFunction[IRP_MJ_POWER]=DispatchPower;
DriverObject-MajorFunction[IRP_MJ_SYSTEM_CONTROL]=
DispatchWmi;
...
在WDM中通过设置AddDevice回调函数来创建设备对象。在NT驱
动中在DriverEntry例程中创建设备对象和符号链接。
例如:
RtlInitUnicodeString(deviceNameUnicodeString,
deviceNameBuffer);//初始化设备名字//创建设备
ntStatus=IoCreateDevice(DriverObject,
0,
deviceNameUnicodeString,
##DeviceId,
0,
FALSE,
deviceObject
);if(NT_SUCCESS(ntStatus)){
RtlInitUnicodeString(deviceLinkUnicodeString,
deviceLinkBuffer);//初始化符号链接名字
//创建符号链接ntStatus=IoCreateSymbolicLink
(deviceLinkUnicodeString,deviceNameUnicodeString);if
(!NT_SUCCESS(ntStatus)){
IoDeleteDevice(deviceObject);//如果创建符号链接失败,删除
设备returnntStatus;
建立符号链接的作用就是暴露一个给应用程序的接口,应用程序
可以通过CreateFileAPI打开链接符号,得到一个语柄,和我们的
驱动程序进行交互操作。
虽然各个驱动程序的Unload例程不尽相同,但是它