KPCR
来源:互联网 发布:小米平板2 刷机 mac 编辑:程序博客网 时间:2024/06/04 22:53
处理器控制区(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; }
0 0
- KPCR
- KPCR
- KPCR
- ffdff000 处的结构 KPCR
- 从KPCR中获取内核基地址
- 内核程序中通过KPCR获取内核模块基址
- 内核态fs寄存器指向结构KPCR,方便反汇编
- win7x64下的kpcr结构和kprcb结构
- How to Defeat Windows 8 ASLR in Getting the Address of KPCR
- unity中制作序列帧动画
- K均值聚类以及matlab实现
- 设置CATALINA_HOME环境变量
- [leetcode] 334. Increasing Triplet Subsequence
- mysql workBeach 简单实用
- KPCR
- Java反射机制梳理(二)
- ubuntu12.04交叉编译opencv移植到arm板
- Eclipse配置JavaWeb环境
- 以in-memory方式运行的canopy生成算法
- C语言——位操作
- 黑马程序员——Java基础
- 设置button大小同文字一样大
- Noj Red packet 1651 (二分)