如何调试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转储和实时进程。

原文地址:https://www.cnblogs.com/yilang/p/13617211.html