Zróbmy sobie BSOD'a.

Dzsiaj w skrócie napiszę, jak można wywołać własny niebieski ekran śmierci pod Windowsem, znany też jako BSOD. Artykuł tyczy się Windowsów z rodziny NT i porusza kwestie związane z programowaniem sterowników jądra.

Z pewnością każdy obcujący z Windowsem na codzień poznał już jego niebieską stronę mocy. Blue screen'y pojawiają się zawsze, gdy coś w jądrze systemu pójdzie nie tak. Na poziomie kernelmode nie zobaczymy okienka raportowania błędów - na ring0 jak coś się, mówiąc kolokwialnie, rąbnie to nie ma ratunku, bo system, jak i same sterowniki działają na tym samym poziomie. Jedyne, co Windows może zrobić to wychwycić podstawowe informacje o błędzie i wypluć je na ekran, zawieszając przy tym wykonywanie kodu.

Przyjrzyjmy się zatem, jak to jest zrobione, by odtworzyć część tego procesu, związaną z wyświetlaniem BSOD'a w swoim sterowniku. Oczywiście nie będę tu się specjalnie zgłębiał i wyjaśniał tajników asma, bo zajęłoby to zdecydowanie za dużo czasu, a po drugie są w internecie tutoriale.

Windows posiada dwie najważniejsze funkcje, wyświetlające niebieskie ekrany w oparciu o podane parametry. Pierwszym parametrem obu funkcji jest kod błędu. Funkcja KeBugCheck posiada właśnie tylko ten parametr, zaś funkcja KeBugCheckEx jest już bardziej rozszerzona i posiada jeszcze dodatkowe 3 parametry umożliwiające na bardziej precyzyjne opisanie błędu na ekranie. Jednak nie ma co się bardziej tutaj zgłębiać. Zacznijmy więc pisanie sterownika wyświetlającego niebieski ekranik. Dodatkowo należałoby napisać jeszcze loader, czyli malutki programik wczytujący sterownik, jednak niestety nie przedstawię tego.

Krok 1.
Załadujmy jądro systemu w disassemblera (najlepiej IDA Pro) i podejrzyjmy, jak funkcja wyświetlająca Blue Screena wypluwa na ekran tekst.

Dla ułatwienia podkreśliłem interesujące nas funkcje.

Krok 2.
Widzimy już, jak wygląda wywoływanie funkcji. Możemy więc przystąpić do pisania swojego kodu a więc... będzie on taki:


InbvAcquireDisplayOwnership(); //bierzemy ekran na własność
InbvResetDisplay(); //resetujemy ekran
InbvSolidColorFill(0, 0, 639, 479, 4); //kolorujemy na niebiesko
InbvSetTextColor(15); //ustawiamy kolor tekstu (15 = 0xF)
InbvInstallDisplayStringFilter(NULL);
InbvEnableDisplayString(TRUE); //włączamy pisanie po ekranie
InbvSetScrollRegion(0, 0, 0, 0, 639, 479); //ustalamy rozdzielczość

InbvDisplayString("Hello BSOD world !"); //piszemy nasz tekst




Krok 3.
Jeszcze czegoś brakuje... a mianowicie kodu, który zawiesi procesor. Let's write it.


__asm cli; //wylaczamy przerwania
__asm hlt; //zawieszamy procesor



Zobaczmy swoje dzieło !
Czas więc już to wszystko skompilować w Free Build Environment. Jak ktoś by szukał loadera, to w przykładowych projektach Windows Driver Kit znajdziecie takowy np w projekcie "sioctl" w katalogu exe. I oto nasz bsod:



Warto jeszcze dodać, że interfejs Inbv posiada inne bardzo ciekawe możliwości. Miłej zabawy !

Komentarze

Prześlij komentarz