是否有一个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
- pipe(
|
)命令只告诉我PID,进程是否连接到调试器,以及加载映像的路径(如上面的#1所述)。
1.我在一台64位机器上调试它,所以r显示64位寄存器。
1.在连接到一个没有崩溃的活动的健康进程时(我刚刚打开MS Word并说“连接到进程”),当前线程的调用堆栈(k
)读取wow64cpu!CpupSyscallStub+0x9
作为最顶部的调用。这表明该进程是一个32位进程。
已尝试的命令
1.!peb(Process Environment Block):告诉我们调试器体系结构,而不是正在调试的进程的位数。
- |
1.韦尔塔Git - r(表示处理器的寄存器大小,但不告诉我进程)
但我想知道有没有办法能查出来。
2条答案
按热度按时间pvabu6sv1#
32位/ 64位判决
对于我经常使用的快速测试,
字符串
它检查WOW 64层是否被加载。如果是,它是一个32位进程。
这种方法在很多情况下都有效,因为今天的操作系统可能是64位的。然而,你也可以有一个32位操作系统的32位转储,在这种情况下,这种方法并不能很好地工作。
一个更权威的方法是
型
不幸的是,它会产生很多输出,所以很难在脚本中使用。
32位输出看起来像
型
在64位的情况下,它是
型
我没有一个32位的Windows操作系统转储可用,但我假设它是安全的说,
如果你知道模块名,你也可以检查文件头:
型
不起作用的东西
注解中建议的
vertarget
不适用于32位应用程序的64位崩溃转储。$ptrsize
本来是很好的,但它取决于调试器模式:型
.NET决策
与WOW 64层类似,您可以检查.NET:
型
当然,也有可能直接通过
LoadLibrary()
从本机代码加载这样的DLL,而不是使用.NET,但我认为这是一个罕见的用法,有人想愚弄你。4smxwvx52#
此WinDbg命令将告诉您为给定模块构建的“计算机类型”。对于x64,值为0x8664。对于x86,值为0x14c。计算机类型值的完整列表可在此处找到:https://learn.microsoft.com/en-us/windows/win32/debug/pe-format
字符串