首页
社区
课程
招聘
[求助]xp3获取kpcr地址并非0xFFDFF000
发表于: 2010-8-6 20:24 10488

[求助]xp3获取kpcr地址并非0xFFDFF000

2010-8-6 20:24
10488
使用汇编
_asm
{
    mov eax,fs:[0x1C]
}
得到的eax值为0xB8340000,与预想的0xFFDFF000不符。
如果是0xFFDFF000,KdVersionBlock 地址便可以正确获得到。
没有搜索到相关资料介绍为什么会有这一现象,恳求大牛给予一些提示。

共4个环境,2个正常,2个异常。
虚拟机正常1:XP SP3 RC2运行正常,
真实机正常2:XP SP2运行正常
真实机异常1:XP SP3,处理器AMD Athlon(tm) 64 X2 Dual Core Processor 4400+  (双核)
真实机异常2:Vista home版

以下是真实机异常1的相应结构信息

lkd> dt _kpcr 0xB8340000
nt!_KPCR
   +0x000 NtTib            : _NT_TIB
   +0x01c SelfPcr          : 0xb8340000 _KPCR
   +0x020 Prcb             : 0xb8340120 _KPRCB
   +0x024 Irql             : 0 ''
   +0x028 IRR              : 0
   +0x02c IrrActive        : 0
   +0x030 IDR              : 0xffffffff
   +0x034 KdVersionBlock   : (null) 
   +0x038 IDT              : 0xb8344590 _KIDTENTRY
   +0x03c GDT              : 0xb8344190 _KGDTENTRY
   +0x040 TSS              : 0xb8340d70 _KTSS
   +0x044 MajorVersion     : 1
   +0x046 MinorVersion     : 1
   +0x048 SetMember        : 2
   +0x04c StallScaleFactor : 0x907
   +0x050 DebugActive      : 0 ''
   +0x051 Number           : 0x1 ''
   +0x052 Spare0           : 0 ''
   +0x053 SecondLevelCacheAssociativity : 0x10 ''
   +0x054 VdmAlert         : 0
   +0x058 KernelReserved   : [14] 0
   +0x090 SecondLevelCacheSize : 0x80000
   +0x094 HalReserved      : [16] 1
   +0x0d4 InterruptMode    : 0
   +0x0d8 Spare1           : 0 ''
   +0x0dc KernelReserved2  : [17] 0
   +0x120 PrcbData         : _KPRCB

lkd> dt _kpcr 0xFFDFF000
nt!_KPCR
   +0x000 NtTib            : _NT_TIB
   +0x01c SelfPcr          : 0xffdff000 _KPCR
   +0x020 Prcb             : 0xffdff120 _KPRCB
   +0x024 Irql             : 0 ''
   +0x028 IRR              : 0
   +0x02c IrrActive        : 0
   +0x030 IDR              : 0xffffffff
   +0x034 KdVersionBlock   : 0x8054e2b8 
   +0x038 IDT              : 0x8003f400 _KIDTENTRY
   +0x03c GDT              : 0x8003f000 _KGDTENTRY
   +0x040 TSS              : 0x80042000 _KTSS
   +0x044 MajorVersion     : 1
   +0x046 MinorVersion     : 1
   +0x048 SetMember        : 1
   +0x04c StallScaleFactor : 0x907
   +0x050 DebugActive      : 0 ''
   +0x051 Number           : 0 ''
   +0x052 Spare0           : 0 ''
   +0x053 SecondLevelCacheAssociativity : 0x10 ''
   +0x054 VdmAlert         : 0
   +0x058 KernelReserved   : [14] 0
   +0x090 SecondLevelCacheSize : 0x80000
   +0x094 HalReserved      : [16] 0
   +0x0d4 InterruptMode    : 0
   +0x0d8 Spare1           : 0 ''
   +0x0dc KernelReserved2  : [17] 0
   +0x120 PrcbData         : _KPRCB

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
你的线程应该刚刚运行到第二个核心了.
lkd> dd KeNumberProcessors l1
80556a60  00000002
双核

lkd> dd KiProcessorBlock l2
8055d5a0  ffdff120 f7787120
两个核心的KPRCB,减去120(KPCR大小)便是KPCR地址

lkd> dt _kpcr ffdff120-120
nt!_KPCR
   +0x000 NtTib            : _NT_TIB
   +0x01c SelfPcr          : 0xffdff000 _KPCR
   +0x020 Prcb             : 0xffdff120 _KPRCB
   +0x024 Irql             : 0 ''
   +0x028 IRR              : 0
   +0x02c IrrActive        : 0
   +0x030 IDR              : 0xffffffff
   +0x034 KdVersionBlock   : 0x8054e2b8
   +0x038 IDT              : 0x8003f400 _KIDTENTRY
   +0x03c GDT              : 0x8003f000 _KGDTENTRY
   +0x040 TSS              : 0x80042000 _KTSS
   +0x044 MajorVersion     : 1
   +0x046 MinorVersion     : 1
   +0x048 SetMember        : 1
   +0x04c StallScaleFactor : 0x7cb
   +0x050 DebugActive      : 0 ''
   +0x051 Number           : 0 ''
   +0x052 Spare0           : 0 ''
   +0x053 SecondLevelCacheAssociativity : 0 ''
   +0x054 VdmAlert         : 0
   +0x058 KernelReserved   : [14] 0
   +0x090 SecondLevelCacheSize : 0
   +0x094 HalReserved      : [16] 0
   +0x0d4 InterruptMode    : 0
   +0x0d8 Spare1           : 0 ''
   +0x0dc KernelReserved2  : [17] 0
   +0x120 PrcbData         : _KPRCB

lkd> dt _kpcr f7787120-120
nt!_KPCR
   +0x000 NtTib            : _NT_TIB
   +0x01c SelfPcr          : 0xf7787000 _KPCR
   +0x020 Prcb             : 0xf7787120 _KPRCB
   +0x024 Irql             : 0 ''
   +0x028 IRR              : 0
   +0x02c IrrActive        : 0
   +0x030 IDR              : 0xffffffff
   +0x034 KdVersionBlock   : (null)
   +0x038 IDT              : 0xf778b590 _KIDTENTRY
   +0x03c GDT              : 0xf778b190 _KGDTENTRY
   +0x040 TSS              : 0xf7787d70 _KTSS
   +0x044 MajorVersion     : 1
   +0x046 MinorVersion     : 1
   +0x048 SetMember        : 2
   +0x04c StallScaleFactor : 0x7cb
   +0x050 DebugActive      : 0 ''
   +0x051 Number           : 0x1 ''
   +0x052 Spare0           : 0 ''
   +0x053 SecondLevelCacheAssociativity : 0 ''
   +0x054 VdmAlert         : 0
   +0x058 KernelReserved   : [14] 0
   +0x090 SecondLevelCacheSize : 0
   +0x094 HalReserved      : [16] 1
   +0x0d4 InterruptMode    : 0
   +0x0d8 Spare1           : 0 ''
   +0x0dc KernelReserved2  : [17] 0
   +0x120 PrcbData         : _KPRCB
2010-8-6 20:36
0
雪    币: 1096
活跃值: (349)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
3
十分感谢mszjk 的解惑,那么说来这是多核处理器诞生以后产生的问题,就是不清楚KeNumberProcessors ,KiProcessorBlock 是否是导出的,再尝试一下。
顺便问下关于为分页内存第二块位于0xfxxxxxxx-0xffbe0000,即变量(MmNonPagedPoolExpansionStart, MmNonPagedPoolExpansionEnd)对应的区域,有什么结构记录着或者获取的方法,网络上对这个函数提的甚少,各位可否分享下关于这个的经验。
2010-8-7 08:44
0
雪    币: 1096
活跃值: (349)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
4
是不是可以通过下面的结构

Pool的组织通过池描述符(PoolDescriptor)来完成,它的结构为:
typedef struct _POOL_DESCRIPTOR {
POOL_TYPE PoolType;
ULONG PoolIndex;
ULONG RunningAllocs;
ULONG RunningDeAllocs;
ULONG TotalPages;
ULONG TotalBigPages;
ULONG Threshold;
PVOID LockAddress;
LIST_ENTRY ListHeads[POOL_LIST_HEADS];
} POOL_DESCRIPTOR, *PPOOL_DESCRIPTOR;

系统的PoolDescriptor由一个PoolVector全局数组来组织,它一般包括3个成员:指向两个静态分配的非分页池描述符NonPagedPoolDescriptor与NonpagedPoolDescriptorMS的指针,以及一个指向可分页池描述符指针数组的指针。

如果是的话,_MM_SESSION_SPACE,记录+0x244 PagedPool : _POOL_DESCRIPTOR 。
(⊙o⊙)…
包含 \mm\mi.h

extern PMM_SESSION_SPACE MmSessionSpace;
是不是就可以使用了?
2010-8-7 09:12
0
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
导出不导出,我只把ntoskrnl拖进ida,然后看导出表,很方便的...KiProcessorBlock 从导出表中找不到,说明是没导出的.
kpcr中的+0x051 Number           : 0x1 ''标明了cpu核心号.
至于你说的pool,不懂=.= 等牛来答...
2010-8-7 10:07
0
雪    币: 1407
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
http://www.msuiche.net/2009/01/05/multi-processors-and-kdversionblock/
2010-8-8 08:53
0
雪    币: 1096
活跃值: (349)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
7
感谢liangdong,昨天还在为寻找KdVersionBlock,打算放弃这个结构,原来可以这么简单解决。
2010-8-9 12:46
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
不仅多核心下会有这个问题,VISTA/WIN7下kpcr直接全部随机地址化了,第一个核也不是ffdff000
2010-9-2 20:19
0
雪    币: 544
活跃值: (264)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
9
原来随机性蓝屏,后来发现就一个CPU里面有kdversionblock,打算放弃用这个结构体。现在看来还是可以继续用。

非常感谢!~
2011-5-19 10:14
0
游客
登录 | 注册 方可回帖
返回
//