【问题标题】:Is there a Windbg command to find out if a process is a 32-bit one or a 64-bit one?是否有 Windbg 命令来确定进程是 32 位还是 64 位?
【发布时间】:2017-09-04 15:35:59
【问题描述】:

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

你能告诉我两个吗:

  1. 非托管进程?

  1. 托管的?

对于托管的,我可以在 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 并说“附加到进程”)时,当前线程 (k) 的调用堆栈读取顶部为 wow64cpu!CpupSyscallStub+0x9 - 大多数电话。这与 #1 表明该进程是 32 位进程。

已经尝试过的命令

  1. !peb(进程环境块):告诉我们处理器架构,而不是被调试进程的位数。
  2. |
  3. 垂直目标
  4. r(表示我的处理器的寄存器大小,不告诉我进程)

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

【问题讨论】:

  • 任何与k相关的东西都可以给你显示方法地址,指示指针大小和清楚的进程位数。
  • 这不是告诉我们处理器的位数而不是进程的位数吗?只是问问而已。没有挑战性。
  • Vertarget 应该这样做
  • 在发布这个问题之前,我已经尝试过vertarget。我可能是错的,但vertarget 告诉我们其他一切,如环境变量、进程和系统正常运行时间、命令行参数及其值。它没有告诉我们当前进程的进程架构。如果我错了,我希望得到纠正。

标签: debugging windbg sos


【解决方案1】:

32 位/64 位决策

我经常使用的快速测试

lm m wow64

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

这种方法在很多情况下都有效,因为今天的操作系统很可能是 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

不起作用的事情

cmets 中建议的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,但我认为这是一个想愚弄你的人的罕见用法。

【讨论】:

  • 谢谢。这是一个巧妙的猜测,应该就足够了。我想知道——如果有一个 Windbg 命令来读取本机图像的 PE 标头,那将是获取此信息的最可靠方法。据您所知,是否有显示加载的本机图像的 PE 标头的命令?
  • @WaterCoolrv2:取决于您所说的“阅读”。 !dh notepaddb notepad+f0 L200 会给你一些输出,但是这些命令取决于模块名称
  • @WaterCoolrv2: .shell -ci "!dh -f notepad" findstr "machine" 是一个很长的命令,但输出非常好
猜你喜欢
  • 2012-01-25
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 2011-08-31
  • 2010-12-29
相关资源
最近更新 更多