在 Windows 中获取当前进程

逆向工程 过程 核心
2021-07-06 08:55:18

在阅读 Bruce Dang 的实用逆向工程时,我遇到了以下内容。

图片来自实用逆向工程

  1. 我假设这些过程分别返回一个指向当前线程和当前进程的指针是否正确?
  2. PsCurrentProcess 中,当前线程的偏移量是0B8h而在注释中它被写为0x70不明白作者这话是什么意思。为了找出答案,我尝试调试 x64 Windows 10 内核。

    在此处输入图片说明

    在此处输入图片说明

我在偏移 70h 或 B8h 处找不到任何东西。但我没有找到一个_KPROCESS偏移量220H这是我要找的吗?

在此处输入图片说明

  1. 对于所有 Windows 10 x64 系统,此偏移量是否相同?
  2. 我想知道所有这些结构的内部结构。是否有任何资源可以从逆向工程的角度解释 Windows 中所有重要的内部数据结构。
2个回答

首先,与 Windows 10 相比,偏移量更可能与本书撰写时的当前操作系统(可能是 Win7)匹配。也就是说,Geoff Chapell 的网站是对不同 Windows 版本的内部内核结构的一个很好的参考:https: //www.geoffchappell.com/studies/windows/km/index.htm

例如,查看KPCR,我们可以看到0x0180我们有KPRCB Prcb;,因此 188h 是 8 个字节KPRCBKPRCB反过来检查,我们看到偏移量 8 是KTHREAD *CurrentThread;所以0B8h应该在KTHREAD结构中查找偏移量我能够在此页面上找到x86 版本KAPC_STATE ApcState;中偏移量0x70x64中偏移量0x98的成员我不确定引用的反汇编来自哪个操作系统版本,但看起来有些混淆。您可能应该在 Wiley书页上提交勘误报告

同时,查看您实际运行的内核中提到的函数的反汇编,然后将其与您正在打印的结构进行匹配。

大多数这些结构可以用windbg查询

如果你在用户模式下运行 ntdll.pdb 有这些类型信息

如果你在内核模式下运行 ntos/ntkr/ aka nt*.pdb 有这些类型信息

您可以使用来自 sysinternals 的 livekd 和windbg 之类的工具来进行本地内核调试会话

以下是 win7 x86 机器上 livekd 的输出,命令尽可能与操作系统/版本无关

当前进程可以查询为@$proc

kd> ? @$proc
Evaluate expression: -2050188616 = 85cc9ab8
kd>

一个问号?代表您可以使用的 masm 表达式评估器?? 问号打开 C++ 表达式评估器

kd> ?? @$proc->UniqueProcessId
void * 0x00000538
kd>

上面Current process pid 也用@$tpid 表示

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>

您可以直接获取该段的原始内容:offset

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>

您可以在这样的帖子中获得对 Process 提及的偏移量

kd> ?? &(@$thread->Tcb.ApcState.Process)
struct _KPROCESS ** 0x85e1b368
kd> ?? *(unsigned long *)&(@$thread->Tcb.ApcState.Process)
unsigned long 0x85cc9ab8
kd>

在我的系统中 PsGetCurrentProcss 如下

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>