KPCR
作者:互联网
KPCR
1. IRQL
在32位存储在KPCR+0x24中,但在64位存储在CR8寄存器中,这个要明确。
IRQL 表示代码运行到什么级别
2. nt!KeNumberProcessors与nt!KiProcessorBlock
KeNumberProcessors 显示存在几核CPU,要查看可以通过这个查看。
KiProcessorBlock 显示其对应的KPCRB结构体的地址,注意 KPCR+0x120其指向KPCRB,因此获取KPCR要x-0x120。
其中KeNumberProcessors是导出变量,直接导出使用即可。
但是KiProcessorBlock需要手动寻找,其搜索路径如下,之后在代码中我们会在多核环境下遍历该KPCR数组。
注意:该结构仅在0号CPU中运行,因此如果查找该结构,必须通过KeSetSystemAffinityThread()切换CPU到0号,然后再来查找有关CPU。
3. KPCR+0x34 KdVersionBlock
该成员指向一个_DBGKD_GET_VERSION64结构体(其也存在*32后缀的结构体,但是在XP以后都为_DBGKD_GET_VERSION64,其与操作系统位数无关)。
其存在两个重要的成员:ntoskrl.exe模块基址,模块加载链表。 我们之前讲到过使用NtQuerySystem和特征码搜索,现在又多了一种方法,这个是要明确的。
4. KeSetSystemAffinityThread() KeRevertToUserAffinityThread() 修改亲核性
KeSetSystemAffinityThread 当前代码跑到几号核CPU上,设置为多少就跑到多少核上。
KeRevertToUserAffinityThread 恢复到原来正在跑的线程。
5. DPC - 主要用于看门狗
模拟键盘时,1分钟可以插入1000次,DPC级别,其DPC级别太高,则会让线程一直来处理DPC。
Windows操作系统设置了DPC看门狗,当运行DPC超过多少时间,就会造成蓝屏。
因此在写模拟键盘鼠标时,不要插入太多,同时也不要写延迟,这个要明确。
6. MiProcessLoaderEntry
我们在驱动隐藏时看到这个函数,将驱动从链表中卸载,也同样可以卸载进程和线程,注意其传入的是一个链表,这个我们在之后的实验中会看到。
7.
标签:KPCR,KeSetSystemAffinityThread,KiProcessorBlock,链表,DPC,CPU 来源: https://www.cnblogs.com/onetrainee/p/12713268.html