You are on page 1of 7

3.

Aplicaii Malware

Malware, creat din cuvintele malicious i software, identific softuri
proiectate pentru nfiltrarea ntr-un sistem i deteriorarea sau spionarea acestuia fr
acordul proprietarului. Aceste programe au aprut o dat cu primele calculatoare
personale, dezvoltarea i rspndirea acestora accelerndu-se o dat cu dezvoltarea
Internetului.
n literatura de specialitate sunt identificate urmtoarele categorii de programe care
intr n categoria Malware:

Virus program care o dat lansat n execuie ncearc s se multiplice, s-i
copieze propriul cod ntr-un alt cod executabil. La o multiplicare cu succes,
se poate afirma c destinaia a fost infectat. Viruii au nevoie de un
program gazd, o dat lansat n execuie gazda, codul virusului va fi i el
executat;
Worm program care poate rula independent i are capacitatea de auto-
replicare pe alte sisteme sau reele;
Trojan horse programe care apar a fi legitime, ns conin i o
funcionalitate ascuns, maliioas ce exploateaz mecanismele de
autorizare legitime ale sistemului pe care sunt rulate;
Spyware programe care adun informaii legate despre sistemul pe care
sunt rulate i le transmit altor sisteme. n aceast categorie intr i Spyware
Trojan, care reprezint programe Spyware aparent legitime sau Spyware
Worm, reprezentnd programe Spyware cu capacitate de auto-replicare pe
alte sisteme sau reele.

O palet mult mai larg de Malware este prezentat pe larg de William Stalings i
Lawrie Brown [SB08], acetia identificnd totodat sub-clasele de Malware, precum i
mecanismele de protejare mpotriva acestora.
ntruct proiectarea mecanismelor de protejare a sistemelor necesit o profund
nelegere a principiilor de funcionare a softurilor Malware, n cadrul acestui capitol ne
propunem s construim o parte a unui soft Spyware pentru sisteme Windows. Scopul
acestui program, care ruleaz ntr-o aplicaie fr fereastr, va fi acela de a loga toate
tastele apsate fr ca utilizatorul s tie de existena ei. Pornind de la un asemenea
program, se pot construi aplicaii care s filtreze tastele apsate la logarea ntr-un cont de
email sau ntr-un cont pe un sistem la distan i transmiterea acestor informaii pe alte
sisteme, de unde un atacator le poate utiliza.
O metod foarte simpl pentru capturarea tuturor tastelor apsate pe sistemele
Windows, o reprezint utilizarea Windows hooks. n continuarea acestui capitol sunt
descrise aceste mecanisme i este construit o aplicaie exemplu pentru un Spyware.

3.1 Windows hooks (i.e. crligele din Windows)

Un crlig Windows este un punct n mecanismul sistemului de procesare a
mesajelor unde o aplicaie poate instala o subrutin pentru monitorizarea traficului n
sistem i pentru a procesa unele tipuri de mesaje nainte ca acestea s ajung la procedura
destinaie (MSDN).

Tabelul 3.1 Tipuri de crlige care se pot instala
Tip crlig Descriere
WH_CALLWNDPROC i
WH_CALLWNDPROCRET
Monitorizarea mesajelor trimise procedurilor fereastr.
Sistemul apeleaz WH_CALLWNDPROC naintea
transmiterii mesajului unei proceduri fereastr i apeleaz
WH_CALLWNDPROCRET dup ce procedura a procesat
mesajul.
WH_CBT
naintea terminrii unei comenzi sistem; naintea
maximizrii, minimizrii, nchiderii, deschiderii unei ferestre,
fiind destinat aplicaiilor de tip training.
WH_DEBUG
Se apeleaz naintea apelrii celorlalte crlige, fiind deosebit
de util n blocarea execuiei altor crlige.
WH_FOREGROUNDIDLE
Se apeleaz cnd firul curent devine idle, astfel oferind
posibilitatea completrii unor task-uri cu prioritate sczut.
WH_GETMESSAGE
Permite monitorizarea mesajelor care sunt pe cale s fie
returnate de funciile GetMessage sau PeekMesage.
WH_JOURNALRECORD
Permite monitorizarea i nregistrarea evenimentelor
provenite de la tastatur sau mouse. De obicei, acest tip de
crlig se folosete pentru nregistrarea evenimentelor i
retransmiterea lor ulterioar folosind un crlig.
WH_JOURNALPLAYBACK. Evenimentele nu sunt
nregistrate automat, ci ele trebuie stocate n memorie de
ctre program. Acest tip difer de celelalte prin faptul c
poate fi ataat numai firului curent.
WH_JOURNALPLAYBACK
Permite unei aplicaii s insereze mesaje n coada de mesaje a
sistemului. Folosind acest tip de crlig, se pot insera mesaje
nregistrate cu WH_JOURNALRECORD. Ct timp un
asemena crlig este instalat n sistem, evenimentele de
tastatur i mouse sunt dezactivate.
WH_KEYBOARD_LL
Monitorizarea mesajelor de apsare a unei tastate pe cale s
fie depus n coada de mesaje a unui fir. Prin nregistrarea
unui asemenea crlig, se pot bloca diferite mesaje nainte ca
acestea s fie inserate n coada de mesaje al unui alt fir.
WH_KEYBOARD
Monitorizarea mesajelor de apsare a unei taste pe cale s fie
returnate de GetMessage sau PeekMesage.
WH_MOUSE_LL
Monitorizarea mesajelor de mouse pe cale s fie transmise n
coada de mesaje al unui fir. La fel ca i
WH_KEYBOARD_LL, acest tip de crlig permite
interceptarea i blocarea mesajelor nainte ca acestea s fie
inserate n coada de mesaje a unui alt fir.
WH_MOUSE
Monitorizarea mesajelor de mouse pe cale s fie returnate de
GetMessage sau PeekMesage.
WH_MSGFILTER i
WH_SYSMSGFILTER
Permite monitorizarea mesajelor pe cale de procesare de
ctre un meniu, bar de scroll, fereastr dialog de mesaj
(message box), fereastr dialog (dialog box).
WH_SHELL
Permite unei aplicaii s primeasc notificri importante.
Sistemul apeleaz o procedur WH_SHELL cnd aplicaia
Shell este pe cale s fie activat i cnd o fereastr top-level
este pe cale s fie creat sau distrus.

Crligele Windows tind s ncetineasc sistemul ntruct fiecare mesaje trebuie
procesat de subrutina sau subrutinele ataate. De fapt, Windows suport mai multe tipuri
de crlige enumerate n tabelul 3.1. Fiecare asemenea crlig poate avea asociat o list de
funcii callback nregistrate.
ntruct aceste mecanisme folosesc sistemul de mesaje Windows, implementarea
lor presupune crearea unui mediu propice primirii i prelucrrii mesajelor. Cea mai
simpl metod pentru ca sistemul de operare Windows s creeze o coad de mesaje
pentru o anumit aplicaie, este realizarea unei aplicaii care are o fereastr nregistrat. n
aceast categorie intr i aplicaiile Dialog Based, Document-View sau Multiple
Documents, care pot fi create folosind Microsoft Visual Studio. O alt metod implic
realizarea unei aplicaii Windows care s nu conin nici o fereastr, ns coada de mesaje
s fie creat prin apelul finciilor GetMessage, TranslateMessage i
DispatchMessage.

3.2 Aplicaii win32 fr fereastr i cozi de mesaje

n Microsoft Visual C++ se creeaz un proiect nou Win32, Win32 Project, Empty
project. Pentru crearea cozii de mesaje Windows, se va include o secven de preluare i
procesare a mesajelor, precum n secvena urmtoare:

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{

MSG msg;
while( GetMessage( &msg, NULL, 0, 0 ) != 0 )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return 0;
}

Funcia GetMessage scoate un mesaj din coada de mesaje a firului curent. Dac
funcia preia un mesaj diferit de WM_QUIT, va returna o valoare diferit de zero. La
preluarea unui mesaj WM_QUIT va returna zero.
Cea de-a doua funcie prezent n procesul de prelucrare a mesajelor este
TranslateMessage, folosit pentru a transforma mesajele corespunztoare tastelor
virtuale, n mesaje caracter.
Ultima funcie, DispatchMessage, este cea care transmite mesajul preluat i
prelucrat, ferestrelor prezente n aplicaie.

3.3 Inserarea unui crlig Windows

Pentru utilizarea crligelor Windows, compilatorul trebuie notificat c se utilizeaz
o versiune NT mai mare de 0x400, ntruct doar ncepnd cu versiunile 0x400 au fost
introduse aceste crlige. Definiiile specifice crligelor sunt date n WinUser.h ntr-o
secven de testare a versiunii NT astfel:

#if (_WIN32_WINNT >= 0x0400)

// Definiii crlige

#endif

Astfel, naintea includerii fiierului windows.h, care la rndul lui va include
WinUser.h, n aplicaia creat trebuie introdus secvena de testare a versiunii i n cazul
n care aceata nu este corespunztoare, definirea versiunii 0x400:

#if !defined _WIN32_WINNT

#define _WIN32_WINNT 0x400

#elif (_WIN32_WINNT < 0x400)

#undef _WIN32_WINNT
#define _WIN32_WINNT 0x400

#endif

#include <windows.h>

Inserarea crligelor Windows se realizeaz prin intermediul funciei
SetWindowsHookEx(). Funcia primete ca parametrii tipul crligului instalat,
procedura apelat, handle al instanei curente i identificatorul firului ale crui mesaje
sunt interceptate. Dac ultimul parametru este 0, atunci procedura este asociat cu toate
firele care ruleaz pe sistem.
Pentru aplicaia WinMain creat, vom utiliza secvena urmtoare de cod pentru
crearea unui asemenea crlig, unde g_hHook este o variabil declarat global de tipul
HHOOK:

g_hHook = SetWindowsHookEx( WH_KEYBOARD_LL,
KeyboardProc,
hInstance,
0 );
if ( NULL == g_hHook ) {
MessageBox( NULL, _T("Could not install hook procedure"),
_T("Hook error"), MB_OK | MB_ICONERROR );
return -1;
}

n secvena de cod anterioar, funcia SetWindowsHookEx s-a apelat cu
parametrul WH_KEYBOARD_LL pentru a instala un crlig de capturare a tastelor apsate.
Pentru acest tip de crlig trebuie definit o funcie callback KeyboardProc cu
prototipul:


LRESULT CALLBACK KeyboardProc( int nCode,
WPARAM wParam,
LPARAM lParam );

Primul parametru, nCode, reprezint un cod prin care procedura este informat
cum anume trebuie s interpreteze evenimentul. Dac valoarea acestui parametru este
negativ, funcia trebuie s apeleze CallNextHookEx() i nu trebuie s proceseze
evenimentul. Dac valoarea acestuia este egal cu HC_ACTION, atunci parametrii
wParam i lParam conin informaii legate de o apsarea unei taste i evenimentul
poate fi procesat.
Al doilea parametru, wParam, conine tipul evenimentului de tip apsare. Acesta
poate avea una din urmtoarele valori:

WM_KEYDOWN la apsarea unei taste non-sistem, adic o tast apsat fr
ca tasta ALT s fie inut apsat;
WM_KEYUP la eliberarea unei taste non-sistem;
WM_SYSKEYDOWN la apsarea unei taste sistem, adic o combinaie de
taste ce implic i apsarea tastei ALT;
WM_SYSKEYUP la eliberarea unei taste sistem.

Ultimul parametru, lParam, reprezint un pointer ctre o structur
KBDLLHOOKSTRUCT, definit n WinUser.h:

typedef struct tagKBDLLHOOKSTRUCT {
DWORD vkCode;
DWORD scanCode;
DWORD flags;
DWORD time;
ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT, FAR *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;

unde vkCode reprezint codul virtual al tastei apsate, cu o valoare ntre 1 i 254;
scanCode reprezint codul hardware al tastei apsate; flags conine informaii legate
de contextul de apsare, posibile valori incluznd LLKHF_EXTENDED,
LLKHF_INJECTED, LLKHF_ALTDOWN i LLKHF_UP; time reprezint marca de timp
la care s-a generat evenimentul; dwExtraInfo conine alte informaii legate de
eveniment ce pot fi adugate de aplicaii.
Valoarea returnat de funcia KeyboardProc influeneaz procesarea ulterioar a
mesajelor sistemului. Dac funcia nu dorete s proceseze un anumit mesaj, aceasta
TREBUIE s apeleze funcia CallNextHookEx pentru a da ansa i altor aplicaii s
proceseze mesajul i TREBUIE s se returneze valoarea returnat de aceast funcie.
n cazul n care se dorete prevenirea procesrii unui anumit mesaj de alte aplicaii,
valoarea returnat trebuie s fie diferit de 0. Prin acest mecanism se pot filtra o serie de
evenimente de tip apsare a tastelor nedorite.
Un exemplu de procesare a tastelor este dat n secvena urmtoare, unde se
blocheaz vizualizarea meniului de START i evenimentul apsrii tastei F8 este procesat
i transmis mai departe:

#define VK_CODE_START 91
#define VK_CODE_F8 119



if ( nCode < 0 ) {
return CallNextHookEx( g_hHook, nCode, wParam, lParam );
}

if ( nCode == HC_ACTION )
{
if ( wParam == WM_KEYDOWN )
{
KBDLLHOOKSTRUCT* pStruct =
reinterpret_cast< KBDLLHOOKSTRUCT* >( lParam );

// Eveniment blocat
if ( pStruct->vkCode == VK_CODE_START ) {
return TRUE;
}

// Eveniment procesat i transmis mai departe
// (Apsarea butonului OK se realizeaz de ctre utilizator
// rezultnd un timp de ordinul secundelor pentru procesare)
else if ( pStruct->vkCode == VK_CODE_F8 ) {
MessageBox( NULL, _T("Mesaj procesat!"), _T("Info"),
MB_OK | MB_ICONINFORMATION );
}
}
}

return CallNextHookEx( g_hHook, nCode, wParam, lParam );


n cazul mesajelor procesate, ale cror propagare la alte aplicaii trebuie blocat,
trebuie asigurat un timp de procesare ct mai redus, de ordinul milisecundelor. n caz
contrar, mesajul este transmis mai departe celorlalte aplicaii nregistrate pentru acest
eveniment.
Pornind de la o asemenea aplicaie, care spioneaz tastele apsate de utilizator, pot
fi construite aplicaii cu suport de comunicare pe reea, care s transmit mai departe
aceste informaii. n plus, informaiile legate de apsarea tastelor pot fi combinate cu alte
informaii legate de procesele care ruleaz, arhitectura hardware, etc., care nsumate pot fi
utilizate pentru construirea unor atacuri devastatoare.
Pentru ca utilizatorul obinuit s nu poat depista aplicaia de spionare din Task
Manager, acesteia i se poate da un nume care duce cu gndul la aplicaii ale sistemului,
vitale pentru execuia acestuia, cum ar fi kernel32 sau sys64service. Pe de alt parte, dac
se dorete blocarea operaiei de terminare a aplicaiei de spionare, aceasta trebuie
instalat cu drepturi de super-utilizator.

Tem. S se implementeze o aplicaie fr fereastr care determin denumirea
utilizator i parola introduse de utilizator ntr-un cont de Yahoo Mail. Informaiile extrase
sunt logate ntr-un fiier. Aplicaia va bloca evenimentul vizualizrii meniului de start pe
baza apsri butonului START, va afia mesaj You have been hacked! pentru tasta F1
i i va termina execuia la apsarea tastei F12.

You might also like