Mam zrzut pamięci (proces niezarządzany). Jak mogę wyodrębnić (używając windbg) jeden z bibliotek dll załadowanych do procesu? Mam na myśli faktycznie zapisanie pliku dll na dyskuJak mogę wyodrębnić plik DLL ze zrzutu pamięci?
Odpowiedz
Możesz użyć sos.dll w katalogu windbg.
Najpierw załadować sos.dll w WinDbg:
.load clr10\sos.dll
następnie wykorzystać sam lub SaveAllModule wyodrębnić moduły dotyczące określonej lokalizacji na dysku:!
!sam c:\notepad
Aby wyodrębnić DLL bez użycia SOS, użyj rozszerzenia .writemem w następujący sposób:
odkryj adresy początkowe i końcowe modułu
lmvm dllname
przykład wyjście ieframe:
start end module name
61370000 61fb8000 ieframe
obliczenia długości = koniec-start:
? 61fb8000 - 61370000
Wydajność:Evaluate expression: 12877823 = 00c48000
następnie zapisać DLL następująco:
.writemem C:\tmp\mydll.dll 61370000 L?00c48000
Jest mało prawdopodobne, aby podać dokładną bibliotekę DLL, ponieważ została ona załadowana z dysku, naprawienie tego nie jest banalne.
(częściowo oparte na this article)
Tak, to prawda. calc.exe będzie również podnosić informacje o interfejsie dla wielu użytkowników i dołączać je do pamięci, podobnie jak wiele programów Windows takich jak mspaint, przeglądarka zdjęć itp.
Próbowałem, ale to nie zadziałało. Dołączyłem Windbg do Calc.exe i napisałem exe i dostałem większy plik. Dziwne. – Saar
Przypuszczam, że jest to spowodowane rozbieżnościami w wyrównaniu - pliki pe32 zajmują więcej miejsca w pamięci niż na dysku ze względu na większe wymagania dotyczące wyrównania pamięci. Musisz poprawnie odbudować plik wykonywalny po jego porzuceniu, aby spełnić te reguły. Poza tym sekcja debugowania nie jest zrzucana (ponieważ nie jest zmapowana, jak sądzę). Tabele importu również wymagają rekonstrukcji. – deemok