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

r55awzrz  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(227)

是否有一个Windbg/NTSD命令告诉我,如果我在一个实时调试会话中附加到一个进程是32位或64位的?
你能告诉我两个人的情况吗:
1.非托管进程?

1.管理一?
对于一个托管的,我可以用C#编程找到它,但我仍然想知道是否有一个Windbg命令。

更新

我正在调试的目标进程是Microsoft Word(winword.exe)。Office版本是2016,但我不确定它是32位还是64位二进制文件。以下是一些观察结果:
1.目标位置为C:\Program Files(x86)\Microsoft Windows\root\Windows 16\WinWord.exe

  1. pipe(|)命令只告诉我PID,进程是否连接到调试器,以及加载映像的路径(如上面的#1所述)。
    1.我在一台64位机器上调试它,所以r显示64位寄存器。
    1.在连接到一个没有崩溃的活动的健康进程时(我刚刚打开MS Word并说“连接到进程”),当前线程的调用堆栈(k)读取wow64cpu!CpupSyscallStub+0x9作为最顶部的调用。这表明该进程是一个32位进程。

已尝试的命令

1.!peb(Process Environment Block):告诉我们调试器体系结构,而不是正在调试的进程的位数。

  1. |
    1.韦尔塔Git
  2. r(表示处理器的寄存器大小,但不告诉我进程)
    但我想知道有没有办法能查出来。
pvabu6sv

pvabu6sv1#

32位/ 64位判决

对于我经常使用的快速测试,

lm m wow64

字符串
它检查WOW 64层是否被加载。如果是,它是一个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操作系统转储可用,但我假设它是安全的说,

  • 如果PEB 32不为0,则它是一个32位进程。
  • 如果PEB 64为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决策

与WOW 64层类似,您可以检查.NET:

lm m mscorwks
lm m clr
lm m coreclr


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

4smxwvx5

4smxwvx52#

此WinDbg命令将告诉您为给定模块构建的“计算机类型”。对于x64,值为0x8664。对于x86,值为0x14c。计算机类型值的完整列表可在此处找到:https://learn.microsoft.com/en-us/windows/win32/debug/pe-format

dx @$curprocess.Modules.Where(x => x.Name.ToLower().Contains("foo.dll")).Select(x => x.Contents.Headers.FileHeader.Machine),x

字符串

相关问题