Debugowanie jądra systemu Windows: Zrzut pamięci
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ć:
pełny zrzut (ang. full dump, complete dump) - zawiera kompletny zapis całej dostępnej przestrzeni pamięci fizycznej; w przypadku 32-bitowych systemów operacyjnych, które posiadają co najmniej 2 GB pamięci RAM, wykonanie takiego zrzutu nie jest możliwe;
zrzut przestrzeni jądra (ang. kernel dump) - zapis przestrzeni pamięci fizycznej, która została zarezerwowana dla jądra systemu operacyjnego;
mały zrzut (ang. minidump) - zawiera najmniejszy zakres informacji: kod zatrzymania, listę załadowanych sterowników, stos wywołań trybu jądra zatrzymanego wątku, strukturę tego wątku oraz strukturę procesu, do którego ten wątek przynależał; ten typ zrzutu nie nadaje się do wykonania szczegółowej analizy, ale czasem może okazać się jedynym rodzajem zrzutu, który można wykonać ze względu na bardzo małą ilość dostępnej pamięci trwałej;
zrzut automatyczny (ang. automatic dump) - jest to wariant pełnego zrzut; w trakcie jego wykonania system operacyjny ma możliwość dostosowania rozmiaru pliku wymiany; przydatny w środowiskach wyposażonych w dysk(i) SSD i dużą ilość pamięci RAM;
zrzut aktywny (ang. active dump) - jest to “odchudzony” i mający mniejszy rozmiar wariant pełnego zrzutu; zrzut aktywny nie zawiera stron pamięci, które zazwyczaj nie są potrzebne podczas analizy; brakować będzie m.in. stron niezajętych i niezarezerwowanych oraz stron znajdujących się w dyspozycji maszyn wirtualnych; przydatny w sytuacji, kiedy analizowane środowisko jest hostem dla maszyn wirtualnych.
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:
- edycja zawartości klucza
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl
w rejestrze Windows
konfiguracja z poziomu okna
Startup and Recovery
:- Uruchom polecenie
sysdm.cpl
- W oknie
System Properties
, w zakładceAdvanced
, w sekcjiStartup and Recovery
, wybierz przyciskSettings...
:
- Pojawi się okno
Startup and Recovery
, w którym istnieje możliwość wprowadzenia własnej konfiguracji:
- Uruchom polecenie
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:
Uruchom Device Manager lub polecenie
devmgmt.msc
Znajdź wykorzystywaną klawiaturę i uruchom okno Właściwości.
Następnie, w zakładce
Driver
, wybierzDriver Details
- W oknie
Driver File Details
odczytaj nazwę sterownika obsługującego klawiaturę, np.i8042prt
Uruchom Registry Editor lub polecenie
regedit
Utwórz klucz
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\{NAZWA_STEROWNIKA}\crashdump
np.:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\crashdump
- Do utworzonego klucza dodaj trzy 32-bitowe wartości DWORD:
CrashOnCtrlScroll : 0x00
Dump1Keys : 0x20
Dump2Key : 0x21
- 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:
Uruchom program Not My Fault wchodzący w skład pakietu Sysinternals.
W zakładce
Crash
wybierz przyczynę wystąpienia błędu.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.
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:
- 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
- Z menu File wybierz
Open Crash Dump
.
Wybierz plik zawierający zrzut pamięci i wybierz przycisk ‘Open’.
Po załadowaniu pliku przez WinDbg lub cdb.exe powinien być widoczny log:
W logu z załadowania pliku znajdują się informacje o:
- przestrzeni adresowej dostępnej do analizy,
- wersji systemu operacyjnego,
- liczbie procesorów logicznych,
- architekturze procesora,
- dacie i godzinie wykonania zrzutu,
- czasie, który upłynął od uruchomienia systemu operacyjnego,
- numerze bieżącego procesora logicznego.
- 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.
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.
Z treści przykładowych logów wiadomo, że problemem sprawia moduł myfault
.
- Więcej informacji na temat modułu
myfault
można pozyskać podając komendę:
lmvm myfault
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.