Zine.net online

Witaj na Zine.net online Zaloguj się | Rejestracja | Pomoc
w Szukaj

mgrzeg.net - Admin on Rails :)

32/64 = ? czyli o dumpach aplikacji 32-bitowych na systemach 64-bitowych słów kilka

Na dobrą sprawę notka powinna kończyć się na krótkim stwierdzeniu: do zrzutów procesów należy używać tylko aplikacji o tej samej 'bitowości', co zrzucana aplikacja. Nie byłbym jednak sobą, gdybym nie postanowił przyjrzeć się nieco bliżej problemowi.

W systemie 64-bitowym wszystkie procesy są 64-bitowe. Kropka. Aplikacje 32-bitowe uruchomione są w trybie emulacji w ramach WOW64, jednak dla systemu dalej są to procesy 64-bitowe, choć z pewnymi rozszerzeniami związanymi z architekturą - a więc dodatkowymi strukturami TEB oraz PEB w trybie użytkownika, a także innymi w trybie jądra, z których korzysta aplikacja 32-bitowa. Nie o WOW64 jednak będę pisał, a o zrzutach procesów.

Zacznijmy od prostej aplikacji typu ‘Hello world’, którą kompilujemy pod platformę x86:

//Basic.cs
using System;
namespace pl.net.zine.Articles
{
  class Basic
  {
    public static void Main(string[] args)
    {
      Console.WriteLine("Ala ma kota!");
      Console.ReadLine();
    }
  }
}

Przygotujmy dwie kompilacje: x64 oraz x86 (przy czym pamiętajmy, żeby uruchamiać odpowiednie wersje csc):

>csc /target:exe /platform:x64 /debug+ /out:basicx64.exe /pdb:basicx64.pdb Basic.cs
>csc /target:exe /platform:x86 /debug+ /out:basicx86.exe /pdb:basicx86.pdb Basic.cs

64-bit

Testy rozpoczynamy od aplikacji 64-bitowej. Uruchamiamy zatem basicx64.exe i po pojawieniu się “Ala ma kota” próbujemy zrobić zrzut dowolną aplikacją 64-bitową, a więc: z poziomu menadżera zadań, procdumpa, process hackera, process explorera, etc. Gdy spróbujemy wykonać zrzut korzystając z wersji 32-bitowej którejkolwiek z wymienionych wyżej aplikacji (32-bitowy taskmgr.exe w systemie 64-bit znajdziemy w %SystemRoot%\SysWOW64\taskmgr.exe), w najlepszym wypadku natniemy się najprawdopodobniej na komunikat:

"Operacja nie może być zakończona.
Ukończono tylko część żądania ReadProcessMemory lub WriteProcessMemory"

i z dumpu nici.

WinDbg 64-bit

Ładujemy teraz 64-bitowy dump 64-bitowej aplikacji do 64-bit WinDbg i próbujemy skorzystać z najprostszych rzeczy:

0:000> .reload /f
.*** WARNING: Unable to verify checksum for basicx64.exe
...................*** WARNING: Unable to verify checksum for mscorlib.ni.dll
.....
0:000> lm
start             end                 module name
00000000`00c40000 00000000`00c46000   basicx64 C (private pdb symbols)  c:\Roboczy\Programming\Projects\Zine\Articles\basicx64.pdb
00000000`76ae0000 00000000`76bff000   kernel32   (pdb symbols)          c:\websymbols\kernel32.pdb\9B30FD7CD6B44975BF34B43B6EF668212\kernel32.pdb
00000000`76c00000 00000000`76cfa000   user32     (pdb symbols)          c:\websymbols\user32.pdb\953B04792B8A48B2883930E36FD22A6A2\user32.pdb
00000000`76e60000 00000000`77009000   ntdll      (pdb symbols)          c:\websymbols\ntdll.pdb\15EB43E23B12409C84E3CC7635BAF5A32\ntdll.pdb
000007fe`e7aa0000 000007fe`e8d17000   mscorlib_ni C (pdb symbols)          c:\websymbols\mscorlib.pdb\ED96A7F38A2940F39B9CA7AD9BC5CB671\mscorlib.pdb
000007fe`e8d20000 000007fe`e9684000   clr        (pdb symbols)          c:\websymbols\clr.pdb\887DDF30473443C9905C3217115D7DE72\clr.pdb
000007fe`ecd50000 000007fe`ecec3000   clrjit     (pdb symbols)          c:\websymbols\clrjit.pdb\CADF8E4D575C48DF8E08A6C23EAB983A2\clrjit.pdb
000007fe`ed190000 000007fe`ed261000   MSVCR100_CLR0400   (pdb symbols)          c:\websymbols\msvcr100_clr0400.amd64.pdb\3DC0102E97254026903019440F0D316F1\msvcr100_clr0400.amd64.pdb
000007fe`f1180000 000007fe`f1194000   nlssorting   (pdb symbols)          c:\websymbols\nlssorting.pdb\D1F720B2911448158490974D466C86332\nlssorting.pdb
000007fe`f9580000 000007fe`f9610000   mscoreei   (pdb symbols)          c:\websymbols\mscoreei.pdb\F2445BD7B5494942A39C87ED630879A92\mscoreei.pdb
000007fe`f9610000 000007fe`f967f000   mscoree    (pdb symbols)          c:\websymbols\mscoree.pdb\FB53EF9DD104439E9903F0B34128E0392\mscoree.pdb
000007fe`fd1b0000 000007fe`fd1bf000   CRYPTBASE   (pdb symbols)          c:\websymbols\cryptbase.pdb\F03E074BB9E74C9F9BBFB0E42EF3A0AB2\cryptbase.pdb
000007fe`fd5e0000 000007fe`fd64c000   KERNELBASE   (pdb symbols)          c:\websymbols\kernelbase.pdb\61044362232B410AA600843CEBFD11612\kernelbase.pdb
000007fe`fd730000 000007fe`fd74f000   sechost    (pdb symbols)          c:\websymbols\sechost.pdb\ED0034906F9A408C92C4F32ACFC57B291\sechost.pdb
000007fe`fd770000 000007fe`fd89d000   rpcrt4     (pdb symbols)          c:\websymbols\rpcrt4.pdb\7D748DA6D7454C9EA38C8CEF1C9E75F22\rpcrt4.pdb
000007fe`fd8a0000 000007fe`fd8ce000   imm32      (pdb symbols)          c:\websymbols\imm32.pdb\98F27BA5AEE541ECBEE00CD03AD50FEE2\imm32.pdb
000007fe`fd8d0000 000007fe`fd9ab000   advapi32   (pdb symbols)          c:\websymbols\advapi32.pdb\6AEFDCFF7F2A429B8532CD2BFDDF85D12\advapi32.pdb
000007fe`fda10000 000007fe`fdad9000   usp10      (pdb symbols)          c:\websymbols\usp10.pdb\DB4EC1196F91457FBB0A462D9D0AFEC31\usp10.pdb
000007fe`fdaf0000 000007fe`fdb8f000   msvcrt     (pdb symbols)          c:\websymbols\msvcrt.pdb\047EACB4C8FA442BBAEF06CE45CC1A782\msvcrt.pdb
000007fe`fdb90000 000007fe`fdc99000   msctf      (pdb symbols)          c:\websymbols\msctf.pdb\6A5BABB8E88644C696530BFE3C90F32F2\msctf.pdb
000007fe`fdca0000 000007fe`fdd07000   gdi32      (pdb symbols)          c:\websymbols\gdi32.pdb\FB9403C3B1304DA192C4D0E3485E25ED2\gdi32.pdb
000007fe`feb40000 000007fe`fec17000   oleaut32   (pdb symbols)          c:\websymbols\oleaut32.pdb\B72B1CEEA01B4992A56397FF5C52DB3C2\oleaut32.pdb
000007fe`fec70000 000007fe`fece1000   shlwapi    (pdb symbols)          c:\websymbols\shlwapi.pdb\0820A0750C1A4E2597E17DEA57D049542\shlwapi.pdb
000007fe`fecf0000 000007fe`feef3000   ole32      (pdb symbols)          c:\websymbols\ole32.pdb\EE489189724F4D47AECCFDB5534824352\ole32.pdb
000007fe`fef80000 000007fe`fef8e000   lpk        (pdb symbols)          c:\websymbols\lpk.pdb\B653B2B751414F90BE8A8BBE222F17782\lpk.pdb
0:000> k
Child-SP          RetAddr           Call Site
00000000`004fe418 00000000`76b02ef8 ntdll!NtRequestWaitReplyPort+0xa
00000000`004fe420 00000000`76b352d1 kernel32!ConsoleClientCallServer+0x54
00000000`004fe450 00000000`76b4a712 kernel32!ReadConsoleInternal+0x1f1
00000000`004fe5a0 00000000`76b18db4 kernel32!ReadConsoleA+0xb2
00000000`004fe680 000007fe`e8d217c7 kernel32!TlsGetValue+0x899e
00000000`004fe6c0 000007fe`e7ec3431 clr!DoNDirectCall__PatchGetThreadCall+0x7b
00000000`004fe770 000007fe`e867e84a mscorlib_ni+0x423431
00000000`004fe890 000007fe`e867e4a2 mscorlib_ni+0xbde84a
00000000`004fe900 000007fe`e7e7e50c mscorlib_ni+0xbde4a2
00000000`004fe960 000007fe`e7e7d2e0 mscorlib_ni+0x3de50c
00000000`004fe9b0 000007fe`e8686830 mscorlib_ni+0x3dd2e0
00000000`004fea10 000007ff`00170157 mscorlib_ni+0xbe6830
00000000`004fea70 000007fe`e8d49714 0x7ff`00170157
00000000`004feab0 000007fe`e8d49829 clr!CallDescrWorker+0x84
00000000`004feb00 000007fe`e8d498a5 clr!CallDescrWorkerWithHandler+0xa9
00000000`004feb80 000007fe`e8ee6651 clr!MethodDesc::CallDescr+0x2a1
00000000`004fedb0 000007fe`e8ee6788 clr!ClassLoader::RunMain+0x228
00000000`004ff000 000007fe`e8ee653e clr!Assembly::ExecuteMainMethod+0xac
00000000`004ff2b0 000007fe`e8f05e56 clr!SystemDomain::ExecuteMainMethod+0x452
00000000`004ff860 000007fe`e8f05d73 clr!ExecuteEXE+0x43
00000000`004ff8c0 000007fe`e8ef6c6d clr!CorExeMainInternal+0xc4
00000000`004ff930 000007fe`f9583309 clr!CorExeMain+0x15
00000000`004ff970 000007fe`f9615b21 mscoreei!CorExeMain+0x41
00000000`004ff9a0 00000000`76af652d mscoree!CorExeMain_Exported+0x57
00000000`004ff9d0 00000000`76e8c521 kernel32!BaseThreadInitThunk+0xd
00000000`004ffa00 00000000`00000000 ntdll!RtlUserThreadStart+0x1d
0:000> .loadby sos clr
0:000> .load sosex
0:000> !mk
Thread 0:
     ESP              EIP
00:U 00000000004fe418 0000000076eb153a ntdll!NtRequestWaitReplyPort+0xa
01:U 00000000004fe420 0000000076b02ef8 kernel32!ConsoleClientCallServer+0x54
02:U 00000000004fe450 0000000076b352d1 kernel32!ReadConsoleInternal+0x1f1
03:U 00000000004fe5a0 0000000076b4a712 kernel32!ReadConsoleA+0xb2
04:U 00000000004fe680 0000000076b18db4 kernel32!TlsGetValue+0x899e
05:U 00000000004fe6c0 000007fee8d217c7 clr!DoNDirectCall__PatchGetThreadCall+0x7b
06:M 00000000004fe770 000007fee7ec3431 DomainNeutralILStubClass.IL_STUB_PInvoke(Microsoft.Win32.SafeHandles.SafeFileHandle, Byte*, Int32, Int32 ByRef, IntPtr)(+0x0 IL)(+0x0 Native)
07:M 00000000004fe890 000007fee867e84a System.IO.__ConsoleStream.ReadFileNative(Microsoft.Win32.SafeHandles.SafeFileHandle, Byte[], Int32, Int32, Int32, Int32 ByRef)(+0x53 IL)(+0xba Native)
08:M 00000000004fe900 000007fee867e4a2 System.IO.__ConsoleStream.Read(Byte[], Int32, Int32)(+0x5d IL)(+0x62 Native)
09:M 00000000004fe960 000007fee7e7e50c System.IO.StreamReader.ReadBuffer()(+0xa0 IL)(+0x5c Native)
0a:M 00000000004fe9b0 000007fee7e7d2e0 System.IO.StreamReader.ReadLine()(+0x21 IL)(+0x130 Native)
0b:M 00000000004fea10 000007fee8686830 System.IO.TextReader+SyncTextReader.ReadLine()(+0x0 IL)(+0x40 Native)
0c:M 00000000004fea70 000007ff00170157 pl.net.zine.Articles.Basic.Main(System.String[])(+0xc IL)(+0x37 Native) [c:\Roboczy\Programming\Projects\Zine\Articles\Basic.cs @ 10,7]
0d:U 00000000004feab0 000007fee8d49714 clr!CallDescrWorker+0x84
0e:U 00000000004feb00 000007fee8d49829 clr!CallDescrWorkerWithHandler+0xa9
0f:U 00000000004feb80 000007fee8d498a5 clr!MethodDesc::CallDescr+0x2a1
10:U 00000000004fedb0 000007fee8ee6651 clr!ClassLoader::RunMain+0x228
11:U 00000000004ff000 000007fee8ee6788 clr!Assembly::ExecuteMainMethod+0xac
12:U 00000000004ff2b0 000007fee8ee653e clr!SystemDomain::ExecuteMainMethod+0x452
13:U 00000000004ff860 000007fee8f05e56 clr!ExecuteEXE+0x43
14:U 00000000004ff8c0 000007fee8f05d73 clr!CorExeMainInternal+0xc4
15:U 00000000004ff930 000007fee8ef6c6d clr!CorExeMain+0x15
16:U 00000000004ff970 000007fef9583309 mscoreei!CorExeMain+0x41
17:U 00000000004ff9a0 000007fef9615b21 mscoree!CorExeMain_Exported+0x57
18:U 00000000004ff9d0 0000000076af652d kernel32!BaseThreadInitThunk+0xd
19:U 00000000004ffa00 0000000076e8c521 ntdll!RtlUserThreadStart+0x1d
0:000> !clrstack -a
OS Thread Id: 0x2280 (0)
Child SP         IP               Call Site
00000000004fe7c8 0000000076eb153a [NDirectMethodFrameStandalone: 00000000004fe7c8] System.IO.__ConsoleStream.ReadFile(Microsoft.Win32.SafeHandles.SafeFileHandle, Byte*, Int32, Int32 ByRef, IntPtr)
00000000004fe770 000007fee7ec3431 DomainNeutralILStubClass.IL_STUB_PInvoke(Microsoft.Win32.SafeHandles.SafeFileHandle, Byte*, Int32, Int32 ByRef, IntPtr)
    PARAMETERS:
        <no data>
        <no data>
        <no data>
        <no data>
        <no data>
00000000004fe890 000007fee867e84a System.IO.__ConsoleStream.ReadFileNative(Microsoft.Win32.SafeHandles.SafeFileHandle, Byte[], Int32, Int32, Int32, Int32 ByRef)
    PARAMETERS:
        hFile = <no data>
        bytes = <no data>
        offset = <no data>
        count = <no data>
        mustBeZero = <no data>
        errorCode (0x00000000004fe928) = 0x00000000004fe930
    LOCALS:
        <no data>
        0x00000000004fe8c0 = 0x0000000000000000
        <no data>
        <no data>
00000000004fe900 000007fee867e4a2 System.IO.__ConsoleStream.Read(Byte[], Int32, Int32)
    PARAMETERS:
        this = <no data>
        buffer = <no data>
        offset = <no data>
        count = <no data>
    LOCALS:
        0x00000000004fe930 = 0x0000000000000000
        <no data>
00000000004fe960 000007fee7e7e50c System.IO.StreamReader.ReadBuffer()
    PARAMETERS:
        this = <no data>
    LOCALS:
        <no data>
00000000004fe9b0 000007fee7e7d2e0 System.IO.StreamReader.ReadLine()
    PARAMETERS:
        this = <no data>
    LOCALS:
        <no data>
        <no data>
        <no data>
        <no data>
00000000004fea10 000007fee8686830 System.IO.TextReader+SyncTextReader.ReadLine()
    PARAMETERS:
        this (0x00000000004fea70) = 0x0000000002cc3508
00000000004fea70 000007ff00170157 pl.net.zine.Articles.Basic.Main(System.String[]) [c:\Roboczy\Programming\Projects\Zine\Articles\Basic.cs @ 10]
    PARAMETERS:
        args (0x00000000004feab0) = 0x0000000002cc1c08
00000000004fee80 000007fee8d49714 [GCFrame: 00000000004fee80]

Ach i och - nie ma się do czego przyczepić - wszystkie polecenia działają prawidłowo, stos wywołań - zarówno natywny jak i zarządzany - piękne i bez zmarszczek :)

WinDbg 32-bit

Gdy spróbujemy załadować ten sam 64-bit zrzut do 32-bitowego WinDbg, to

0:000> .reload /f
.*** WARNING: Unable to verify checksum for basicx64.exe
...................*** WARNING: Unable to verify checksum for mscorlib.ni.dll
.....
0:000> k
Child-SP          RetAddr           Call Site
00000000`004fe418 00000000`76b02ef8 ntdll!NtRequestWaitReplyPort+0xa
00000000`004fe420 00000000`76b352d1 kernel32!ConsoleClientCallServer+0x54
00000000`004fe450 00000000`76b4a712 kernel32!ReadConsoleInternal+0x1f1
00000000`004fe5a0 00000000`76b18db4 kernel32!ReadConsoleA+0xb2
00000000`004fe680 000007fe`e8d217c7 kernel32!TlsGetValue+0x899e
00000000`004fe6c0 000007fe`e7ec3431 clr!DoNDirectCall__PatchGetThreadCall+0x7b
00000000`004fe770 000007fe`e867e84a mscorlib_ni+0x423431
00000000`004fe890 000007fe`e867e4a2 mscorlib_ni+0xbde84a
00000000`004fe900 000007fe`e7e7e50c mscorlib_ni+0xbde4a2
00000000`004fe960 000007fe`e7e7d2e0 mscorlib_ni+0x3de50c
00000000`004fe9b0 000007fe`e8686830 mscorlib_ni+0x3dd2e0
00000000`004fea10 000007ff`00170157 mscorlib_ni+0xbe6830
00000000`004fea70 000007fe`e8d49714 0x7ff`00170157
00000000`004feab0 000007fe`e8d49829 clr!CallDescrWorker+0x84
00000000`004feb00 000007fe`e8d498a5 clr!CallDescrWorkerWithHandler+0xa9
00000000`004feb80 000007fe`e8ee6651 clr!MethodDesc::CallDescr+0x2a1
00000000`004fedb0 000007fe`e8ee6788 clr!ClassLoader::RunMain+0x228
00000000`004ff000 000007fe`e8ee653e clr!Assembly::ExecuteMainMethod+0xac
00000000`004ff2b0 000007fe`e8f05e56 clr!SystemDomain::ExecuteMainMethod+0x452
00000000`004ff860 000007fe`e8f05d73 clr!ExecuteEXE+0x43

zrzut stosu natywnego jeszcze działa, natomiast próba załadowania biblioteki z rozszerzeniami dla .NET

0:000> .loadby sos clr
The call to LoadLibrary(C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos) failed, Win32 error 0n193
    "%1 nie jest prawidłową aplikacją systemu Win32."
Please check your debugger configuration and/or network access.

kończy się porażką i z dalszej analizy nici.

Znacznie ciekawiej wygląda sytuacja, gdy mamy do czynienia z aplikacją 32-bitową uruchomioną w WOW64. Zresztą sami popatrzcie.

32-bit

Przechodzimy do aplikacji 32-bitowej. Uruchamiamy zatem basicx86.exe i po pojawieniu się “Ala ma kota” próbujemy podobnie jak poprzednio zrobić zrzut aplikacją 64 bitową (procdump w tej sytuacji domyślnie robi zrzut 32-bitowy i aby go zmusić do zrobienia zrzutu 64-bit, musimy dorzucić -64 do listy parametrów), a następnie 32-bitową. W rezultacie, w przeciwieństwie do aplikacji 64-bit, tym razem mamy dwa zrzuty: 64-bit oraz 32-bit.

Dump 32-bitowy, WinDbg 64-bit

Sytuacja bardzo podobna do tej, w której mieliśmy aplikację i dump 64-bit, jednak WinDbg 32-bit:

0:000> .reload /f
.*** WARNING: Unable to verify checksum for basicx86.exe
.....................*** WARNING: Unable to verify checksum for mscorlib.ni.dll
...
0:000> lm
start    end        module name
00800000 00808000   basicx86 C (private pdb symbols)  c:\Roboczy\Programming\Projects\Zine\Articles\basicx86.pdb
50000000 50060000   clrjit     (pdb symbols)          c:\websymbols\clrjit.pdb\16915893FAB94FDF97A1BD2560D613922\clrjit.pdb
51ea0000 52c61000   mscorlib_ni C (pdb symbols)          c:\websymbols\mscorlib.pdb\C99F0001592849ADA9A55A463ED5298A1\mscorlib.pdb
52c70000 52d2e000   MSVCR100_CLR0400   (pdb symbols)          c:\websymbols\msvcr100_clr0400.i386.pdb\C128595F51E243469FDE9FA0CC7EBFDF2\msvcr100_clr0400.i386.pdb
52d30000 5339e000   clr        (pdb symbols)          c:\websymbols\clr.pdb\24BB9263C8664EB7BD655541A3FDE30D2\clr.pdb
57020000 57030000   nlssorting   (pdb symbols)          c:\websymbols\nlssorting.pdb\DF2D962FFA334BB594C69F34878577DB2\nlssorting.pdb
631e0000 63247000   mscoreei   (pdb symbols)          c:\websymbols\mscoreei.pdb\E4BEBEB38C824FA3A004F6133812A0C22\mscoreei.pdb
63250000 6329a000   mscoree    (pdb symbols)          c:\websymbols\mscoree.pdb\5EB01A03276E4F6BB974E19A522150E12\mscoree.pdb
74710000 7471c000   CRYPTBASE   (pdb symbols)          c:\websymbols\cryptbase.pdb\E62FEAE559EE4CD995614215B01AC2102\cryptbase.pdb
74720000 74780000   sspicli    (pdb symbols)          c:\websymbols\wsspicli.pdb\FE5709E8439B4232A456084643D47B861\wsspicli.pdb
74780000 747d7000   shlwapi    (pdb symbols)          c:\websymbols\shlwapi.pdb\E128B1CEE2EB438C8646E6967118F33E2\shlwapi.pdb
747e0000 74840000   imm32      (pdb symbols)          c:\websymbols\wimm32.pdb\35DD4069EB2A43BF869D6E311FAD09452\wimm32.pdb
75790000 758ec000   ole32      (pdb symbols)          c:\websymbols\ole32.pdb\5061F11A9A57433595EA5EA75A156F4B2\ole32.pdb
759e0000 75aac000   msctf      (pdb symbols)          c:\websymbols\msctf.pdb\173DAEF86B2548DBA6134EB74C4D2F232\msctf.pdb
75ab0000 75af6000   KERNELBASE   (pdb symbols)          c:\websymbols\wkernelbase.pdb\FDF353DA71FE45CD953EBEC8ED6D14AB1\wkernelbase.pdb
75dd0000 75ee0000   kernel32   (pdb symbols)          c:\websymbols\wkernel32.pdb\DFB4E9EBD1654DB2ACF1290CD316CEA22\wkernel32.pdb
75ee0000 75fe0000   user32     (pdb symbols)          c:\websymbols\wuser32.pdb\0FCE9CC301ED4567A819705B2718E1D62\wuser32.pdb
75fe0000 7608c000   msvcrt     (pdb symbols)          c:\websymbols\msvcrt.pdb\6EC79267530C45188F2A816AD59DBBF92\msvcrt.pdb
761e0000 761ea000   lpk        (pdb symbols)          c:\websymbols\wlpk.pdb\C39166A53CCE43F0ADF876B9C637A1EA1\wlpk.pdb
761f0000 76290000   advapi32   (pdb symbols)          c:\websymbols\advapi32.pdb\3F32049F550C42B09CF114A1FB8A97E92\advapi32.pdb
76290000 762a9000   sechost    (pdb symbols)          c:\websymbols\sechost.pdb\7AF14D02D41E4CD6942745FE0E6372B11\sechost.pdb
762b0000 76340000   gdi32      (pdb symbols)          c:\websymbols\wgdi32.pdb\08A541B5942242BDB4AEABD8C87E4CFF2\wgdi32.pdb
76560000 76650000   rpcrt4     (pdb symbols)          c:\websymbols\wrpcrt4.pdb\FAC24015130D4D7FAAA77EA36ED5AF1C2\wrpcrt4.pdb
766e0000 7677d000   usp10      (pdb symbols)          c:\websymbols\usp10.pdb\F49786E2C7C54EA99E7C37120CDAEB9C1\usp10.pdb
77040000 771c0000   ntdll      (pdb symbols)          c:\websymbols\wntdll.pdb\D74F79EB1F8D4A45ABCD2F476CCABACC2\wntdll.pdb
0:000> k
ChildEBP RetAddr
0014edb4 75e87339 kernel32!ReadConsoleInternal+0x15
0014ee3c 75e0f1b2 kernel32!ReadConsoleA+0x40
0014ee84 52161c8b kernel32!ReadFileImplementation+0x75
0014ef04 527d7cc8 mscorlib_ni+0x2c1c8b
0014ef2c 527d7f60 mscorlib_ni+0x937cc8
0014ef54 52118bfb mscorlib_ni+0x937f60
0014ef70 520f560a mscorlib_ni+0x278bfb
0014ef90 527de6f5 mscorlib_ni+0x25560a
0014efa0 526ca7aa mscorlib_ni+0x93e6f5
0014efb4 52d321bb mscorlib_ni+0x82a7aa
0014efc4 52d54be2 clr!CallDescrWorker+0x33
0014f040 52d54d84 clr!CallDescrWorkerWithHandler+0x8e
0014f178 52d54db9 clr!MethodDesc::CallDescr+0x194
0014f194 52d54dd9 clr!MethodDesc::CallTargetWorker+0x21
0014f1ac 52e873c2 clr!MethodDescCallSite::Call_RetArgSlot+0x1c
0014f310 52e874d0 clr!ClassLoader::RunMain+0x24c
0014f578 52e872e4 clr!Assembly::ExecuteMainMethod+0xc1
0014fa5c 52e876d9 clr!SystemDomain::ExecuteMainMethod+0x4ec
0014fab0 52e875da clr!ExecuteEXE+0x58
0014fafc 52e04a98 clr!_CorExeMainInternal+0x19f
0014fb34 631e55ab clr!_CorExeMain+0x4e
0014fb40 63257f16 mscoreei!_CorExeMain+0x38
0014fb50 63254de3 mscoree!ShellShim__CorExeMain+0x99
0014fb58 75de339a mscoree!_CorExeMain_Exported+0x8
0014fb64 77079ef2 kernel32!BaseThreadInitThunk+0xe
0014fba4 77079ec5 ntdll!__RtlUserThreadStart+0x70
0014fbbc 00000000 ntdll!_RtlUserThreadStart+0x1b
0:000> .loadby sos clr
The call to LoadLibrary(C:\Windows\Microsoft.NET\Framework\v4.0.30319\sos) failed, Win32 error 0n193
    "%1 nie jest prawidłową aplikacją systemu Win32."
Please check your debugger configuration and/or network access.

Jak widać natywny stos udało się bez problemu zrzucić, jednak załadowanie sos jest niemożliwe. Możemy oczywiście spróbować załadować ręcznie sos 64-bit:

0:000> .load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll
0:000> !clrstack -a
Failed to load data access DLL, 0x80004005
Verify that 1) you have a recent build of the debugger (6.2.14 or newer)
            2) the file mscordacwks.dll that matches your version of clr.dll is
                in the version directory
            3) or, if you are debugging a dump file, verify that the file
                mscordacwks_<arch>_<arch>_<version>.dll is on your symbol path.
            4) you are debugging on the same architecture as the dump file.
                For example, an IA64 dump file must be debugged on an IA64
                machine.
You can also run the debugger command .cordll to control the debugger's
load of mscordacwks.dll.  .cordll -ve -u -l will do a verbose reload.
If that succeeds, the SOS command should work on retry.
If you are debugging a minidump, you need to make sure that your executable
path is pointing to clr.dll as well.

jednak nic nam to nie daje, ponieważ mamy niezgodność z mscordacwks, bez którego analiza aplikacji .NET jest niemożliwa.

Dump 32-bitowy, WinDbg 32-bit

Sytuacja idealna. Wszystko w odpowiednich wersjach, żadnych problemów z analizą:

0:000> .reload /f
.*** WARNING: Unable to verify checksum for basicx86.exe
.....................*** WARNING: Unable to verify checksum for mscorlib.ni.dll
...
0:000> lm
start    end        module name
00800000 00808000   basicx86 C (private pdb symbols)  c:\Roboczy\Programming\Projects\Zine\Articles\basicx86.pdb
50000000 50060000   clrjit     (pdb symbols)          c:\websymbols\clrjit.pdb\16915893FAB94FDF97A1BD2560D613922\clrjit.pdb
51ea0000 52c61000   mscorlib_ni C (pdb symbols)          c:\websymbols\mscorlib.pdb\C99F0001592849ADA9A55A463ED5298A1\mscorlib.pdb
52c70000 52d2e000   MSVCR100_CLR0400   (pdb symbols)          c:\websymbols\msvcr100_clr0400.i386.pdb\C128595F51E243469FDE9FA0CC7EBFDF2\msvcr100_clr0400.i386.pdb
52d30000 5339e000   clr        (pdb symbols)          c:\websymbols\clr.pdb\24BB9263C8664EB7BD655541A3FDE30D2\clr.pdb
57020000 57030000   nlssorting   (pdb symbols)          c:\websymbols\nlssorting.pdb\DF2D962FFA334BB594C69F34878577DB2\nlssorting.pdb
631e0000 63247000   mscoreei   (pdb symbols)          c:\websymbols\mscoreei.pdb\E4BEBEB38C824FA3A004F6133812A0C22\mscoreei.pdb
63250000 6329a000   mscoree    (pdb symbols)          c:\websymbols\mscoree.pdb\5EB01A03276E4F6BB974E19A522150E12\mscoree.pdb
74710000 7471c000   CRYPTBASE   (pdb symbols)          c:\websymbols\cryptbase.pdb\E62FEAE559EE4CD995614215B01AC2102\cryptbase.pdb
74720000 74780000   sspicli    (pdb symbols)          c:\websymbols\wsspicli.pdb\FE5709E8439B4232A456084643D47B861\wsspicli.pdb
74780000 747d7000   shlwapi    (pdb symbols)          c:\websymbols\shlwapi.pdb\E128B1CEE2EB438C8646E6967118F33E2\shlwapi.pdb
747e0000 74840000   imm32      (pdb symbols)          c:\websymbols\wimm32.pdb\35DD4069EB2A43BF869D6E311FAD09452\wimm32.pdb
75790000 758ec000   ole32      (pdb symbols)          c:\websymbols\ole32.pdb\5061F11A9A57433595EA5EA75A156F4B2\ole32.pdb
759e0000 75aac000   msctf      (pdb symbols)          c:\websymbols\msctf.pdb\173DAEF86B2548DBA6134EB74C4D2F232\msctf.pdb
75ab0000 75af6000   KERNELBASE   (pdb symbols)          c:\websymbols\wkernelbase.pdb\FDF353DA71FE45CD953EBEC8ED6D14AB1\wkernelbase.pdb
75dd0000 75ee0000   kernel32   (pdb symbols)          c:\websymbols\wkernel32.pdb\DFB4E9EBD1654DB2ACF1290CD316CEA22\wkernel32.pdb
75ee0000 75fe0000   user32     (pdb symbols)          c:\websymbols\wuser32.pdb\0FCE9CC301ED4567A819705B2718E1D62\wuser32.pdb
75fe0000 7608c000   msvcrt     (pdb symbols)          c:\websymbols\msvcrt.pdb\6EC79267530C45188F2A816AD59DBBF92\msvcrt.pdb
761e0000 761ea000   lpk        (pdb symbols)          c:\websymbols\wlpk.pdb\C39166A53CCE43F0ADF876B9C637A1EA1\wlpk.pdb
761f0000 76290000   advapi32   (pdb symbols)          c:\websymbols\advapi32.pdb\3F32049F550C42B09CF114A1FB8A97E92\advapi32.pdb
76290000 762a9000   sechost    (pdb symbols)          c:\websymbols\sechost.pdb\7AF14D02D41E4CD6942745FE0E6372B11\sechost.pdb
762b0000 76340000   gdi32      (pdb symbols)          c:\websymbols\wgdi32.pdb\08A541B5942242BDB4AEABD8C87E4CFF2\wgdi32.pdb
76560000 76650000   rpcrt4     (pdb symbols)          c:\websymbols\wrpcrt4.pdb\FAC24015130D4D7FAAA77EA36ED5AF1C2\wrpcrt4.pdb
766e0000 7677d000   usp10      (pdb symbols)          c:\websymbols\usp10.pdb\F49786E2C7C54EA99E7C37120CDAEB9C1\usp10.pdb
77040000 771c0000   ntdll      (pdb symbols)          c:\websymbols\wntdll.pdb\D74F79EB1F8D4A45ABCD2F476CCABACC2\wntdll.pdb
0:000> k
ChildEBP RetAddr
0014edb4 75e87339 kernel32!ReadConsoleInternal+0x15
0014ee3c 75e0f1b2 kernel32!ReadConsoleA+0x40
0014ee84 52161c8b kernel32!ReadFileImplementation+0x75
0014ef04 527d7cc8 mscorlib_ni+0x2c1c8b
0014ef2c 527d7f60 mscorlib_ni+0x937cc8
0014ef54 52118bfb mscorlib_ni+0x937f60
0014ef70 520f560a mscorlib_ni+0x278bfb
0014ef90 527de6f5 mscorlib_ni+0x25560a
0014efa0 526ca7aa mscorlib_ni+0x93e6f5
0014efb4 52d321bb mscorlib_ni+0x82a7aa
0014efc4 52d54be2 clr!CallDescrWorker+0x33
0014f040 52d54d84 clr!CallDescrWorkerWithHandler+0x8e
0014f178 52d54db9 clr!MethodDesc::CallDescr+0x194
0014f194 52d54dd9 clr!MethodDesc::CallTargetWorker+0x21
0014f1ac 52e873c2 clr!MethodDescCallSite::Call_RetArgSlot+0x1c
0014f310 52e874d0 clr!ClassLoader::RunMain+0x24c
0014f578 52e872e4 clr!Assembly::ExecuteMainMethod+0xc1
0014fa5c 52e876d9 clr!SystemDomain::ExecuteMainMethod+0x4ec
0014fab0 52e875da clr!ExecuteEXE+0x58
0014fafc 52e04a98 clr!_CorExeMainInternal+0x19f
0:000> .loadby sos clr
0:000> .load sosex
0:000> !mk
Thread 0:
     ESP      EIP
00:U 0014edb4 75e876e2 kernel32!ReadConsoleInternal+0x15
01:U 0014edbc 75e87339 kernel32!ReadConsoleA+0x40
02:U 0014ee44 75e0f1b2 kernel32!ReadFileImplementation+0x75
03:M 0014ee8c 52161c8b DomainNeutralILStubClass.IL_STUB_PInvoke(Microsoft.Win32.SafeHandles.SafeFileHandle, Byte*, Int32, Int32 ByRef, IntPtr)(+0x0 IL)(+0x0 Native)
04:M 0014ef0c 527d7cc8 System.IO.__ConsoleStream.ReadFileNative(Microsoft.Win32.SafeHandles.SafeFileHandle, Byte[], Int32, Int32, Int32, Int32 ByRef)(+0x53 IL)(+0x8c Native)
05:M 0014ef34 527d7f60 System.IO.__ConsoleStream.Read(Byte[], Int32, Int32)(+0x5d IL)(+0x9c Native)
06:M 0014ef5c 52118bfb System.IO.StreamReader.ReadBuffer()(+0xa0 IL)(+0x3b Native)
07:M 0014ef78 520f560a System.IO.StreamReader.ReadLine()(+0x1b IL)(+0x16e Native)
08:M 0014ef98 527de6f5 System.IO.TextReader+SyncTextReader.ReadLine()(+0x0 IL)(+0x19 Native)
09:M 0014efa8 526ca7aa System.Console.ReadLine()(+0x0 IL)(+0x12 Native)
0a:M 0014efb0 002e0097 pl.net.zine.Articles.Basic.Main(System.String[])(+0x11 IL)(+0x27 Native) [c:\Roboczy\Programming\Projects\Zine\Articles\Basic.cs @ 10,7]
0b:U 0014efbc 52d321bb clr!CallDescrWorker+0x33
0c:U 0014efcc 52d54be2 clr!CallDescrWorkerWithHandler+0x8e
0d:U 0014f048 52d54d84 clr!MethodDesc::CallDescr+0x194
0e:U 0014f180 52d54db9 clr!MethodDesc::CallTargetWorker+0x21
0f:U 0014f19c 52d54dd9 clr!MethodDescCallSite::Call_RetArgSlot+0x1c
10:U 0014f1b4 52e873c2 clr!ClassLoader::RunMain+0x24c
11:U 0014f318 52e874d0 clr!Assembly::ExecuteMainMethod+0xc1
12:U 0014f580 52e872e4 clr!SystemDomain::ExecuteMainMethod+0x4ec
13:U 0014fa64 52e876d9 clr!ExecuteEXE+0x58
14:U 0014fab8 52e875da clr!_CorExeMainInternal+0x19f
15:U 0014fb04 52e04a98 clr!_CorExeMain+0x4e
16:U 0014fb3c 631e55ab mscoreei!_CorExeMain+0x38
17:U 0014fb48 63257f16 mscoree!ShellShim__CorExeMain+0x99
18:U 0014fb58 63254de3 mscoree!_CorExeMain_Exported+0x8
19:U 0014fb60 75de339a kernel32!BaseThreadInitThunk+0xe
1a:U 0014fb6c 77079ef2 ntdll!__RtlUserThreadStart+0x70
1b:U 0014fbac 77079ec5 ntdll!_RtlUserThreadStart+0x1b
0:000> !clrstack -a
OS Thread Id: 0xb5c (0)
Child SP IP       Call Site
0014eea4 75e876e2 [InlinedCallFrame: 0014eea4]
0014eea0 52161c8b DomainNeutralILStubClass.IL_STUB_PInvoke(Microsoft.Win32.SafeHandles.SafeFileHandle, Byte*, Int32, Int32 ByRef, IntPtr)
    PARAMETERS:
        <no data>
        <no data>
        <no data>
        <no data>
        <no data>
0014eea4 527d7cc8 [InlinedCallFrame: 0014eea4] System.IO.__ConsoleStream.ReadFile(Microsoft.Win32.SafeHandles.SafeFileHandle, Byte*, Int32, Int32 ByRef, IntPtr)
0014ef18 527d7cc8 System.IO.__ConsoleStream.ReadFileNative(Microsoft.Win32.SafeHandles.SafeFileHandle, Byte[], Int32, Int32, Int32, Int32 ByRef)
    PARAMETERS:
        hFile = <no data>
        bytes = <no data>
        offset = <no data>
        count = <no data>
        mustBeZero = <no data>
        errorCode (<CLR reg>) = 0x0014ef44
    LOCALS:
        <CLR reg> = 0x00000001
        <no data>
        0x0014ef18 = 0x0233c4c8
        <no data>
0014ef44 527d7f60 System.IO.__ConsoleStream.Read(Byte[], Int32, Int32)
    PARAMETERS:
        this = <no data>
        buffer = <no data>
        offset = <no data>
        count = <no data>
    LOCALS:
        0x0014ef44 = 0x00000000
        <no data>
0014ef64 52118bfb System.IO.StreamReader.ReadBuffer()
    PARAMETERS:
        this (<CLR reg>) = 0x0233c468
    LOCALS:
        <no data>
0014ef78 520f560a System.IO.StreamReader.ReadLine()
    PARAMETERS:
        this (<CLR reg>) = 0x0233c468
    LOCALS:
        <no data>
        <no data>
        <no data>
        <no data>
0014ef98 527de6f5 System.IO.TextReader+SyncTextReader.ReadLine()
    PARAMETERS:
        this (<CLR reg>) = 0x0233c7d8
0014efa8 526ca7aa System.Console.ReadLine()
0014efb0 002e0097 pl.net.zine.Articles.Basic.Main(System.String[]) [c:\Roboczy\Programming\Projects\Zine\Articles\Basic.cs @ 10]
    PARAMETERS:
        args (0x0014efb0) = 0x0233b5fc
0014f1e0 52d321bb [GCFrame: 0014f1e0]

Dzięki dostarczonym prywatnym symbolom mamy również informację o liniach w pliku źródłowym - identycznie jak miało to miejsce w przypadku 64/64/64.

Dump 64-bitowy, WinDbg 32-bit

Zaczynamy od podstawowych operacji

0:000> .reload /f
.*** WARNING: Unable to verify checksum for basicx86.exe
.....*** WARNING: Unable to verify checksum for basicx86.exe
..*** WARNING: symbols timestamp is wrong 0x4b9074e7 0x4b90752b for mscoree.dll
...............*** WARNING: symbols timestamp is wrong 0x4a5bdf40 0x4ce7ba53 for imm32.dll
...WARNING: MSVCR100_CLR0400 overlaps clr
*** WARNING: symbols timestamp is wrong 0x4ba2211c 0x4ba1dbf2 for MSVCR100_CLR0400.dll
.*** WARNING: Unable to verify checksum for mscorlib.ni.dll

0:000> lm
start             end                 module name
00000000`00800000 00000000`00808000   basicx86 C (private pdb symbols)  c:\Roboczy\Programming\Projects\Zine\Articles\basicx86.pdb
00000000`50000000 00000000`50060000   clrjit     (pdb symbols)          c:\websymbols\clrjit.pdb\16915893FAB94FDF97A1BD2560D613922\clrjit.pdb
00000000`51ea0000 00000000`52c61000   mscorlib_ni C (pdb symbols)          c:\websymbols\mscorlib.pdb\C99F0001592849ADA9A55A463ED5298A1\mscorlib.pdb
00000000`52c70000 00000000`52d41000   MSVCR100_CLR0400 # (pdb symbols)          c:\websymbols\msvcr100_clr0400.i386.pdb\C128595F51E243469FDE9FA0CC7EBFDF2\msvcr100_clr0400.i386.pdb
00000000`52d30000 00000000`5339e000   clr        (pdb symbols)          c:\websymbols\clr.pdb\24BB9263C8664EB7BD655541A3FDE30D2\clr.pdb
00000000`57020000 00000000`57030000   nlssorting   (pdb symbols)          c:\websymbols\nlssorting.pdb\DF2D962FFA334BB594C69F34878577DB2\nlssorting.pdb
00000000`631e0000 00000000`63247000   mscoreei   (pdb symbols)          c:\websymbols\mscoreei.pdb\E4BEBEB38C824FA3A004F6133812A0C22\mscoreei.pdb
00000000`63250000 00000000`632bf000   mscoree  # (pdb symbols)          c:\websymbols\mscoree.pdb\5EB01A03276E4F6BB974E19A522150E12\mscoree.pdb
00000000`74340000 00000000`7439c000   wow64win   (pdb symbols)          c:\websymbols\wow64win.pdb\6856A1854EFD48E59C6630E37A377B4B1\wow64win.pdb
00000000`74400000 00000000`74408000   wow64cpu   (pdb symbols)          c:\websymbols\wow64cpu.pdb\57B1A2D813B749BFB824CDB9A6E4005E1\wow64cpu.pdb
00000000`74410000 00000000`7444f000   wow64      (pdb symbols)          c:\websymbols\wow64.pdb\1838BF4EEF834596B92AFED4126065171\wow64.pdb
00000000`74710000 00000000`7471c000   CRYPTBASE   (pdb symbols)          c:\websymbols\cryptbase.pdb\E62FEAE559EE4CD995614215B01AC2102\cryptbase.pdb
00000000`74720000 00000000`74780000   sspicli    (pdb symbols)          c:\websymbols\wsspicli.pdb\FE5709E8439B4232A456084643D47B861\wsspicli.pdb
00000000`74780000 00000000`747d7000   shlwapi    (pdb symbols)          c:\websymbols\shlwapi.pdb\E128B1CEE2EB438C8646E6967118F33E2\shlwapi.pdb
00000000`747e0000 00000000`7480e000   imm32    # (pdb symbols)          c:\websymbols\wimm32.pdb\35DD4069EB2A43BF869D6E311FAD09452\wimm32.pdb
00000000`75790000 00000000`758ec000   ole32      (pdb symbols)          c:\websymbols\ole32.pdb\5061F11A9A57433595EA5EA75A156F4B2\ole32.pdb
00000000`759e0000 00000000`75aac000   msctf      (pdb symbols)          c:\websymbols\msctf.pdb\173DAEF86B2548DBA6134EB74C4D2F232\msctf.pdb
00000000`75ab0000 00000000`75af6000   KERNELBASE   (pdb symbols)          c:\websymbols\wkernelbase.pdb\FDF353DA71FE45CD953EBEC8ED6D14AB1\wkernelbase.pdb
00000000`75dd0000 00000000`75ee0000   kernel32   (pdb symbols)          c:\websymbols\wkernel32.pdb\DFB4E9EBD1654DB2ACF1290CD316CEA22\wkernel32.pdb
00000000`75ee0000 00000000`75fe0000   user32     (pdb symbols)          c:\websymbols\wuser32.pdb\0FCE9CC301ED4567A819705B2718E1D62\wuser32.pdb
00000000`75fe0000 00000000`7608c000   msvcrt     (pdb symbols)          c:\websymbols\msvcrt.pdb\6EC79267530C45188F2A816AD59DBBF92\msvcrt.pdb
00000000`761e0000 00000000`761ea000   lpk        (pdb symbols)          c:\websymbols\wlpk.pdb\C39166A53CCE43F0ADF876B9C637A1EA1\wlpk.pdb
00000000`761f0000 00000000`76290000   advapi32   (pdb symbols)          c:\websymbols\advapi32.pdb\3F32049F550C42B09CF114A1FB8A97E92\advapi32.pdb
00000000`76290000 00000000`762a9000   sechost    (pdb symbols)          c:\websymbols\sechost.pdb\7AF14D02D41E4CD6942745FE0E6372B11\sechost.pdb
00000000`762b0000 00000000`76340000   gdi32      (pdb symbols)          c:\websymbols\wgdi32.pdb\08A541B5942242BDB4AEABD8C87E4CFF2\wgdi32.pdb
00000000`76560000 00000000`76650000   rpcrt4     (pdb symbols)          c:\websymbols\wrpcrt4.pdb\FAC24015130D4D7FAAA77EA36ED5AF1C2\wrpcrt4.pdb
00000000`766e0000 00000000`7677d000   usp10      (pdb symbols)          c:\websymbols\usp10.pdb\F49786E2C7C54EA99E7C37120CDAEB9C1\usp10.pdb
00000000`76e60000 00000000`77009000   ntdll      (pdb symbols)          c:\websymbols\ntdll.pdb\15EB43E23B12409C84E3CC7635BAF5A32\ntdll.pdb
00000000`77040000 00000000`771c0000   ntdll_77040000   (pdb symbols)          c:\websymbols\wntdll.pdb\D74F79EB1F8D4A45ABCD2F476CCABACC2\wntdll.pdb

Nie przejmujemy się nowymi ostrzeżeniami podczas ładowania plików symboli i sprawdzamy natywny stos wywołań:

0:000> k
Child-SP          RetAddr           Call Site
00000000`0020dcb8 00000000`7437f7ad ntdll!NtRequestWaitReplyPort+0xa
00000000`0020dcc0 00000000`7437dbbd wow64win!ConsoleClientCallServer+0x99
00000000`0020dcf0 00000000`74355737 wow64win!ReadConsoleInternal+0x1f9
00000000`0020de40 00000000`7441cf87 wow64win!whReadConsoleInternal+0x43
00000000`0020de90 00000000`74402776 wow64!Wow64SystemServiceEx+0xd7
00000000`0020e750 00000000`7441d07e wow64cpu!TurboDispatchJumpAddressEnd+0x2d
00000000`0020e810 00000000`7441c549 wow64!RunCpuSimulation+0xa
00000000`0020e860 00000000`76ea4956 wow64!Wow64LdrpInitialize+0x429
00000000`0020edb0 00000000`76ea1a17 ntdll!LdrpInitializeProcess+0x17e4
00000000`0020f2a0 00000000`76e8c32e ntdll! ?? ::FNODOBFM::`string'+0x29220
00000000`0020f310 00000000`00000000 ntdll!LdrInitializeThunk+0xe

Nie ma żadnych wątpliwości - mamy do czynienia z aplikacją 32-bitową działającą w ramach wow64. Z takiego zrzutu nie wiemy nawet, czy mamy do czynienia z aplikacją .NET, czy natywną, ponieważ nie widzimy wywołań z 32-bitowych modułów .NET (clr, mscoree, etc.). Nie zrażamy się jednak i próbujemy załadować sos

0:000> .loadby sos clr

(co nam się udaje bez problemu), a następnie sprawdzić stos clr

0:000> !clrstack -a
Failed to load data access DLL, 0x80004005
Verify that 1) you have a recent build of the debugger (6.2.14 or newer)
            2) the file mscordacwks.dll that matches your version of clr.dll is
                in the version directory
            3) or, if you are debugging a dump file, verify that the file
                mscordacwks_<arch>_<arch>_<version>.dll is on your symbol path.
            4) you are debugging on the same architecture as the dump file.
                For example, an IA64 dump file must be debugged on an IA64
                machine.
You can also run the debugger command .cordll to control the debugger's
load of mscordacwks.dll.  .cordll -ve -u -l will do a verbose reload.
If that succeeds, the SOS command should work on retry.
If you are debugging a minidump, you need to make sure that your executable
path is pointing to clr.dll as well.

Ech, znowu nici. No cóż, w końcu mamy do czynienia ze zrzutem 64-bitowym, spróbujmy zatem powiedzieć WinDbg, że mamy do czynienia z aplikacją 32-bitową. W tym celu ładujemy zestaw rozszerzeń związanych z wow64

0:000> .load wow64exts

i przełączamy się na tryb procesora x86

0:000> .effmach x86
Effective machine: x86 compatible (x86)

Robimy zrzut natywny

0:000:x86> k
ChildEBP RetAddr
0014edb4 75e87339 kernel32!ReadConsoleInternal+0x15
0014ee3c 75e0f1b2 kernel32!ReadConsoleA+0x40
0014ee84 52161c8b kernel32!ReadFileImplementation+0x75
0014ef04 527d7cc8 mscorlib_ni+0x2c1c8b
0014ef2c 527d7f60 mscorlib_ni+0x937cc8
0014ef54 52118bfb mscorlib_ni+0x937f60
0014ef70 520f560a mscorlib_ni+0x278bfb
0014ef90 527de6f5 mscorlib_ni+0x25560a
0014efa0 526ca7aa mscorlib_ni+0x93e6f5
0014efb4 52d321bb mscorlib_ni+0x82a7aa
0014efc4 52d54be2 MSVCR100_CLR0400!CallDescrWorker+0x33
0014f040 52d54d84 clr!CallDescrWorkerWithHandler+0x8e
0014f178 52d54db9 clr!MethodDesc::CallDescr+0x194
0014f194 52d54dd9 clr!MethodDesc::CallTargetWorker+0x21
0014f1ac 52e873c2 clr!MethodDescCallSite::Call_RetArgSlot+0x1c
0014f310 52e874d0 clr!ClassLoader::RunMain+0x24c
0014f578 52e872e4 clr!Assembly::ExecuteMainMethod+0xc1
0014fa5c 52e876d9 clr!SystemDomain::ExecuteMainMethod+0x4ec
0014fab0 52e875da clr!ExecuteEXE+0x58
0014fafc 52e04a98 clr!_CorExeMainInternal+0x19f

dzięki któremu mamy już pewność, że jest to 32-bitowa aplikacja .NET pracująca w WOW64. Ponownie próbujemy sprawdzić stos clr

0:000:x86> !clrstack -a
The version of SOS does not match the version of CLR you are debugging.  Please
load the matching version of SOS for the version of CLR you are debugging.
CLR Version: 10.0.30319.1
SOS Version: 4.0.30319.239
OS Thread Id: 0xb5c (0)
Failed to start stack walk: 80070057

jednak dalej jesteśmy w ciemnym lesie i gdy spojrzymy na szczegóły dotyczące dwóch modułów:

0:000:x86> lm v m MSVCR100_CLR0400
start             end                 module name
52c70000 52d41000   MSVCR100_CLR0400 # (pdb symbols)          c:\websymbols\msvcr100_clr0400.i386.pdb\C128595F51E243469FDE9FA0CC7EBFDF2\msvcr100_clr0400.i386.pdb
    Loaded symbol image file: MSVCR100_CLR0400.dll
    Image path: C:\Windows\System32\MSVCR100_CLR0400.dll
    Image name: MSVCR100_CLR0400.dll
    Timestamp:        Thu Mar 18 13:48:28 2010 (4BA2211C)
    CheckSum:         000CE376
    ImageSize:        000D1000
    File version:     10.0.30319.1
    Product version:  10.0.30319.1
    File flags:       0 (Mask 3F)
    File OS:          40004 NT Win32
    File type:        2.0 Dll
    File date:        00000000.00000000
    Translations:     0409.04b0
    CompanyName:      Microsoft Corporation
    ProductName:      Microsoft® Visual Studio® 2010
    InternalName:     msvcr100_clr0400.dll
    OriginalFilename: msvcr100_clr0400.dll
    ProductVersion:   10.00.30319.1
    FileVersion:      10.00.30319.1
    FileDescription:  Microsoft® C Runtime Library
    LegalCopyright:   © Microsoft Corporation.  All rights reserved.
0:000:x86> lm v m clr
start             end                 module name
52d30000 5339e000   clr        (pdb symbols)          c:\websymbols\clr.pdb\24BB9263C8664EB7BD655541A3FDE30D2\clr.pdb
    Loaded symbol image file: clr.dll
    Image path: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
    Image name: clr.dll
    Timestamp:        Sat Jul 09 11:07:57 2011 (4E181A6D)
    CheckSum:         0067171F
    ImageSize:        0066E000
    File version:     4.0.30319.239
    Product version:  4.0.30319.239
    File flags:       8 (Mask 3F) Private
    File OS:          4 Unknown Win32
    File type:        2.0 Dll
    File date:        00000000.00000000
    Translations:     0409.04b0
    CompanyName:      Microsoft Corporation
    ProductName:      Microsoft® .NET Framework
    InternalName:     clr.dll
    OriginalFilename: clr.dll
    ProductVersion:   4.0.30319.239
    FileVersion:      4.0.30319.239 (RTMGDR.030319-2300)
    PrivateBuild:     DDBLD234
    FileDescription:  Microsoft .NET Runtime Common Language Runtime - WorkStation
    LegalCopyright:   © Microsoft Corporation.  All rights reserved.
    Comments:         Flavor=Retail

To stanie się dla nas od razu jasne, skąd mamy błąd mówiący o dwóch różnych wersjach:

CLR Version: 10.0.30319.1
SOS Version: 4.0.30319.239

Otóż według WinDbg obszar zajmowany przez MSVCR100_CLR0400 (52c70000 - 52d41000) nachodzi na obszar zajmowany przez clr (52d30000 - 5339e000) (a ostrzegał, skubaniec, przy ładowaniu symboli) i stąd błąd.

Dump 64-bitowy, WinDbg 64-bit

Na koniec spróbujemy zestaw 32-64-64, czyli aplikacja 32-bit, dump 64-bit oraz WinDbg 64-bit. Jak zwykle rozpoczynamy od załadowania symboli i przejrzeniu stosu wywołań:

0:000> .reload /f
.*** WARNING: Unable to verify checksum for basicx86.exe
.....*** WARNING: Unable to verify checksum for basicx86.exe
..*** WARNING: symbols timestamp is wrong 0x4b9074e7 0x4b90752b for mscoree.dll
...............*** WARNING: symbols timestamp is wrong 0x4a5bdf40 0x4ce7ba53 for imm32.dll
...WARNING: MSVCR100_CLR0400 overlaps clr
*** WARNING: symbols timestamp is wrong 0x4ba2211c 0x4ba1dbf2 for MSVCR100_CLR0400.dll
.*** WARNING: Unable to verify checksum for mscorlib.ni.dll

Podobnie jak w poprzednim przypadku, tu również dostajemy komunikat o nakładaniu się symboli

0:000> k
Child-SP          RetAddr           Call Site
00000000`0020dcb8 00000000`7437f7ad ntdll!NtRequestWaitReplyPort+0xa
00000000`0020dcc0 00000000`7437dbbd wow64win!ConsoleClientCallServer+0x99
00000000`0020dcf0 00000000`74355737 wow64win!ReadConsoleInternal+0x1f9
00000000`0020de40 00000000`7441cf87 wow64win!whReadConsoleInternal+0x43
00000000`0020de90 00000000`74402776 wow64!Wow64SystemServiceEx+0xd7
00000000`0020e750 00000000`7441d07e wow64cpu!TurboDispatchJumpAddressEnd+0x2d
00000000`0020e810 00000000`7441c549 wow64!RunCpuSimulation+0xa
00000000`0020e860 00000000`76ea4956 wow64!Wow64LdrpInitialize+0x429
00000000`0020edb0 00000000`76ea1a17 ntdll!LdrpInitializeProcess+0x17e4
00000000`0020f2a0 00000000`76e8c32e ntdll! ?? ::FNODOBFM::`string'+0x29220
00000000`0020f310 00000000`00000000 ntdll!LdrInitializeThunk+0xe

I tym razem nie mamy pewności, czy mamy do czynienia z  aplikacją .NET. Spróbujmy załadować sos:

0:000> .loadby sos clr
The call to LoadLibrary(C:\Windows\Microsoft.NET\Framework\v4.0.30319\sos) failed, Win32 error 0n193
    "%1 nie jest prawidłową aplikacją systemu Win32."
Please check your debugger configuration and/or network access.

Co, zgodnie z naszymi podejrzeniami, skończyło się porażką. Ładujemy zatem rozszerzenia wow64 i przełączamy na tryb x86:

0:000> .load wow64exts
0:000> .effmach x86
Effective machine: x86 compatible (x86)

Po tej operacji natywny stos wygląda lepiej i mamy już pewność, że jest to aplikacja .NET:

0:000:x86> k
ChildEBP RetAddr
0014edb4 75e87339 kernel32!ReadConsoleInternal+0x15
0014ee3c 75e0f1b2 kernel32!ReadConsoleA+0x40
0014ee84 52161c8b kernel32!ReadFileImplementation+0x75
0014ef04 527d7cc8 mscorlib_ni+0x2c1c8b
0014ef2c 527d7f60 mscorlib_ni+0x937cc8
0014ef54 52118bfb mscorlib_ni+0x937f60
0014ef70 520f560a mscorlib_ni+0x278bfb
0014ef90 527de6f5 mscorlib_ni+0x25560a
0014efa0 526ca7aa mscorlib_ni+0x93e6f5
0014efb4 52d321bb mscorlib_ni+0x82a7aa
0014efc4 52d54be2 clr!CallDescrWorker+0x33
0014f040 52d54d84 clr!CallDescrWorkerWithHandler+0x8e
0014f178 52d54db9 clr!MethodDesc::CallDescr+0x194
0014f194 52d54dd9 clr!MethodDesc::CallTargetWorker+0x21
0014f1ac 52e873c2 clr!MethodDescCallSite::Call_RetArgSlot+0x1c
0014f310 52e874d0 clr!ClassLoader::RunMain+0x24c
0014f578 52e872e4 clr!Assembly::ExecuteMainMethod+0xc1
0014fa5c 52e876d9 clr!SystemDomain::ExecuteMainMethod+0x4ec
0014fab0 52e875da clr!ExecuteEXE+0x58
0014fafc 52e04a98 clr!_CorExeMainInternal+0x19f
0014fb34 631e55ab clr!_CorExeMain+0x4e
0014fb40 63257f16 mscoreei!_CorExeMain+0x38
0014fb50 63254de3 mscoree!ShellShim__CorExeMain+0x99
0014fb58 75de339a mscoree!_CorExeMain_Exported+0x8
0014fb64 77079ef2 kernel32!BaseThreadInitThunk+0xe
0014fba4 77079ec5 ntdll_77040000!__RtlUserThreadStart+0x70
0014fbbc 00000000 ntdll_77040000!_RtlUserThreadStart+0x1b

Ponownie próbujemy załadować sos:

0:000:x86> .loadby sos clr
The call to LoadLibrary(C:\Windows\Microsoft.NET\Framework\v4.0.30319\sos) failed, Win32 error 0n193
    "%1 nie jest prawidłową aplikacją systemu Win32."
Please check your debugger configuration and/or network access.

a skoro się nie ładuje (bo niby jak, skoro jest to aplikacja 64-bit, a biblioteka 32-bit), to może wersję 64-bit:

0:000:x86> .load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll

i może teraz stosik:

0:000:x86> !clrstack -a
Failed to load data access DLL, 0x80004005
Verify that 1) you have a recent build of the debugger (6.2.14 or newer)
            2) the file mscordacwks.dll that matches your version of clr.dll is
                in the version directory
            3) or, if you are debugging a dump file, verify that the file
                mscordacwks_<arch>_<arch>_<version>.dll is on your symbol path.
            4) you are debugging on the same architecture as the dump file.
                For example, an IA64 dump file must be debugged on an IA64
                machine.
You can also run the debugger command .cordll to control the debugger's
load of mscordacwks.dll.  .cordll -ve -u -l will do a verbose reload.
If that succeeds, the SOS command should work on retry.
If you are debugging a minidump, you need to make sure that your executable
path is pointing to clr.dll as well.

Po tej porażce kończymy dalsze zabawy, szkoda naszego czasu.

Podsumowanie

Sprawa jest jasna - nie chcesz mieć problemu, to w systemie 64-bitowym rób:
- 64-bitowe zrzuty aplikacji 64-bitowych;
- 32-bitowe zrzuty aplikacji 32-bitowych
a do analizy korzystaj z:
- 64 bit WinDbg w przypadku zrzutów 64-bitowych;
- 32-bit WinDbg w przypadku zrzutów 32-bitowych.
Co można krótko streścić w formułkach:
32-32-32
oraz
64-64-64

Proste? :) Niby tak, ale domyślnie korzystamy (ja na pewno) z 64-bit taskmgr (ctrl+esc), tudzież Process Explorer (Process Hacker), które zawsze robią dumpy 64-bitowe, niezależnie od tego, czy jest to aplikacja 32-, czy 64-bitowa. Tak więc potraktujcie ten tekst jako przestrogę, a także ułatwienie dalszej analizy osobom pracującym z dumpami procesów.

Opublikowane 28 maja 2012 20:27 przez mgrzeg
Filed under: ,

Powiadamianie o komentarzach

Jeżeli chciałbyś otrzymywać email gdy ta wypowiedź zostanie zaktualizowana, to zarejestruj się tutaj

Subskrybuj komentarze za pomocą RSS

Komentarze:

 

dotnetomaniak.pl said:

Dziękujemy za dodanie artykułu - Trackback z dotnetomaniak.pl

maja 29, 2012 12:48

Co o tym myślisz?

(wymagane) 
(opcjonalne)
(wymagane) 

  
Wprowadź kod: (wymagane)
Wyślij

Subskrypcje

W oparciu o Community Server (Personal Edition), Telligent Systems