最近,我處理了一個問題,在系統帳戶下安裝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 Explorer\IEXPLORE.EXE 77ec0000 45d6cc72 Feb 17 03:35:46 2007 C:\WINDOWS\system32\ntdll.dll 6b000000 45d6943d Feb 16 23:35:57 2007 C:\WINDOWS\system32\wow64.dll 6b280000 45d695f3 Feb 16 23:43:15 2007 C:\WINDOWS\system32\wow64win.dll 78b80000 42438b7a Mar 24 21:54:34 2005 C:\WINDOWS\system32\wow64cpu.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轉儲和實時進程。