论文关键字: 内核 拦截 活动进程链表 系统服务派遣表 线程调度链 驱动程序简介
论文摘要:信息对抗是目前计算机发展的一个重要的方向,为了更好的防御,必须去深入的了解敌人进攻的招式。信息对抗促使信息技术飞速的发展。下面我选取了信息对抗技术的中一个很小一角关于windows内核级病毒隐藏技术和反病毒侦测技术作为议题详细讨论。
1.为什么选驱动程序
驱动程序是运行在系统信任的ring0环境下在代码,她拥有对系统任何软件和硬件的访问权限。这意味着内核驱动可以访问所有的系统资源,可以读取所有的内存空间,而且也被允许执行cpu的特权指令,如,读取cpu控制寄存器的当前值等。而处于用户模式下的程序如果试图从内核空间中读取一个字节或者试图执行像mov eax,cr3这样的汇编指令都会被立即终止掉。不过,这种强大的底线是驱动程序的一个很小的错误就会让整个系统崩溃。所以对隐藏和反隐藏技术来说都提供了一个极好的环境。但是又对攻击者和反查杀者提出了更高的技术要求。
2.入口例程driverentry
driverentry是内核模式驱动程序主入口点常用的名字,她的作用和main,winmain,是一样的。
extern "c" ntstatus driverentry(in pdriver_object driverobject, in punicode_string registrypath)
{...}
driverentry的第一个参数是一个指针,指向一个刚被初始化的驱动程序对象,该对象就代表你的驱动程序,driverentry的第二个参数是设备服务键的键名。lOCALhoSTdriverentry函数返回一个ntstatus值。ntstatus实际就是一个长整型,但你应该使用ntstatus定义该函数的返回值而不是long,这样代码的可读性会更好。大部分内核模式支持例程都返回ntstatus状态代码,你可以在ddk头文件ntstatus.h中找到ntstatus的代码列表。
driverentry的作用主要就是创建设备对象,建立设备对象的符号链接,设置好各个类型的回调函数等。
例如:
extern "c"
ntstatus
driverentry(in pdriver_object driverobject, in punicode_string registrypath)
{
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); //如果创建符号链接失败,删除设备
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>