KPCR

处理器控制区(Processor Control Region)即KPCR

KPRCB(Kernel Processor Control Block)结构

由于Windows需要支持多个CPU, 因此Windows内核中为此定义了一套以处理器控制区(Processor Control Region)即KPCR为枢纽的数据结构, 使每个CPU都有个KPCR.

其中KPCR这个结构中有一个域KPRCB(Kernel Processor Control Block)结构, 这个结构扩展了KPCR.

这两个结构用来保存与线程切换相关的全局信息.

通常fs段寄存器在内核模式下指向KPCR, 用户模式下指向TEB.


KPCR结构如下:

这里写图片描述

其中比较重要的是KdVersionBlock这个指针, 它指向一个DBGKD_GET_VERSION64这个结构.

这里写图片描述

这个结构体里面包含了一些重要信息。如:PsLoadedModuleList它是Windows加载的所有内核模块构成的链表的表头。

这里写图片描述
这里写图片描述

由此可以看到,两个处理器对应的KPCR结构是有区别的,只有第一个处理器的KPCR域KdVersionBlock才指向DBGKD_GET_VERSION64这个结构。

下面我们通过具体的代码举个例子,通过KPCR枚举到Ntoskrnl的基地址:

这里写图片描述

[cpp] view plain copy
/* 
* AUTHOR      : 莫灰灰 
* BLOG        : http://blog.csdn.net/hu3167343 
* DESCRIBE    : KPCR->KdVersionBlock->PsLoadedModuleList->ntoskrnl base address  
*/  

#include "ntddk.h"  

NTKERNELAPI VOID KeSetSystemAffinityThread ( KAFFINITY Affinity );  
NTKERNELAPI VOID KeRevertToUserAffinityThread ( VOID );  

VOID  
DriverUnload(IN PDRIVER_OBJECT pDriverObj)  
{      
    KdPrint(("Unloaded Success\r\n"));  
    return;  
}  

NTSTATUS  
DriverEntry(IN PDRIVER_OBJECT pDriverObj, IN PUNICODE_STRING pRegistryString)  
{  
    NTSTATUS        status = STATUS_SUCCESS;  
    ULONG FSAddr;  

    pDriverObj->DriverUnload = DriverUnload;  

    KeSetSystemAffinityThread(1); //使当前线程运行在第一个处理器上  
    __asm{  
            push eax  
            mov    eax, fs:[0x34]    ;得到KdVersionBlock的地址  
            add  eax,18h        ;得到指向PsLoadedModuleList的地址   
            mov  eax,[eax]        ;得到PsLoadedModuleList的地址   
            mov  eax,[eax]        ;取出PsLoadedModuleList里面的内容, 即KLDR_DATA_TABLE_ENTRY结构  
            mov  eax,[eax+18h]    ;取出DllBase, 即ntoskrnl.exe的基地址  
            mov FSAddr, eax  
            pop eax  
    }  
    KeRevertToUserAffinityThread();//恢复线程运行的处理器  

    KdPrint(("0x%08X\n", FSAddr));  
    return STATUS_SUCCESS;  
}  

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值