Debugowanie jądra systemu Windows: Zrzut pamięci

Crash dump Bsod

Co zrobić, gdy ponownie zobaczysz Blue Screen of Death? Statystyki Microsoftu wskazują na fakt, że co najmniej 70% przypadków wystąpienia blue screena spowodowanych jest przez nieprawidłową implementację sterowników. Niestety, bezbłędna i spełniająca wszystkie wymagania, implementacja modułu jądra systemu operacyjnego jest trudnym i odpowiedzialnym zadaniem. Jeżeli kiedykolwiek miałeś ochotę zajrzeć “pod maskę” systemu operacyjnego Windows, zidentyfikować problematyczny sterownik lub szukasz ukrywającego się w przestrzeni jądra rootkita, zapraszam do zapoznania się z artykułem.

1. Wstęp

W systemie operacyjnym Windows istnieje implementacja mechanizmu wykonującego plik zrzutu pamięci. W treści artykułu przedstawiono właściwości poszczególnych typów plików zrzutu pamięci. Ponadto wskazano sposoby konfiguracji mechanizmu wykonującego zrzuty pamięci oraz wyzwolenia działania tego mechanizmu. W ostatniej części zaprezentowano przykład prowadzący użytkownika systemu operacyjnego Windows przez kolejne kroki podstawowej analizy zrzutu pamięci. W wyniku analizy zidentyfikowano moduł systemu operacyjnego oraz ujawniono ścieżkę do pliku wykonywalnego, z którego ten moduł jest ładowany.

2. Plik zrzutu pamięci

Plik zrzutu pamięci (ang. memory dump file lub dump file) jest zapisem stanu systemu operacyjnego (migawką, ang. snapshot) w chwili, w której ten zrzut wykonano. Zawiera zapisany kontekst procesora oraz zawartość pamięci fizycznej.

Spośród typów zrzutów pamięci można wyróżnić:

3. Zarządzanie wykonywaniem zrzutów pamięci

Administrator systemu Windows ma prawo zarządzać mechanizmem odpowiedzialnym za wykonywanie zrzutów pamięci. Może realizować swoje uprawnienia na kilka sposobów. W mojej opinii najwygodniejsze metody to:

Crash dump Registry config

4. Wykonanie zrzutu pamięci

Poniżej opisano kroki prowadzące do wykonania zrzutu pamięci.

4.1 Zrzut zainicjowany manualnie

Wykonanie zrzutu pamięci następuje w wyniku wprowadzenia kombinacji klawiszy [Klawisz 1] + [Klawisz 2] + [Klawisz 2]

W celu konfiguracji takiego sposobu wykonania zrzutu pamięci:

  1. Uruchom Device Manager lub polecenie devmgmt.msc

  2. Znajdź wykorzystywaną klawiaturę i uruchom okno Właściwości.

  3. Następnie, w zakładce Driver, wybierz Driver Details

Crash dump Devmgmt Properties

  1. W oknie Driver File Details odczytaj nazwę sterownika obsługującego klawiaturę, np. i8042prt

Crash dump Driver File Details

  1. Uruchom Registry Editor lub polecenie regedit

  2. Utwórz klucz

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\{NAZWA_STEROWNIKA}\crashdump

np.:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\crashdump

  1. Do utworzonego klucza dodaj trzy 32-bitowe wartości DWORD:
CrashOnCtrlScroll   : 0x00
Dump1Keys           : 0x20
Dump2Key            : 0x21

Crash dump Keyboard registry config

  1. Zrestartuj maszynę

Po wciśnięciu kombinacji klawiszy Lewy Ctrl + d + d nastąpi wyświetlenie BSOD o kodzie zatrzymania MANUALLY_INITIATED_CRASH oraz zostanie wykonany zrzut pamięci.

4.2 Zrzut zainicjowany manualnie przez debugger

Wykonanie zrzutu pamięci następuje w wyniku wprowadzenia polecenia debuggera

.crash

4.3 Zrzut zainicjowany wymuszeniem błędu

Zrzut pamięci następuje w wyniku intencjonalnego wykonania programu prowadzącego do wystąpienia błędu w systemie operacyjnym.

W celu wymuszenia błędu i wykonania zrzutu pamięci:

  1. Uruchom program Not My Fault wchodzący w skład pakietu Sysinternals.

  2. W zakładce Crash wybierz przyczynę wystąpienia błędu.

  3. Wybierz przycisk Crash. Po chwili nastąpi wyświetlenie BSOD z powiązanym kodem zatrzymania (np. ATTEMPTED_WRITE_TO_READONLY_MEMORY) oraz zostanie wykonany zrzut pamięci.

Crash dump Not My Fault

4.4 Zrzut zainicjowany wystąpieniem błędu

Zrzut pamięci zostaje wykonany bez ingerencji użytkownika w przypadku, gdy system Windows przestaje działać poprawnie.

5. Podstawowa analiza zrzutu pamięci

W celu przeprowadzania podstawowej (wstępnej) analizy zrzutu pamięci:

  1. Uruchom:

a) WinDBG znajdujący się w lokalizacji C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe.

b) lub narzędzie wiersza poleceń cdb.exe:

C:\> "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe" -Z [DMP_FILE]

np.

C:\> "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe" -z Z:\Mem\MEMORY.DMP
  1. Z menu File wybierz Open Crash Dump.

windbg file open crash dump

  1. Wybierz plik zawierający zrzut pamięci i wybierz przycisk ‘Open’.

  2. Po załadowaniu pliku przez WinDbg lub cdb.exe powinien być widoczny log:

windbg file loaded

W logu z załadowania pliku znajdują się informacje o:

  1. Uruchom polecenie
!analyze -v

Po wykonaniu polecenia, zostanie wypisana informacja o typie błędu, który wystąpił oraz wskazówka dotycząca sposobu jego analizy.

windbg analyze 001

Poniżej znajdować się będzie stos wywołań, który doprowadził do wykonania zrzutu, oraz bezpośrednie wskazanie modułu, w którym wystąpił błąd.

windbg analyze 002

Z treści przykładowych logów wiadomo, że problemem sprawia moduł myfault.

  1. Więcej informacji na temat modułu myfault można pozyskać podając komendę:
lmvm myfault

windbg analyze 002

W wyniku polecenia otrzymano szereg podstawowych właściwości modułu myfault. Jedną z nich jest ścieżka do pliku wykonywalnego C:\WINDOWS\system32\drivers\myfault.sys. W ten sposób zidentyfikowano konkretny plik Portable Executable, który po uruchomieniu powoduje wystąpienie nieodwracalnego błędu w systemie operacyjnym.

6. Podsumowanie

Przedstawione w artykule metody i narzędzia analizy zrzutu pamięci operacyjnej pozwalają na wykonanie podstawowej analizy w celu identyfikacji modułu systemu operacyjnego odpowiedzialnego za wystąpienie nieodwracalnego błędu w tym systemie. Zaprezentowane sposoby konfiguracji elementów systemu operacyjnego pozwalają na wprowadzenie własnych ustawień w zakresie tworzenia i zarządzania plikami zrzutów pamięci.