如何調試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 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轉儲和實時進程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM