是否有Windbg命令来确定进程是32位还是64位?

Wat*_* v2 5 debugging windbg sos

是否有Windbg/NTSD命令告诉我在实时调试会话中我附加的进程是32位还是64位?

你能告诉我两个:

  1. 一个不受管理的过程?

和

  1. 有管理的?

对于托管的,我可以在C#中以编程方式找到它,但我仍然想知道是否有针对此的Windbg命令.

UPDATE

我正在调试的目标进程是Microsoft Word(winword.exe).Office版本是2016年,但我不确定它是32位还是64位二进制文​​件.以下是一些观察结果:

  1. 目标位置是C:\ Program Files(x86)\ Microsoft Office\root\Office16\WinWord.exe

  2. pipe(|)命令只告诉我PID,无论进程是否附加到调试器以及加载映像的路径(如上面的#1所述).

  3. 我在64位机器上调试它.因此,r显示64位寄存器.

  4. 在没有崩溃的情况下连接到一个实时,健康的进程(我刚刚打开MS Word并说"Attach to Process"),当前thread(k)的callstack 读取wow64cpu!CpupSyscallStub+0x9最顶层的调用.这个#1表明该过程是一个32位进程.

命令已经尝试过

  1. !peb(Process Environment Block):告诉我们处理器架构,而不是正在调试的进程的位数.
  2. |
  3. vertarget
  4. r(表示我的处理器的寄存器大小,并没有告诉我该过程)

但我想知道是否有办法找出答案.

Tho*_*ler 7

32位/64位决定

为了快速测试,我经常使用

lm m wow64
Run Code Online (Sandbox Code Playgroud)

它检查是否加载了 WOW64 层。如果是这样,它是一个 32 位进程。

这种方法在许多情况下都有效,因为今天的操作系统很可能是 64 位。但是,您也可以拥有 32 位操作系统的 32 位转储,在这种情况下,这种方法效果不佳。

更权威的方法是

.load wow64exts
!info
Run Code Online (Sandbox Code Playgroud)

不幸的是,它提供了很多输出,因此很难在脚本中使用。

32位输出看起来像

0:000> !info

PEB32: 0xe4d000
PEB64: 0xe4c000

Wow64 information for current thread:

TEB32: 0xe50000
TEB64: 0xe4e000

[...]
Run Code Online (Sandbox Code Playgroud)

如果是 64 位,则为

0:000> !info
Could not get the address of the 32bit PEB, error 0

PEB32: 0
PEB64: 0x6b33c50000

Wow64 information for current thread:

TEB32: 0
TEB64: 0x6b33c51000

[...]
Run Code Online (Sandbox Code Playgroud)

我没有可用的 32 位 Windows 操作系统转储,但我认为可以肯定地说

  • 如果 PEB32 不为 0,则它是一个 32 位进程。
  • 如果 PEB64 为 0,则为 32 位操作系统

如果您知道模块名称,您还可以检查文件头:

0:000> .shell -ci "!dh -f notepad" findstr "machine"
    8664 machine (X64)
.shell: Process exited
Run Code Online (Sandbox Code Playgroud)

行不通的事情

vertarget 正如评论中所建议的那样,对于 32 位应用程序的 64 位故障转储效果不佳。

$ptrsize 本来会很好,但这取决于调试器模式:

0:000> ? $ptrsize
Evaluate expression: 8 = 00000000`00000008
0:000> .effmach x86
Effective machine: x86 compatible (x86)
0:000:x86> ? $ptrsize
Evaluate expression: 4 = 00000004
Run Code Online (Sandbox Code Playgroud)

.NET 决定

类似于WOW64层,可以检查.NET:

lm m mscorwks
lm m clr
lm m coreclr
Run Code Online (Sandbox Code Playgroud)

当然,有可能LoadLibrary()直接从本机代码而不使用 .NET加载这样的 DLL ,但我认为这是想愚弄您的人的罕见用法。