在PsCurrentProcess中,当前线程的偏移量为0B8h,而在注释中则写为0x70。我不明白作者的意思。为了找出答案,我尝试调试x64 Windows 10内核。
我在偏移量70h和B8h都找不到任何东西。但是我确实在偏移量220h处找到了_KPROCESS。
所有Windows 10 x64系统的偏移量都一样吗?
我要了解所有这些结构的内部。是否有任何资源可以从逆向工程的角度解释Windows中所有重要的内部数据结构。
#1 楼
首先,本书撰写时(可能是Win7),偏移量更可能与当前操作系统相匹配(而不是Windows 7)。也就是说,Geoff Chapell的网站很好地引用了不同Windows版本的内部内核结构:https: //www.geoffchappell.com/studies/windows/km/index.htm例如,查看
KPCR
,我们可以看到在0x0180
我们有KPRCB Prcb;
,所以188h是KPRCB
的8个字节。依次检查KPRCB
,我们看到偏移量8是KTHREAD *CurrentThread;
。因此,应在0B8h
结构中查找偏移量KTHREAD
。我可以在此页面上找到成员x4312079q,其偏移量在x86版本中为0x70,在x64版本中为0x98。 我不确定引用的反汇编来自哪个操作系统版本,但看起来有些混淆。您可能应该在Wiley的书页上提交勘误表报告。印刷。
#2 楼
如果您以用户模式ntdll运行,可以使用windbg查询其中的大多数结构。如果您以内核模式ntos / ntkr / aka nt运行,则pdb具有以下类型信息* .pdb具有这些类型信息
您可以将sysinternals中的livekd之类的工具与windbg一起使用,以进行
本地内核调试会话
尽可能在Win7 x86机器上运行
命令保持与os /版本无关
当前的进程可以查询为? @ $ proc
kd> ? @$proc
Evaluate expression: -2050188616 = 85cc9ab8
kd>
单个问号?代表masm表达评估器
您可以使用??问号以打开c ++表达式计算器
kd> ?? @$proc->UniqueProcessId
void * 0x00000538
kd>
kd> ? @$tpid
Evaluate expression: 1336 = 00000538
kd> ?? @$tpid
unsigned int 0x538
kd>
表示
pcr由@ $ pcr
表示,您可以混合使用表达式求值器,@@()可以将c ++表达式插入到masm求值中。 >
kd> ? @$pcr
Evaluate expression: -2097779712 = 82f66c00
kd> ? @@(@$pcr->PrcbData.CurrentThread)
Evaluate expression: -2048806120 = 85e1b318
kd>
在我的系统中PsGetCurrentProcess如下所示
kd> uf nt!PsGetCurrentThread
nt!PsGetCurrentThread:
82e72b99 64a124010000 mov eax,dword ptr fs:[00000124h]
82e72b9f c3 ret
kd>
您可以直接获取此段的原始内容:偏移量
kd> ? poi(fs:00000124)
Evaluate expression: -2048806120 = 85e1b318
kd>
当前线程由@ $ thread
kd> ? @$thread
Evaluate expression: -2048806120 = 85e1b318
kd>
ApcState不是数组,而是结构
/>
kd> ?? @$thread->Tcb.ApcState
struct _KAPC_STATE
+0x000 ApcListHead : [2] _LIST_ENTRY [ 0x85e1b358 - 0x85e1b358 ]
+0x010 Process : 0x85cc9ab8 _KPROCESS
+0x014 KernelApcInProgress : 0 ''
+0x015 KernelApcPending : 0 ''
+0x016 UserApcPending : 0 ''
kd>
在我的系统中PsGetCurrentProcss可以像这样在您的帖子中获取Process提及的偏移量
kd> ?? &(@$thread->Tcb.ApcState.Process)
struct _KPROCESS ** 0x85e1b368
kd> ?? *(unsigned long *)&(@$thread->Tcb.ApcState.Process)
unsigned long 0x85cc9ab8
kd>
如下
kd> uf nt!PsGetCurrentProcess
nt!PsGetCurrentProcess:
82ec5fce 64a124010000 mov eax,dword ptr fs:[00000124h]
82ec5fd4 8b4050 mov eax,dword ptr [eax+50h]
82ec5fd7 c3 ret
kd>
原始查询
kd> ? poi(30:124)
Evaluate expression: -2048806120 = 85e1b318
kd> ? poi(poi(30:124)+50)
Evaluate expression: -2050188616 = 85cc9ab8
kd>
表达式查询
kd> ? @@(@$prcb->CurrentThread->ApcState.Process)
Evaluate expression: -2050188616 = 85cc9ab8
kd>
评论
谢谢回答。按照建议,我调查了系统中该函数的功能。在x64中,ApcState的偏移量是0x98。它似乎是一个数组。 ApcState.Process在数组中偏移20倍。因此,有效偏移为98h + 20h = B8。同样在搜索了很多之后,我找到了总站项目。它很好地表示了Windows中的一些内部结构。以为您可能会感兴趣。
–阿斯温P J
17-10-4在4:47