KPCR

原创 2012年05月29日 14:21:55

由于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的基地址:



/*
* 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;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

ffdff000 处的结构 KPCR

ffdff000 处的结构 KPCR作者: JIURL                 主页: http://jiurl.yeah.net     日期: 2003-11-13     ffdff00...

KPCR

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

win7x64下的kpcr结构和kprcb结构

//翻网页看全是x86的,然后我就自己来找x64的 //下面都是windbg调的 nt!_KPCR    +0x000 NtTib            : _NT_TIB    +0...

获取Windows 系统的内核变量

创建时间:2004-08-05文章属性:原创文章提交:tombkeeper (t0mbkeeper_at_hotmail.com)获取Windows 系统的内核变量作  者:于旸邮  件:tombke...
  • whf727
  • whf727
  • 2008年05月04日 15:34
  • 848

VT系列:将代码移植到多核模式

本文只是学习此视频后的一些总结 不当之处还请指出 视频作者:小宝来了 视频连接:http://bbs.pediy.com/showthread.php?t=211973  遇到的问题大概为以下4...

DLL注入技术之远线程注入

玩了这么久的hack,竟然到最近玩一个QQ显IP小软件的时候才知道注入是干什么用的,惭愧惭愧。刚好看到一个论坛上有一系列简明的说dll注入的文章 特此转载 正规主题 ...

BM字符串匹配算法

BM算法
  • ingwfj
  • ingwfj
  • 2016年07月17日 23:53
  • 1112
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:KPCR
举报原因:
原因补充:

(最多只允许输入30个字)