在阅读Bruce Dang的《实践逆向工程》时,我遇到了以下问题。

在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的书页上提交勘误表报告。印刷。

评论


谢谢回答。按照建议,我调查了系统中该函数的功能。在x64中,ApcState的偏移量是0x98。它似乎是一个数组。 ApcState.Process在数组中偏移20倍。因此,有效偏移为98h + 20h = B8。同样在搜索了很多之后,我找到了总站项目。它很好地表示了Windows中的一些内部结构。以为您可能会感兴趣。

–阿斯温P J
17-10-4在4:47



#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>