• 如何调试WOW64应用程序


    最近,我处理了一个问题,在系统帐户下安装32位Office时没有发生注册表反射。这需要同时研究32位Office代码和实现注册表反射的Wow64代码。使用32位调试器附加到Wow64进程时,就像在32位计算机上调试32位进程一样;进程中没有64位二进制文件。但是,我们需要调试Wow64来调试注册表反射代码。为此,我们使用64位调试器附加到Wow64进程,它允许您查看Wow64二进制文件。

    lm
    
            Base TimeStamp Module
    
              400000 42435b2a Mar 24 18:28:26 2005 C:Program Files (x86)Internet ExplorerIEXPLORE.EXE
    
            77ec0000 45d6cc72 Feb 17 03:35:46 2007 C:WINDOWSsystem32
    tdll.dll
    
            6b000000 45d6943d Feb 16 23:35:57 2007 C:WINDOWSsystem32wow64.dll
    
            6b280000 45d695f3 Feb 16 23:43:15 2007 C:WINDOWSsystem32wow64win.dll
    
            78b80000 42438b7a Mar 24 21:54:34 2005 C:WINDOWSsystem32wow64cpu.dll

    有2个选项用于调试Wow64应用程序。

    1、使用64位调试器和Wow64调试器扩展(Wow64exts.dll)
    2、使用32位调试器

    使用64位调试器和Wow64调试器扩展(Wow64exts.dll)

    我在一台64位机器上运行了32位版本的Internet Explorer,并使用64位调试器附加到它上。这是从64位调试器查看时的线程0调用堆栈。

    0:000> kL
    
    Child-SP RetAddr Call Site
    
    00000000`0013edf8 00000000`78b8428e wow64cpu!CpupSyscallStub+0x9
    
    00000000`0013ee00 00000000`6b006a5a wow64cpu!Thunk0Arg+0x5
    
    00000000`0013ee70 00000000`6b005e0d wow64!RunCpuSimulation+0xa
    
    00000000`0013eea0 00000000`77ed8030 wow64!Wow64LdrpInitialize+0x2ed
    
    00000000`0013f6d0 00000000`77ed582f ntdll!LdrpInitializeProcess+0x1538
    
    00000000`0013f9d0 00000000`77ef30a5 ntdll!_LdrpInitialize+0x18f
    
    00000000`0013fab0 00000000`77d59620 ntdll!KiUserApcDispatch+0x15
    
    00000000`0013ffa8 00000000`00000000 0x77d59620
    
    00000000`0013ffb0 00000000`00000000 0x0
    
    00000000`0013ffb8 00000000`00000000 0x0
    
    00000000`0013ffc0 00000000`00000000 0x0
    
    00000000`0013ffc8 00000000`00000000 0x0
    
    00000000`0013ffd0 00000000`00000000 0x0
    
    00000000`0013ffd8 00000000`00000000 0x0
    
    00000000`0013ffe0 00000000`00000000 0x0
    
    00000000`0013ffe8 00000000`00000000 0x0
    
    00000000`0013fff0 00000000`00000000 0x0
    
    00000000`0013fff8 00000000`00000000 0x0
    
    00000000`00140000 00000020`78746341 0x0
    
    00000000`00140008 00005370`00000001 0x20`78746341

    上面的堆栈只显示64位调用;我们看不到32位调用在做什么。要获得32位堆栈,必须使用以下方法之一。

    Option 1 : 执行 “!wow64exts.k”

    0:000> !wow64exts.k
    
    Walking 64bit Stack…
    
    Child-SP RetAddr Call Site
    
    00000000`0013edf8 00000000`78b8428e wow64cpu!CpupSyscallStub+0x9
    
    00000000`0013ee00 00000000`6b006a5a wow64cpu!Thunk0Arg+0x5
    
    00000000`0013ee70 00000000`6b005e0d wow64!RunCpuSimulation+0xa
    
    00000000`0013eea0 00000000`77ed8030 wow64!Wow64LdrpInitialize+0x2ed
    
    00000000`0013f6d0 00000000`77ed582f ntdll!LdrpInitializeProcess+0x1538
    
    00000000`0013f9d0 00000000`77ef30a5 ntdll!_LdrpInitialize+0x18f
    
    00000000`0013fab0 00000000`77d59620 ntdll!KiUserApcDispatch+0x15
    
    00000000`0013ffa8 00000000`00000000 0x77d59620
    
    00000000`0013ffb0 00000000`00000000 0x0
    
    00000000`0013ffb8 00000000`00000000 0x0
    
    00000000`0013ffc0 00000000`00000000 0x0
    
    00000000`0013ffc8 00000000`00000000 0x0
    
    00000000`0013ffd0 00000000`00000000 0x0
    
    00000000`0013ffd8 00000000`00000000 0x0
    
    00000000`0013ffe0 00000000`00000000 0x0
    
    00000000`0013ffe8 00000000`00000000 0x0
    
    00000000`0013fff0 00000000`00000000 0x0
    
    00000000`0013fff8 00000000`00000000 0x0
    
    00000000`00140000 00000020`78746341 0x0
    
    00000000`00140008 00005370`00000001 0x20`78746341
    
    Walking 32bit Stack...
    
    ChildEBP RetAddr
    
    002ded98 75ec1c83 USER32!NtUserWaitMessage+0x15
    
    002dee24 75ec61ef BROWSEUI!BrowserProtectedThreadProc+0x44
    
    002dfea8 779ba3a6 BROWSEUI!SHOpenFolderWindow+0x22c
    
    002dfec8 0040243d SHDOCVW!IEWinMain+0x129
    
    002dff1c 00402748 IEXPLORE!WinMain+0x316
    
    002dffc0 7d4e7d2a IEXPLORE!WinMainCRTStartup+0x186
    
    002dfff0 00000000 KERNEL32!BaseProcessStart+0x28

    Option 2 : 切换到x86模式 (using “!wow64exts.sw”) and do KB.

    0:000> !wow64exts.sw
    
    Switched to 32bit mode
    
    0:000:x86> kb
    
    ChildEBP RetAddr Args to Child
    
    002ded98 75ec1c83 002f1be8 002dee50 002f1be8 USER32!NtUserWaitMessage+0x15
    
    002dee24 75ec61ef 002f1be8 002f1be8 00000000 BROWSEUI!BrowserProtectedThreadProc+0x44
    
    002dfea8 779ba3a6 002f1be8 00000001 00000000 BROWSEUI!SHOpenFolderWindow+0x22c
    
    002dfec8 0040243d 002e2508 00000001 ffffffff SHDOCVW!IEWinMain+0x129
    
    002dff1c 00402748 00400000 00000000 002e2508 IEXPLORE!WinMain+0x316
    
    002dffc0 7d4e7d2a 00000000 00000000 7efdf000 IEXPLORE!WinMainCRTStartup+0x186
    
    002dfff0 00000000 004025c2 00000000 000000c8 KERNEL32!BaseProcessStart+0x28

    查看所有32位调用堆栈的最简单方法是切换到32位模式(!wow64exts.sw)此外,还可以使用64位调试器在32位或64位二进制文件中设置断点。还要注意“!peb将同时显示64位和32位peb。

    使用32位调试器

    如前所述,使用32位调试器没有任何问题。如果您只需要调试应用程序的32位代码,那么使用它可能是最简单的方法。但是,如果需要查看Wow64代码或二进制文件,则必须使用64位调试器。请注意,这些技术适用于调试Wow64转储和实时进程。

  • 相关阅读:
    Scrum Meeting Alpha
    Scrum Meeting Alpha
    Scrum Meeting Alpha
    你连自律都做不到,还奢谈什么自由?
    改变这个世界
    这世界没有人能随随便便成功
    “沙堆实验”
    解读那些年我们见过的“富人思维”
    心存希望,面朝大海
    闻香识女人 演讲台词
  • 原文地址:https://www.cnblogs.com/yilang/p/13617211.html
Copyright © 2020-2023  润新知