gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:55:26 25 4
gpt4 key购买 nike

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

你能告诉我两个:

  • 非托管进程?


  • 有管理的?

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

    更新

    我正在调试的目标进程是 Microsoft Word (winword.exe)。 Office 版本是 2016,但我不确定它是 32 位还是 64 位二进制文​​件。以下是一些观察:
  • 目标位置是 C:\Program Files (x86)\Microsoft Office\root\Office16\WinWord.exe
  • 管道 ( | ) 命令只告诉我 PID、进程是否附加到调试器以及加载图像的路径(如上面的 #1 所述)。
  • 我在 64 位机器上调试它。因此,r 显示 64 位寄存器。
  • 在附加到一个没有崩溃的实时、健康的进程(我刚刚打开 MS Word 并说“附加到进程”)后,当前线程的调用堆栈( k )读取 wow64cpu!CpupSyscallStub+0x9最上面的电话。这与 #1 表明该进程是 32 位进程。

  • 已经尝试过的命令
  • !peb(进程环境 block ):告诉我们处理器架构,而不是被调试进程的位数。
  • |
  • 目标
  • r(表示我的处理器的寄存器大小,不告诉我进程)

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

    最佳答案

    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

    不起作用的东西
    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。直接来自 native 代码而不使用 .NET,但我认为这是一个想愚弄你的人的罕见用法。

    关于debugging - 是否有 Windbg 命令来确定进程是 32 位还是 64 位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43308814/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com