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

时间:2017-04-09 15:55:43

标签: debugging windbg sos

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

你能告诉我两个:

  1. 无法管理的流程?
    1. 管理员?
    2. 对于托管版本,我可以在C#中以编程方式找到它,但我仍然想知道是否有针对此的Windbg命令。

      更新

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

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

      2. 管道(|)命令告诉我的不过是PID,过程是否附加到调试器以及加载图像的路径(如上面#1中所述)

      3. 我正在64位计算机上进行调试。因此,r显示64位寄存器。

      4. 在没有崩溃的情况下附加到一个实时,健康的进程(我刚刚打开MS Word并说“Attach to Process”),当前线程(k)的callstack读取{{1}为最热门的电话。这个#1表明该过程是一个32位进程。

      5. 已尝试的命令

        1. !peb(Process Environment Block):告诉我们处理器架构,而不是正在调试的进程的位数。
        2. |
        3. vertarget
        4. r(表示我的处理器的寄存器大小,并没有告诉我该过程)
        5. 但我想知道是否有办法找出答案。

1 个答案:

答案 0 :(得分:4)

32位/ 64位决定

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

lm m wow64

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

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

更具权威性的方法

.load wow64exts
!info
不幸的是,它提供了大量输出,因此在脚本中很难使用。

32位输出看起来像

0:000> !info

PEB32: 0xe4d000
PEB64: 0xe4c000

Wow64 information for current thread:

TEB32: 0xe50000
TEB64: 0xe4e000

[...]

如果是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

[...]

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

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

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

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

不起作用的东西

注释中建议的

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

.NET决定

与WOW64图层类似,您可以检查.NET:

lm m mscorwks
lm m clr
lm m coreclr

当然可以直接从本机代码通过LoadLibrary()加载这样的DLL,而不是使用.NET,但我认为很少使用那些想欺骗你的人。