Professional Documents
Culture Documents
Podsuchiwanie klawiatury
Atak
Sawomir Orowski, Maciej Pakulski
stopie trudnoci
hakin9 Nr 01/2008
cje, a dla Javy specjalne obiekty nasuchujce. Skd jednak aplikacja wie, e jej przycisk zosta kliknity? Tak informacj dostaje
od systemu Windows. Utrzymuje on dla kadego uruchomionego programu kolejk, ktra przechowuje zdarzenia. Zdarzeniem, ktre nas najbardziej w tym momencie interesuje, jest nacinicie klawisza na klawiaturze.
Aby je przechwyci, musimy monitorowa komunikaty wysyane do uruchomionych w systemie aplikacji. Nie jest to zadanie specjalnie skomplikowane (nie musimy modyfikowa
Z artykuu dowiesz si
Co powiniene wiedzie
www.hakin9.org
np. jdra), poniewa system Windows udostpnia mechanizm hakw (ang. hooks). Zosta on ju opisany przez Jacka Matulewskiego w
numerze 4/2007, jednak pod nieco
innym ktem. My zajmiemy si uyciem hakw w kodzie C#. Bdziemy
zmuszeni do skorzystania z funkcji
WinAPI oraz metod specyficznych
dla Windows, co jest pogwaceniem
idei platformy uruchomieniowej.
Dodawanie
wpisw do autostartu
www.hakin9.org
hakin9 Nr 01/2008
Atak
py wyliczeniowe musimy zadeklarowa jako pola klasy reprezentujcej nasz program. Parametry, jakie przyjmuje nasza metoda, to nazwa klucza (zmienna name), cieka
dostpu i nazwa pliku wykonywalnego, ktry chcemy uruchomi (zmienna exe) oraz rodzaj operacji, jak
chcemy wykona (stworzony przez
nas typ wyliczeniowy asOperation).
Aby stworzy obiekt reprezentujcy klucz rejestru, uywamy metody OpenSubKey. W zalenoci od tego, czy jest to metoda wasnoci CurrentUser, czy LocalMachine,
wpis stworzony bdzie odpowiednio w HKEY_CURRENT_USER lub
w HKEY_LOCAL_MACHINE. Do
sprawdzenia wartoci klucza suy
metoda GetValue. Do zapisu klucza
uywamy metody SetValue, a do jego usunicia DeleteValue. Kada z
tych metod moe generowa wyjtek, dodatkowo sam proces tworzenia obiektu klasy RegistryKey moe
spowodowa zgoszenie wyjtku w
zwizku z tym cao umieszczamy
w bloku ochronnym try-catch. Wyjtki mog by spowodowane brakiem
dostpu do rejestru lub konkretnego
klucza. Wywoanie tej metody najlepiej umieci w kodzie wykonywanym w trakcie uruchamiania programu. Moe to by konstruktor formy
Windows hooks
hakin9 Nr 01/2008
www.hakin9.org
static
extern
ci od typu haka. Kolejne z importowanych funkcji umoliwiaj odczytanie znaku wcinitego klawisza klawiatury z odebranego komunikatu.
Funkcja ToAscii suy do zamiany
kodu wirtualnego klawisza na odpowiedni znak w kodzie ASCII. Jej parametry to:
parametry};
Tworzymy bibliotek
czon dynamicznie
uVirtKey
sza,
www.hakin9.org
hakin9 Nr 01/2008
Atak
j odpowiednio kody klawiszy wirtualnych Shift i Caps Lock. Pole ShiftDown bdzie przyjmowa warto true, jeeli klawisz Shift jest
wcinity. W przeciwnym wypadku pole to przyjmie warto false.
Pole CapsLockDown bdzie przyjmowa warto true, jeeli klawisz
CapsLock zosta przeczony, powodujc uaktywnienie trybu pisania duymi literami. Natomiast po
wyczeniu tego trybu polu zostanie
przypisana warto false. Ostatnim
polem bdzie kod komunikatu systemu Windows, ktry jest generowa-
hakin9 Nr 01/2008
okrela kod, na podstawie ktrego funkcja monitorujca przetwarza otrzymany komunikat. Jeeli parametr ten jest
mniejszy od zera, to wymagane jest, aby funkcja monitorujca
wywoaa funkcj CallNextHookEx
i zwrcia warto zwracan
przez t funkcj,
wParam okrela identyfikator komunikatu klawiatury,
lParam reprezentuje wskanik do struktury KBDLLHOOKSTRUCT. Aby mc korzysta z
tej struktury, musimy j przedtem
zdefiniowa. W tym celu przed
definicj klasy dodajemy kod z Listingu 6.
code
www.hakin9.org
W Sieci
Posuy nam ono jako parametr przekazywany do funkcji ToAscii. Parametry code, wParam oraz lParam s odpowiednio drugim, trzecim i czwartym
parametrem funkcji CallNextHookEx.
Na pocztku metody sprawdzamy, czy nastpio zdarzenie wcinicia klawisza niesystemowego oraz
czy parametr code ma warto wiksz bd rwn zero. Uywamy statycznej metody PtrToStructure klasy
Marshal w celu zamiany parametru
lParam na struktur KBDLLHOOKSTRUCT. Metoda ta jako pierwszy
parametr przyjmuje wskanik do niezarzdzanego bloku pamici (wskaniki na platformie .NET s reprezentowane przez struktur IntPtr). Drugi parametr to typ obiektu, ktry ma
utworzy. Wartoci zwracan jest
nowo utworzony obiekt klasy Object.
Zawiera on dane wskazywane przez
wskanik przekazany jako pierwszy
parametr. Zwracan warto rzutujemy jeszcze na struktur KBDLLHOOKSTRUCT. Pierwsza instrukcja warunkowa if ustala wielko znakw
bdcych literami. Druga konstrukcja if dba, aby tylko wybrane znaki
byy zapisywane do pliku.
Biblioteka DLL zostaa ju stworzona. Kolejnym krokiem bdzie
stworzenie projektu, ktry uyje tej
biblioteki w celu monitorowania klawiatury.
Instalujemy funkcj
monitorujc
oks. Do projektu dodajemy now klas przez wybranie opcji Project >
Add Class. W polu Name wpisujemy
HookClass. W klasie tej umiecimy
kod umoliwiajcy uruchomienie monitorowania klawiatury. Forma Form1
w tym projekcje bdzie symulowaa pewn aplikacj, w ktrej istnieje
moliwo uycia opcji monitorowania klawiatury. Moemy teraz przej
do napisania definicji klasy HookClass. Zaczniemy od importu potrzebnych funkcji WinAPI (Listing 8).
Haki s instalowanie przez wywoanie funkcji SetWindowsHookEx.
Parametry tej funkcji to:
idHook
Jeeli funkcja ta zadziaa poprawnie, zwrci uchwyt do funkcji monitorujcej. W przeciwnym wypadku zwrci warto null. Gdy ju nie
chcemy przechwytywa wybranych
komunikatw, moemy odinstalowa funkcj monitorujc. Suy do
tego funkcja UnhookWindowsHookEx.
Jej parametr to uchwyt do funkcji
monitorujcej, ktry otrzymujemy
jako warto zwracan przez funkcj SetWindowsHookEx. Jeeli funkcja
zadziaa poprawnie, zwracana warto jest niezerowa. W przeciwnym
wypadku zwracan wartoci jest
zero. Funkcja GetModuleHandle uzyskuje uchwyt do wybranego moduu, ktrego nazw przekazujemy jako parametr (plik .dll lub .exe). Jeeli funkcja zadziaa prawidowo,
wwczas zwracan wartoci jest
uchwyt do danego moduu.
W kolejnym kroku zdefiniujemy
delegacj dla funkcji monitorujcej. Jej sygnatura i typ musz zatem by zgodne z sygnatur i ty-
www.hakin9.org
hakin9 Nr 01/2008
Atak
pem zwracanym funkcji monitorujcej. Po zdefiniowaniu delegacji tworzymy jej referencj. Warto podkreli, e obiekt delegacji musi by zadeklarowany jako static. Potrzebne nam bdzie take pole, w ktrym zapiszemy uchwyt do funkcji
System;
System.Collections.Generic;
System.ComponentModel;
System.Data;
System.Drawing;
System.Text;
System.Windows.Forms;
namespace TestHooks
{
public partial class Form1 : Form
{
private HookClass hookClass;
private bool hookInstallDone = true;
public Form1()
{
InitializeComponent();
hookClass = new HookClass();
if(!hookClass.InstallHook())
hookInstallDone = false;
}
private void OnClosing(object sender, EventArgs e)
{
if(hookInstallDone)
hookClass.CloseHook();
}
}
}
hakin9 Nr 01/2008
www.hakin9.org
O autorach
www.hakin9.org
Podsumowanie
hakin9 Nr 01/2008