You are on page 1of 45

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

C++. Elementarz
hakera
Autor: Michael Flenov
Tumaczenie: Przemysaw Szeremiota
ISBN: 83-7361-801-5
Tytu oryginau: Hackish C++ Pranks & Tricks
Format: B5, stron: 296

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

Haker, wbrew utartym pogldom, nie jest osob, ktrej gwnym celem jest niszczenie
haker to kto, kto podchodzi do standardowych problemw programistycznych
w niestandardowy sposb, tworzc wasne rozwizania, czsto zaskakujce innych.
Opracowywanie takich nietypowych rozwiza wymaga wszechstronnej wiedzy
z zakresu programowania, znajomoci systemu operacyjnego i umiejtnoci
wynajdowania i stosowania nieudokumentowanych funkcji jzykw programowania
i platform systemowych.
C++. Elementarz hakera to ksika przeznaczona dla wszystkich tych, ktrym
zwyke programowanie ju nie wystarcza i ktrzy chc stworzy co wyjtkowego.
Przedstawia techniki, dziki ktrym programy bd dziaa szybciej, a efekty ich
dziaania bd zachwyca i zaskakiwa. Czytajc j nauczysz si pisa aplikacje,
ktre rozbawi lub zirytuj innych uytkownikw, jak tworzy narzdzia do
skanowania portw i jak wykorzystywa wiedz o systemach operacyjnych
i jzykach programowania do optymalizacji i przyspieszania dziaania programw.
Optymalizacja kodu rdowego i usuwanie wskich garde
Zasady prawidowego projektowania aplikacji
Tworzenie programw-artw
Programowanie w systemie Windows
Sieci i protokoy sieciowe
Implementacja obsugi sieci we wasnych aplikacjach
Sztuczki ze sprztem
Techniki hakerskie
Wiedzc, jak dziaaj hakerzy, bdziesz w stanie zabezpieczy swoje aplikacje przed
atakami tych, ktrzy swoj wiedz wykorzystuj w niewaciwy sposb.

Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl

Spis treci
Wstp ............................................................................................... 7
Wprowadzenie ................................................................................... 9
O ksice ........................................................................................................................... 9
Kim jest haker? Jak zosta hakerem? .............................................................................. 11

Rozdzia 1. Jak uczyni program zwartym, a najlepiej niewidzialnym? .................. 19


1.1. Kompresowanie plikw wykonywalnych................................................................. 19
1.2. Ani okna, ani drzwi .............................................................................................. 24
1.3. Wntrze programu .................................................................................................... 30
1.3.1. Zasoby projektu ............................................................................................. 31
1.3.2. Kod rdowy programu ................................................................................ 33
1.4. Optymalizacja programu .......................................................................................... 43
Zasada 1. Optymalizowa mona wszystko............................................................. 44
Zasada 2. Szukaj wskich garde i sabych ogniw.................................................... 44
Zasada 3. W pierwszej kolejnoci optymalizuj operacje czsto powtarzane............ 45
Zasada 4. Pomyl dwa razy, zanim zoptymalizujesz operacje jednorazowe ............ 47
Zasada 5. Poznaj wntrze komputera i sposb jego dziaania.................................. 48
Zasada 6. Przygotuj tabele gotowych wynikw oblicze i korzystaj z nich
w czasie dziaania programu.................................................................................. 49
Zasada 7. Nie ma niepotrzebnych testw................................................................. 50
Zasada 8. Nie bd nadgorliwy ................................................................................ 50
Podsumowanie ......................................................................................................... 51
1.5. Prawidowe projektowanie okien ............................................................................. 51
1.5.1. Interfejs okna gwnego................................................................................. 54
1.5.2. Elementy sterujce ......................................................................................... 55
1.5.3. Okna dialogowe ............................................................................................. 55

Rozdzia 2. Tworzenie prostych programw-artw.............................................. 61


2.1. Latajcy przycisk Start ............................................................................................. 62
2.2. Zacznij prac od przycisku Start............................................................................... 71
2.3. Zamieszanie z przyciskiem Start .............................................................................. 73
2.4. Wicej dowcipw z paskiem zada .......................................................................... 76
2.5. Inne arty.................................................................................................................. 83
Jak zgasi monitor? .............................................................................................. 83
Jak uruchamia systemowe pliki CPL?.................................................................... 83
Jak wysun tack napdu CD-ROM?..................................................................... 84
Jak usun zegar z paska zada?.............................................................................. 86

C++. Elementarz hakera


Jak ukry cudze okno? ............................................................................................. 86
Jak ustawi wasn tapet pulpitu? .......................................................................... 87
2.6. Berek z mysz .......................................................................................................... 88
Szalona mysz ........................................................................................................... 88
Latajce obiekty ....................................................................................................... 89
Mysz w klatce .......................................................................................................... 90
Jak zmieni ksztat wskanika myszy? .................................................................... 91
2.7. Znajd i zniszcz ........................................................................................................ 92
2.8. Pulpit ........................................................................................................................ 93
2.9. Bomba sieciowa ....................................................................................................... 94

Rozdzia 3. Programowanie w systemie Windows ............................................... 97


3.1. Manipulowanie cudzymi oknami.............................................................................. 97
3.2. Gorczkowa drczka............................................................................................. 102
3.3. Przeczanie ekranw ............................................................................................. 103
3.4. Niestandardowe okna ............................................................................................. 107
3.5. Finezyjne ksztaty okien ......................................................................................... 113
3.6. Sposoby chwytania nietypowego okna................................................................... 119
3.7. Ujawnianie hase .................................................................................................... 121
3.7.1. Biblioteka deszyfrowania hase.................................................................... 122
3.7.2. Deszyfrowanie hasa .................................................................................... 126
3.7.3. Obrmy to w art........................................................................................ 128
3.8. Monitorowanie plikw wykonywalnych ................................................................ 130
3.9. Zarzdzanie ikonami pulpitu .................................................................................. 132
3.9.1. Animowanie tekstu ...................................................................................... 133
3.9.2. Odwieanie pulpitu..................................................................................... 134
3.10. arty z wykorzystaniem schowka .......................................................................... 134

Rozdzia 4. Sieci komputerowe ........................................................................ 139


4.1. Teoria sieci i protokow sieciowych ..................................................................... 139
4.1.1. Protokoy sieciowe....................................................................................... 141
Protok IP ................................................................................................... 142
Protok ARP a protok RARP .................................................................. 143
4.1.2. Protokoy transportowe ................................................................................ 143
Protok UDP szybki .............................................................................. 143
Protok TCP wolniejszy, ale solidniejszy .............................................. 144
TCP zagroenia i saboci ....................................................................... 145
4.1.3. Protokoy warstwy aplikacji tajemniczy NetBIOS.................................. 145
4.1.4. NetBEUI ...................................................................................................... 146
4.1.5. Gniazda w Windows .................................................................................... 147
4.1.6. Protokoy IPX/SPX...................................................................................... 147
4.1.7. Porty............................................................................................................. 148
4.2. Korzystanie z zasobw otoczenia sieciowego ........................................................ 148
4.3. Struktura otoczenia sieciowego .............................................................................. 151
4.4. Obsuga sieci za porednictwem obiektw MFC.................................................... 158
4.5. Transmisja danych w sieci za porednictwem obiektu CSocket............................. 165
4.6. Bezporednie odwoania do biblioteki gniazd ........................................................ 174
4.6.1. Obsuga bdw ........................................................................................... 175
4.6.2. Wczytywanie biblioteki gniazd.................................................................... 175
4.6.3. Tworzenie gniazda ....................................................................................... 179
4.6.4. Funkcje strony serwera ................................................................................ 180
4.6.5. Funkcje strony klienta .................................................................................. 184
4.6.6. Wymiana danych.......................................................................................... 186
4.6.7. Zamykanie poczenia.................................................................................. 191
4.6.8. Zasady stosowania protokow bezpoczeniowych .................................... 192

Spis treci

5
4.7. Korzystanie z sieci za porednictwem protokou TCP ........................................... 194
4.7.1. Przykadowy serwer TCP............................................................................. 194
4.7.2. Przykadowy klient TCP .............................................................................. 199
4.7.3. Analiza przykadw ..................................................................................... 202
4.8. Przykady wykorzystania protokou UDP .............................................................. 204
4.8.1. Przykadowy serwer UDP ............................................................................ 204
4.8.2. Przykadowy klient UDP ............................................................................. 205
4.9. Przetwarzanie odebranych danych.......................................................................... 207
4.10. Wysyanie i odbieranie danych............................................................................... 209
4.10.1. Funkcja select .............................................................................................. 210
4.10.2. Prosty przykad stosowania funkcji select.................................................... 211
4.10.3. Korzystanie z gniazd za porednictwem komunikatw systemowych ......... 213
4.10.4. Asynchroniczna wymiana danych z wykorzystaniem obiektw zdarze ..... 220

Rozdzia 5. Obsuga sprztu ............................................................................. 223


5.1. Parametry podsystemu sieciowego......................................................................... 223
5.2. Zmiana adresu IP komputera.................................................................................. 229
5.3. Obsuga portu szeregowego.................................................................................... 234
5.4. Pliki zawieszajce system....................................................................................... 239

Rozdzia 6. Sztuczki, kruczki i ciekawostki ...................................................... 241


6.1. Algorytm odbioru-wysyania danych ..................................................................... 242
6.2. Szybki skaner portw ............................................................................................. 245
6.3. Stan portw komputera lokalnego .......................................................................... 252
6.4. Serwer DHCP......................................................................................................... 257
6.5. Protok ICMP ....................................................................................................... 260
6.6. ledzenie trasy wdrwki pakietu .......................................................................... 267
6.7. Protok ARP ......................................................................................................... 273

Podsumowanie .............................................................................. 283


Skorowidz...................................................................................... 285

Rozdzia 3.

Programowanie
w systemie Windows
W niniejszym rozdziale przyjrzymy si rnym narzdziom systemowym. Zobaczymy
przykady programw, ktre pomagaj podglda przebieg pracy komputera. Nie su
one tylko do zabawy. Bdziemy w istocie pracowa z systemem operacyjnym, cho w wielu
przykadach bdziemy si ucieka do artw. Pisaem ju, e kady haker to profesjonalista powinien wic zna tajniki systemu operacyjnego, z ktrego korzysta.
Zakadam tutaj, e Czytelnik korzysta z systemu Windows i pisze bd ma zamiar pisa
programy przeznaczone do uruchamiania w tym wanie systemie. Rozdzia ten ma
Czytelnikowi pomc lepiej zrozumie system. Jak zwykle, zamiast przecia pami
teori, bdziemy si uczy przez praktyk. Czytelnicy moich poprzednich ksiek z pewnoci pamitaj to podejcie. Zawsze twierdziem, e jedynie praktyka daje prawdziw
wiedz. Dlatego wszystkie moje ksiki s wprost przeadowane przykadami. Nie inaczej bdzie tym razem.
Zabierzemy si za chwil za analiz kilku ciekawych przykadw. Bd one ilustrowa
techniki pracy w systemie operacyjnym Windows i uczy praktycznego ich zastosowania. Mam nadziej, e cho niektre z nich przydadz si Czytelnikowi w pracy.
Bd stara si w tym rozdziale stopniowa poziom zaawansowania przykadw, tak
aby kolejne prezentacje wnosiy co nowego i Czytelnik nie straci zainteresowania
tematem.

3.1. Manipulowanie cudzymi oknami


W mojej skrzynce poczty elektronicznej czsto lduj pytania: Jak zamkn czyje
okno albo co w nim zmieni?. Zasadniczo zadanie to mona atwo zrealizowa
funkcj , z ktr zdylimy si ju zapozna. Jeli jednak zachodzi potrzeba

98

C++. Elementarz hakera

ingerowania w kilka (albo wszystkie) okien, naleaoby skorzysta z innej ni proponowana wczeniej metody wyszukiwania. Napiszmy na pocztek program, ktry wyszuka wszystkie okna na pulpicie i zmieni ich tytuy.
Rysunek 3.1 prezentuje wpyw naszego programu na okno innego programu. Jak wida,
to ostatnie ma na belce tytuowej napis: Widz Ci!.

Rysunek 3.1. Efekt dziaania programu

Utwrz w Visual C++ nowy projekt Win32 Project i wyposa go w menu, za pomoc
ktrego bdziesz uruchamia waciw funkcj programu.
Do funkcji  
dodaj nastpujcy kod obsugi komunikatu wywoania menu:

   



   


    jest tu oczywicie identyfikatorem utworzonej pozycji menu.

Obsugujca j ptla  jest ptl nieskoczon wywoujc wci funkcj 
 . To funkcja WinAPI wykorzystywana do wyliczania
wszystkich otwartych okien. Jej pierwszym parametrem jest adres innej funkcji (tzw.
funkcji zwrotnej), ktra bdzie wywoywana za kadym razem, kiedy wykryte zostanie dziaajce okno. Drugi parametr to liczba przekazywana do owej funkcji zwrotnej.
W roli funkcji zwrotnej wystpuje tu . Dla kadego okna, ktre znajdzie funkcja , wywoana zostanie funkcja . Oto jej kod:

Rozdzia 3. Programowanie w systemie Windows

99

!" #""!# $  


% &''uchwyt okna-rodzica
"(##)(*+*''parametr wasny funkcji zwrotnej


,--*.-& ,/"(##"( ,0 12 230
 



Liczba i typy parametrw funkcji zwrotnej oraz typ wartoci zwracanej powinny by
nastpujce:
 Pierwszy parametr uchwyt znalezionego okna (typu  ).
 Drugi parametr warto typu !"#" wykorzystywana wedle uznania

programisty funkcji zwrotnej.


 Warto zwracana warto logiczna (typu $!).

Jeli zmienisz typy bd kolejno parametrw albo typ wartoci zwracanej, funkcja
stanie si niezgodna z funkcj . Aby unikn pomyek, skopiowaem nazw funkcji i jej parametry z plikw pomocy opisujcych interfejs WinAPI. Wol to
od pniejszego szukania literwek w kodzie rdowym i zalecam wszystkim takie
samo postpowanie. W tym celu naley odszuka w pomocy haso  i znale w opisie odsyacz do opisu formatu funkcji zwrotnej.
W momencie wywoania funkcji zwrotnej mamy do dyspozycji uchwyt nastpnego
znalezionego okna. Wykorzystywalimy ju takie uchwyty do chowania okien. Teraz
sprbujemy za porednictwem uchwytu zmieni tytu okna. Posuy do tego znana
nam ju funkcja %&&'(& suca do wysyania komunikatw systemu Windows.
Oto jej parametry:
 Uchwyt okna adresata komunikatu. Otrzymalimy go w postaci parametru

wywoania funkcji zwrotnej.


 Typ komunikatu  %))*) to komunikat zmieniajcy tytu okna.
 Parametr komunikatu tutaj 0.
 Cig nowego tytuu okna.

Aby program kontynuowa wyszukiwanie kolejnych okien, funkcja zwrotna powinna


zwrci warto )#.
Kod rdowy tego przykadu oraz jego pliki wykonywalne znajduj si na doczonej
do ksiki pycie CD-ROM w podkatalogu \Przykady\Rozdzia3\ISeeYou.

Skomplikujmy nieco program, zmieniajc na pocztek funkcj  w sposb


nastpujcy:
!" #""!# $  
% &''uchwyt okna-rodzica
"(##)(*+*''parametr wasny funkcji zwrotnej


100

C++. Elementarz hakera



,--*.-& ,/"(##"( ,0 12 230
 &) & &) 
 



Tym razem po wysaniu do znalezionego okna komunikatu zmiany tytuu wywoywana jest funkcja +,, ktra wyszukuje wszystkie okna potomne danego okna. Przyjmuje ona trzy parametry:
 Uchwyt okna rodzica, ktrego okna potomne maj by wyszukane. Podajemy

tu wanie odnalezione okno, ktrego uchwyt przekazany zosta w wywoaniu


.
 Adres funkcji zwrotnej wywoywanej dla kolejnych okien potomnych.
 Liczba przekazywana jako wasny parametr funkcji zwrotnej.

atwo zauway, e funkcja +, powinna dziaa podobnie jak 


. Ta ostatnia zmienia tytuy wszystkich okien w systemie, pierwsza za bdzie
zmienia nazwy okien potomnych. Przykadem efektu jej dziaania jest rysunek 3.2.
Rysunek 3.2.
Okno
ze zmienionymi
podpisami okien
potomnych

Wiemy ju, e rwnie +, ma zmienia podpis czy tytu okna. Aby po zmianie
mona byo kontynuowa wyszukiwanie okien potomnych, funkcja powinna zwrci
warto )#.
Program mona by uzna za kompletny, ale ma on jeszcze pewn sabo, ktr trzeba wyeliminowa. Przypumy, e program znajdzie okno i rozpocznie wyliczanie
jego okien potomnych, ale uytkownik nagle zamknie okno-rodzica. Program bdzie
prbowa wysa komunikat do znalezionego okna potomnego, ktre nie bdzie ju
istniao, co doprowadzi do bdu wykonania programu. Aby tego unikn, naleaoby
za kadym razem sprawdza poprawno otrzymanego uchwytu okna:

Rozdzia 3. Programowanie w systemie Windows

101

 &44
 



Teraz program mona uzna za gotowy.


Pamitaj, e nie ma czego takiego, jak nadmierna ostrono w programowaniu. Jeli
program ma by niezawodny, naley wzi pod uwag wszystkie moliwe okolicznoci jego dziaania, ktre mog doprowadzi do problemw. W niektrych przykadach
ignoruj t regu, chcc unikn komplikowania i gmatwania kodu przykadowego.
Bd jednak wskazywa te miejsca w kodzie, ktre wymagaj szczeglnej rozwagi.
Kod rdowy tego przykadu oraz jego pliki wykonywalne znajduj si na doczonej do
ksiki pycie CD-ROM w podkatalogu \Przykady\Rozdzia3\ISeeYou2.

W przykadach z rozdziau 2. prbowaem zazwyczaj umieci cay kod w gwnej ptli


komunikatw. Program wykonywa swoje zadanie, a potem przechodzi do obsugi komunikatw systemowych. Aby zakoczy takie programy, wystarczyo zamkn ich
okna. W programie, ktry teraz omawiamy, wystpuje nieskoczona ptla poza ptl
obsugi komunikatw. Oznacza to, e w czasie dziaania programu, kiedy wkroczy on ju
do naszej ptli nieskoczonej, obsuga komunikatw zostanie zawieszona. Taki program
bardzo trudno byoby zamkn. Uytkownik programu od razu zrozumie, w czym sk,
poniewa okno programu po wybraniu pozycji menu uruchamiajcej zmian tytuw
przestanie odpowiada. Bdzie mona pozby si programu jedynie przez jego zatrzymanie z poziomu menedera zada.
Taki efekt uboczny jest korzystny w przypadku okien niewidocznych. Jeli kod wywietlajcy okno gwne zostaby usunity z programu, rwnie gwna ptla komunikatw staaby si zbdna i mona by si jej pozby.
Dodajmy do naszego programu jeszcze jeden prosty, acz interesujcy efekt. Sprbujmy
zminimalizowa wszystkie okna. Funkcja zwrotna  (wywoywana dla
kadego znalezionego okna) powinna wyglda tak:
!" #""!# $  
% &''uchwyt okna-rodzica
"(##)(*+*''parametr wasny funkcji zwrotnej


,& &,   
 



W powyszym kodzie zastosowalimy now warto drugiego parametru funkcji


%+. Wymusza ona minimalizacj okna. Uruchamiajc ten program, naley
zachowa ostrono. Funkcja  wylicza bowiem wszystkie okna, rwnie
te, ktre s niewidoczne.
Kod rdowy tego przykadu oraz jego pliki wykonywalne znajduj si na doczonej
do ksiki pycie CD-ROM w podkatalogu \Przykady\Rozdzia3\RandMinimize.

102

C++. Elementarz hakera

3.2. Gorczkowa drczka


Skomplikujmy przykad z poprzedniego podrozdziau, piszc program, ktry bdzie
zmienia pozycje i rozmiary wszystkich okien tak, aby system wyglda jak w febrze.
Stwrz nowy projekt typu Win32 Project w Visual C++. Dodaj do projektu pozycj menu,
za porednictwem ktrej bdziesz wywoywa rzeczony efekt. W kodzie rdowym
projektu znajd funkcj  
, obsugujc komunikaty kierowane do okna programu.
Ruchy okien musz by opniane tak, aby byy dobrze widoczne. Do tego celu przyda si zmienna typu " ! inicjalizowana wywoaniem funkcji  &'-&.&-:
%# "&
&4 +-*5-6-5
7#",0-50

Kod obsugi komunikatu wywoania polecenia menu powinien wyglda nastpujco:



7!#



   
 *57+,.)-89-:5&;''opnienie


Jak w poprzednim przykadzie inicjujemy ptl nieskoczon. Wewntrz ptli wyliczamy


wszystkie okna, opniajc kolejny przebieg ptli za pomoc znanej ju Czytelnikowi
funkcji '- %(,&/0&
-.
Najciekawszy jest w tym przykadzie kod funkcji zwrotnej  prezentowany na listingu 3.1.
Listing 3.1. Funkcja zwrotna EnumWindowsWnd
!" #""!# $  
% &''uchwyt okna-rodzica
"(##)(*+*''parametr wasny funkcji zwrotnej


  <8)-&447#",
 


 +-:5
=-5 -:5&+-:5

->4+*?@
 ->44

+-:5A5B4+-:5A5BCD
+-:5A)-E54+-:5A)-E5CD



+-:5A5B4+-:5A5BFD
+-:5A)-E54+-:5A)-E5FD


Rozdzia 3. Programowanie w systemie Windows

103

6- &+-:5A)-E5+-:5A5B+-:5A+.&5F+-:5A)-E5
+-:5A855F+-:5A5B

 



Spjrzmy, co takiego robi funkcja  wywoywana dla kadego znalezionego w systemie okna. Po pierwsze, wywouje ona funkcj 1/,&, ktra sprawdza, czy znalezione okno jest w tej chwili widoczne. Jeli nie jest, funkcja zwrotna
zwraca warto )#, umoliwiajc jej wywoanie dla kolejnego okna. Jeli okno jest
niewidoczne, nie warto go przesuwa czy rozciga.
Nastpnie wywoywana jest funkcja 2&-#&
-. Przyjmuje za porednictwem pierwszego parametru uchwyt okna docelowego, zwracajc w drugim parametrze rozmiary
okna opisane struktur #) (opisujc wsprzdne prostoktnego obszaru okna polami ,&3-, -4, (+- i /--).
Po okreleniu rozmiarw okien wyznaczamy funkcj ' liczb losow z zakresu od
zera do jeden. Jeli wynik jest rwny zero, wartoci pl -4 i ,&3- struktury wymiarw
okna s zwikszane o 3. Jeli wypadnie jeden, wartoci tych pl s zmniejszane o 3.
Po zmianie parametrw prostokta przesuwamy okno funkcj .&. Przyjmuje
ona nastpujce parametry:
 Uchwyt okna, ktrego pozycja ma zosta zmieniona (+).
 Now pozycj lewej krawdzi okna ( &
-5,&3-).
 Now pozycj grnej krawdzi okna ( &
-5-4).
 Now szeroko okna ( &
-5 (+- &
-5,&3-).
 Now szeroko okna ( &
-5/-- &
-5-4).

Na koniec funkcja zwrotna zwraca )#, umoliwiajc dalsze poszukiwania okien.


Po uruchomieniu programu zobaczysz, jak wywietlone na pulpicie okna zaczynaj
dre. Program zmienia losowo ich pozycje. Sam sprawd. Efekt jest wstrzsajcy.
Kod rdowy tego przykadu oraz jego pliki wykonywalne znajduj si na doczonej do ksiki pycie CD-ROM w podkatalogu \Przykady\Rozdzia3\Vibration.

3.3. Przeczanie ekranw


Pamitam, kiedy na rynku pojawia si pierwsza wersja programu Dashboard (dla Windows 3.1). Zainteresowaem si przeczaniem ekranw i prbowaem znale funkcj
WinAPI, ktra przyjmowaaby poprzez parametr podany ekran. Nie udao si, nie
byo takiej funkcji.

104

C++. Elementarz hakera

Pniej odkryem, e ta funkcja zostaa zapoyczona z Linuksa, w ktrym jdro systemu implementuje konsole (ekrany) wirtualne. Taka implementacja bya jednak skomplikowana. Zdoaem napisa jednak wasne narzdzie do przeczania ekranw w systemach Windows 9x. Sprbuj pokaza, jak wykorzysta zastosowane w nim techniki
w prostym programie-arciku.
Jak dziaa przeczanie pomidzy ekranami? Zdradz Ci sekret w rzeczywistoci
nie odbywa si adne przeczanie. Wszystkie widoczne okna s po prostu usuwane
z pulpitu, tak aby nie byo ich wida. Uytkownik otrzymuje pusty pulpit. Kiedy zechce
powrci do pierwotnego ekranu, wszystko jest po prostu ukadane z powrotem na
swoim miejscu. Jak wida, czasem najprostsze pomysy s najlepsze.
Przy przeczaniu ekranw trzeba momentalnie usun okna poza ekran. Bdziemy to
jednak robi powoli, tak aby dao si zaobserwowa sposb dziaania programu. Bdzie
to wyglda tak, jakby okna uciekay. Sam program bdzie niewidoczny, a jedynym
sposobem jego przerwania bdzie jego zakoczenie z poziomu okna menedera zada.
Tu ciekawostka: jeli nie zamkniemy programu w cigu kilku sekund, to rwnie okno
menedera zada ucieknie z ekranu i trzeba bdzie zaczyna zamykanie od pocztku.
Nie bdziemy jednak do przesuwania okien wykorzystywa dotychczasowych funkcji.
Funkcje, ktre ustawiaj pozycj okna, nie sprawdz si w tym zadaniu, poniewa przesuwaj i odrysowuj one kade okno z osobna, co zajmuje sporo czasu procesora. Jeli
na pulpicie bdzie 20 okien, ich przeniesienie funkcj %&- bdzie trwao
zdecydowanie za dugo.
Aby szybko zaimplementowa symulacj przeczania ekranw, powinnimy skorzysta ze specjalnych funkcji, ktre przesuwaj ca grup okien jednoczenie. Spjrzmy
na przykad wykorzystujcy te funkcje.
Utwrz w Visual C++ nowy projekt Win32 Project i przejd do funkcji -'.
Skorzystaj z listingu 3.2, aby uzupeni j (przed gwn ptl komunikatw) o kod przenoszcy okna.
Listing 3.2. Kod przemieszczajcy okna
%# "&4 +-*5-6-5
7#",0-50
''Nieskoczona ptla:




 5

->
% )5G;H
% 
  :5
  
4I=-5,J5--5+:, /,  CC

''Zlicz okna:
 54
4=-5 =-5-K5B =  %"

Rozdzia 3. Programowanie w systemie Windows

105

34

  <8)-

)5G 5H4
 5CC

4=-5 = %  /''Szukaj okna

% ( ,5+:54!-.-E-+ ( 5
  
->4->I 5->CC

=-5 -:5)5G->H :5
 ,5+:54-E-+ ( ,5+:5)5G->H% !
 :5A)-E5F; :5A5B
 :5A+.&5F :5A)-E5
 :5A855F :5A5B
, ( # <#LL, (  

-E-+ ( ,5+:5''Waciwe przenosiny

 *57+,.)-89-:5&D''Trzysekundowe opnienie

Na pocztku tego kodu tworzymy zdarzenie puste, ktre pniej wykorzystamy w implementacji opnienia.
Nastpnie uruchamiamy ptl nieskoczon ()#). Kod wewntrz ptli skada
si z trzech czci: pozyskiwania uchwytw widocznych okien, zbiorowego przesunicia
okien do nowej pozycji i opnienia. Opnienie wprowadzalimy ju wielokrotnie,
wic nie powiniene mie kopotw z jego zrozumieniem.
Wyszukiwanie widocznych okien realizowane jest nastpujco:
''Zlicz okna:
 54
4=-5 =-5-K5B =  %"
34

  <8)-

)5G 5H4
 5CC

4=-5 = %  /''Szukaj okna

W pierwszym wierszu tego kodu pozyskujemy uchwyt pierwszego okna z pulpitu i zapisujemy go w zmiennej . Nastpnie uruchamiamy ptl, w ktrej pozyskujemy kolejne uchwyty okien a do momentu pozyskania uchwytu zerowego.

106

C++. Elementarz hakera

Wewntrz ptli sprawdzamy widoczno okna, korzystajc z funkcji 1/,&


wywoywanej z parametrem . Jeli okno jest niewidoczne albo zminimalizowane
(funkcja 1/,& zwraca wtedy "!%), nie trzeba go przesuwa. W przeciwnym przypadku dodajemy biecy uchwyt do tablicy uchwytw okien do przesunicia ,- i zwikszamy licznik okien -.
Funkcja 2&- zwraca uchwyty wszystkich widocznych okien, nie rozrniajc
okien nadrzdnych i okien potomnych. Uchwyt znalezionego okna jest zachowywany
w zmiennej .
W tym przykadzie uchwyty okien s przechowywane w tablicy o z gry okrelonym
rozmiarze (,-678). Ustaliem ten rozmiar na 10 000 elementw, co powinno
wystarczy do przechowywania uchwytw okien wszystkich dziaajcych aplikacji.
W rzeczy samej chyba nikt nie uruchomi naraz wicej ni 100 programw.
Najlepiej byoby zaprzc do przechowywania uchwytw tablice dynamiczne (takie,
ktrych rozmiar da si zmienia w czasie dziaania programu wedle potrzeb). Zdecydowaem jednak o wykorzystaniu tablicy statycznej, eby nie komplikowa programu.
Moim celem byo pokazanie ciekawego algorytmu i efektu moesz samodzielnie
ulepszy program.
Po wykonaniu tego kodu tablica ,- bdzie wypeniona uchwytami wszystkich
uruchomionych i widocznych okien, a zmienna - zawiera bdzie liczb tych
uchwytw. Wemy si teraz za zbiorowe przenoszenie okien. Proces rozpoczyna si
wywoaniem funkcji WinAPI $&( &3& . Funkcja ta przydziela pami dla
nowego okna pulpitu, do ktrego przeniesione zostan wszystkie widoczne okna.
Liczba okien do przeniesienia zadawana jest parametrem wywoania.
Aby przenie okna do przydzielonej pamici, naley wywoa funkcj &3& .
Nie przenosi ona tak naprawd okien, a jedynie zmienia przypisane do nich informacje o pozycjach i rozmiarach okien. Funkcja ta przyjmuje nastpujce parametry:
 Wynik dziaania funkcji $&( &3& .
 Uchwyt przenoszonego okna, czyli nastpny element tablicy ,-.
 Liczb porzdkow informujc o pozycji, ktr powinno zaj dane okno

wzgldem pozostaych.
 Cztery parametry okrelajce wsprzdne okna (zmniejszamy tu wsprzdn

poziom o 10) i jego rozmiary (szeroko i wysoko). Zostay one wczeniej


pozyskane wywoaniem funkcji 2&-.
 Znaczniki sterujce aktywnoci i pozycj okna wzgldem innych okien.

Po przeniesieniu wszystkich okien wywoujemy funkcj  &3& . W tym


momencie wszystkie okna przeskakuj do nowych pozycji. Odbywa si to byskawicznie. Gdybymy do przesuwania wykorzystali w ptli instrukcj %&-, odrysowywanie i przesuwanie kolejnych okien trwaoby znacznie duej.
Dobr praktyk jest inicjalizowanie i zwalnianie wszystkich zmiennych wymagajcych
znacznych iloci pamici (np. obiektw i tablic). Inicjalizacja oznacza przydzia pamici,

Rozdzia 3. Programowanie w systemie Windows

107

a zwolnienie jej zwrcenie do dyspozycji systemu. Jeli nie zwolnimy zajmowanych


zasobw, komputer by moe pniej odczuje ich niedostatek, co moe spowolni jego
dziaanie albo nawet wymusi przeadowanie systemu.
W tym przykadzie utworzylimy obiekt, ale go nie zwolnilimy, a to dlatego, e program
jest przeznaczony do dziaania w ptli nieskoczonej, ktr mona przerwa jedynie
na dwa sposoby:
 Odczeniem zasilania komputera w takim przypadku adna z aplikacji

nie zdoa zwolni pamici, bo cay system przestanie nagle dziaa.


 Zakoczeniem procesu programu jeli nawet uytkownik bdzie na tyle

sprytny, eby to zrobi, program zostanie zatrzymany w trybie natychmiastowym,


wic i tak nie udaoby mu si zwolni pamici, nawet, gdyby by wyposaony
w stosowny kod system bezwzgldnie przerwie dziaanie programu.
Okazuje si wic, e zwalnianie obiektu jest tu bezcelowe. Nie znaczy to, e mona darowa
sobie zwalnianie obiektw w pozostaych programach. Jeden dodatkowy wiersz kodu
nikomu nie zaszkodzi, a pozwoli na zachowanie stabilnoci i efektywnoci systemu.
Jeli uruchomisz program, wszystkie otwarte okna zaczn ucieka na lewo. Sprbuj
choby wywoa menu podrczne pulpitu (prawym przyciskiem myszy) nawet ono
po chwili ucieknie. W ten sposb z ekranu zniknie kady uruchomiony program.
Bardzo polubiem ten program. Bawiem si nim przeszo p godziny. Zaciekawi mnie
na tyle, e nie potrafiem sobie odmwi takiego marnotrawstwa czasu. Szczeglnie
spodoba mi si przymus szybkiego przerywania programu to naprawd nie jest
proste. Na pocztku ustawiem opnienie na 5 sekund, potem na cztery. wiczyem
intensywnie naciskanie kombinacji Ctrl+Alt+Del, wyszukiwanie programu na licie
procesw i naciskanie przycisku Zakocz zadanie. Trudno polega na tym, e okno
z list procesw rwnie przesuwa si po ekranie. Jeli nie zdysz na czas wykona
wszystkich czynnoci, bdziesz musia powtarza prb.
W podobny do pokazanego sposb implementowanych jest wikszo aplikacji przeczajcych pulpity. W kadym razie ja nie znam innej metody i nie znalazem adnych innych przydatnych w takim zadaniu funkcji systemowych.
Kod rdowy tego przykadu oraz jego pliki wykonywalne znajduj si na doczonej
do ksiki pycie CD-ROM w podkatalogu \Przykady\Rozdzia3\DesktopSwitch.

3.4. Niestandardowe okna


W zamierzchych czasach, w poowie lat dziewidziesitych, wszystkie okna byy
prostoktne i nikomu to nie przeszkadzao. W cigu ostatnich kilku lat modne stay
si jednak okna o ksztatach nieregularnych. Kady szanujcy si programista czuje
si wic w obowizku stworzy program z takimi oknami, aby bez wstydu i skutecznie konkurowa z oknami innych programistw.

108

C++. Elementarz hakera

Osobicie jestem przeciwny udziwnieniom interfejsu i okna o nieregularnych ksztatach


wykorzystuj jedynie sporadycznie. Pisaem o tym wczeniej i bd si powtarza,
poniewa temat jest istotny dla caego rynku oprogramowania komercyjnego. Programista musi jednak niekiedy utworzy okno o nieregularnych ksztatach. Poza tym
projektowanie takich okien jest dobrym wiczeniem wyobrani, a niniejsza ksika ma
na celu midzy innymi pobudzenie kreatywnoci Czytelnikw. Dlatego zajmiemy si
teraz kwest ksztatw okien.
Na pocztek stwrzmy okno owalne. Przyda si do tego nowy projekt Win32 Project
w Visual C++. Zmie jego funkcj - -'
& tak jak na listingu 3.3. Kod, ktry naley doda do funkcji, jest na listingu oznaczony komentarzami.
Listing 3.3. Tworzenie owalnego okna
!"55*:-% ,# &5*:-
 ,&

% & 
&54&5*:-'',5+-5*:-&*)-+.)8*)6*+*8)& 4 +-*5- 1  )*15)- ,<"#((   
 
,7#
" 
,7#
"
""
""&5*:-
""
 3& 

 
7#",

''Pocztek kodu do dodania
%= 7+.
  :5
=-5 -:5&  :5
7+.4 +-*5-))B5:. :5A+.&5F :5A)-E5
 :5A855F :5A5B
,-5 .& 7+.

''Koniec dodanego kodu
,& &  ,&

B*5- & 
 



W dodanym fragmencie kodu po pierwsze deklarujemy dwie zmienne:


  #( typu #2 suc do przechowywania tzw. regionw opisujcych

wygld okna.
 #&
- typu #) suc do przechowywania rozmiaru i pozycji okna.

Okrelaj one obszar, wewntrz ktrego zamknity bdzie owal okna.


Dalej wywoywana jest znana ju nam dobrze funkcja 2&-#&
- wypeniajca
zmienn #
- wymiarami i pozycj okna programu. Jestemy ju gotowi do skonstruowania owalnego okna. Bd nam do tego potrzebne dwie funkcje:  &'-&,,4-
#(
i %&-#(. Przyjrzyjmy si im bliej:

Rozdzia 3. Programowanie w systemie Windows

109

%=  +-*5-))B5:.

"-E5-:5''wsprzdna x grnego lewego naronika obszaru elipsy

B-:5''wsprzdna y grnego lewego naronika obszaru elipsy

.&5-:5''wsprzdna x dolnego prawego naronika obszaru elipsy

!55-:5''wsprzdna y dolnego prawego naronika obszaru elipsy


Funkcja ta tworzy owalny (eliptyczny) region okna. Robi to na podstawie zadanych


w wywoaniu wymiarw prostokta ograniczajcego owal.

,-5 .
% & ''uchwyt okna
%= &.''uchwyt regionu
!"8-+*''znacznik odrysowania okna po zmianie regionu


Ta funkcja przypisuje do okna okrelonego pierwszym parametrem wskazany drugim


parametrem region. Jeli trzeci parametr ma warto )#, okno zostanie po zmianie
regionu odrysowane. W przeciwnym razie trzeba bdzie odrysowanie wymusi samodzielnie. W powyszym kodzie po ustawieniu regionu wywoywana jest funkcja
4'-&. Okno zostanie i tak odrysowane trzeci parametr wywoania %&-
#( mgby wic mie rwnie dobrze warto "!%.
Uruchom program, a zobaczysz na ekranie okno owalne, jak na rysunku 3.3.

Rysunek 3.3. Owalne okno programu

110

C++. Elementarz hakera

Pjdmy nieco dalej i utwrzmy owalne okno z prostoktn dziur we wntrzu elipsy.
Zmie kod nastpujco:
%= 7+.-:5.
  :5
=-5 -:5&  :5
7+.4 +-*5-))B5:. :5A+.&5F :5A)-E5
 :5A855F :5A5B
-:5.4 +-*5--:5.;; :5A+.&5F :5A)-E5F;
 :5A855F :5A5BF;
8-.7+.7+.-:5.= 77
,-5 .& 7+.


Mamy tu deklaracje dwch zmiennych typu #2. Pierwsza z nich,  #(, bdzie przechowywa region owalny, utworzony funkcj  &'-&,,4-
#(. Druga ma przechowywa region prostoktny utworzony funkcj  &'-&#&
-#(. Tak jak przy tworzeniu regionu owalnego funkcja ta wymaga okrelenia wsprzdnych i rozmiarw
prostokta. Wynik dziaania funkcji zapisywany jest w zmiennej #&
-#(.
Po utworzeniu obu regionw skadamy je funkcj /&#(:

 8-.
%= &+.-5''uchwyt regionu wynikowego
%= &+.,+:;''uchwyt pierwszego regionu rdowego
%= &+.,+:@''uchwyt drugiego regionu rdowego

E 8--''tryb skadania


Funkcja ta skada dwa regiony rdowe (przekazane parametrami + (%


7 i + (%
9)
i zapisuje wynik zoenia w regionie + ( &-.
Tryb skadania mona okreli, nadajc czwartemu parametrowi wywoania funkcji
(3/&&) jedn z nastpujcych wartoci:
 # " region wynikowy bdzie iloczynem regionw rdowych.
 # : region wynikowy bdzie kopi regionu pierwszego.
 #  region wynikowy bdzie zawiera te obszary, ktre s w regionie

pierwszym, z wyjtkiem tych, ktre okrela region drugi.


 #2 # region wynikowy bdzie sum regionw rdowych.
 #2 *# region wynikowy bdzie sum wyczajc regionw rdowych.

Wynik dziaania programu wida na rysunku 3.4. Celowo w tle okna programu umieciem jednolity barwnie podkad, eby mona byo na jego tle zobaczy waciwy
ksztat okna.
Kod rdowy tego przykadu oraz jego pliki wykonywalne znajduj si na doczonej do
ksiki pycie CD-ROM w podkatalogu \Przykady\Rozdzia3\NoneUniformWindow.

Rozdzia 3. Programowanie w systemie Windows

111

Rysunek 3.4.
Owalne okno
z prostoktn
dziur

Moesz zmienia nie tylko ksztaty okien, ale rwnie ksztaty niektrych ich elementw sterujcych. Zobaczmy to na przykadzie.
Utwrz projekt typu MFC Application. Nie potrzebujemy tym razem zwartoci programu,
moemy wic uproci sobie programowanie, korzystajc z biblioteki MFC.
W kreatorze aplikacji przejd na zakadk Application Type i zaznacz pozycj Dialog
based (patrz rysunek 3.5). Pozostae parametry zostaw bez zmian. Ja swj projekt nazwaem None.
Rysunek 3.5.
Wybr typu aplikacji
w oknie kreatora
aplikacji MFC

Otwrz przegldark zasobw i kliknij dwukrotnie pozycj IDD_NONE_DIALOG w gazi Dialog. Umie na formularzu programu jeden komponent ListControl (jak na rysunku 3.6).
Aby mc obsugiwa nowy element sterujcy, kliknij go prawym przyciskiem myszy
i wybierz z menu podrcznego polecenie Add Variable. W oknie, ktre si pojawi,
wpisz w polu Variable Name nazw zmiennej. Nazwijmy j -&!- (patrz rysunek 3.7).
Moesz ju klikn przycisk Finish koczcy definiowanie zmiennej.

112

C++. Elementarz hakera

Rysunek 3.6. Formularz okna tworzonego programu


Rysunek 3.7.
Okno definiowania
zmiennych uchwytw
elementw
sterujcych

Otwrz teraz plik kodu rdowego NoneDlg.cpp i znajd w nim funkcj & ,(;;
 - ',(. Dodaj do niej poniszy kod, umieszczajc go na kocu funkcji za komentarzem // TODO: Add extra initializacion here:
''#->5+*5*)1*5&-+  :5
%= 7+.

Rozdzia 3. Programowanie w systemie Windows

113

=-5 -:55-"5 :5


7+.4 +-*5-))B5:*). :5A+.&5F :5A)-E5 :5A855F
:5A5B
,-5 .5-"57+.


Powyszy kod powinien by Ci znajomy; zmienna -&!- wystpuje tu w roli uchwytu


okna. Funkcje 2&-#&
- i %&-#&
- s poprzedzane znakami ;; wskazujcymi, e funkcje te s wywoywane z biblioteki WinAPI, a nie z MFC. Efekt dziaania
programu wida na rysunku 3.8.
Rysunek 3.8.
Efekt dziaania
programu None

Kod rdowy tego przykadu oraz jego pliki wykonywalne znajduj si na doczonej do ksiki pycie CD-ROM w podkatalogu \Przykady\Rozdzia3\None.

3.5. Finezyjne ksztaty okien


Wiemy ju, jak tworzy okna o prostych ksztatach geometrycznych (owali i prostoktw) i ich kombinacji. Pora na tworzenie okien o dosownie dowolnych ksztatach.
Jest to to zrozumiae zadanie znacznie bardziej skomplikowane ni kombinacja
dwch prostych figur geometrycznych.
Na rysunku 3.9 moesz zobaczy obrazek z czerwonym tem. Sprbujemy utworzy
okno, ktre bdzie zawiera ten obrazek i mie przezroczyste to (a nie czerwone, jak
na obrazku), tak by ksztat okna mia form obrazka. Efekt taki byoby niezwykle
trudno uzyska, gdybymy chcieli kombinowa regiony w sposb przypadkowy.
WinAPI pozwala co prawda na konstruowanie wieloktnych regionw, ale ich zastosowanie bynajmniej nie uatwia zadania.
C, sprbujmy utworzy region o ksztacie obrazka. Zaprezentuj tu sposb na tyle
uniwersalny, e mona go stosowa z dowolnymi obrazkami. Jest on przy tym prosty.

114

C++. Elementarz hakera

Rysunek 3.9.
Maska ksztatu okna

Najpierw zastanwmy si, co to jest obrazek. To po prostu dwuwymiarowa tablica


pikseli. Moemy kady z wierszy tej tablicy potraktowa jako osobny region. Innymi
sowy, dla kadego wiersza pikseli obrazka utworzymy jeden region, a potem poczymy
wszystkie regiony w jeden, wyznaczajcy ksztat okna. Algorytm ten mona rozpisa
nastpujco:
1. Przejrzyj biecy wiersz obrazka i odszukaj w nim pierwszy piksel niebdcy

pikselem ta. Zapamitaj wsprzdn pocztku prostoktnego regionu


w zmiennej *7.
2. Przejrzyj reszt wiersza obrazka w poszukiwaniu przeciwlegej granicy ta.
Pozycj ostatniego nieprzezroczystego piksela zapamitaj jako *9. Jeli do

koca wiersza nie znajdziesz pikseli ta, rozcignij region do koca wiersza.
3. Ustaw wsprzdn :7 na numer wiersza, a :9 na :7<7 (wysoko regionu

prostoktnego obejmujcego pojedynczy wiersz obrazka to jeden piksel).


4. Skonstruuj region na bazie otrzymanych wsprzdnych.
5. Przejd do nastpnego wiersza i powtrz kroki od 1. do 4.
6. Pocz otrzymane regiony i skojarz je z oknem.

To algorytm uproszczony, poniewa niekiedy jeden wiersz wymaga bdzie wicej ni


jednego regionu, jeli waciwy obrazek bdzie w danym wierszu przerywany tem.
Powyszy algorytm, zaimplementowany w jzyku C++, prezentowany jest na listingu 3.4.
Przeanalizujemy go nieco pniej.
Na razie chciabym skupi si na obrazku. Moe by nim dowolna bitmapa systemu
Windows. Rozmiar pliku obrazka zaley od rozmiaru obrazka. W naszym przykadzie
obrazek ma 200 na 200 pikseli i takie rozmiary zostay ustawione w kodzie. Moesz
jednak sprbowa uniezaleni kod od rozmiaru obrazka.
Zakadam, e piksel znajdujcy si na pozycji (0, 0) jest pikselem ta. Przygotowujc
obrazek, upewnij si, e wszystkie piksele ta maj ten sam kolor co piksel z naronika.
Takie zaoenie zwiksza elastyczno algorytmu, poniewa nie blokuje adnego okrelonego koloru jako koloru ta. Przy tym w naroniku obrazka rzadko znajduje si

Rozdzia 3. Programowanie w systemie Windows

115

istotny element obrazka i zawsze mona wstawi tam jeden piksel ta. Nie zniszczy to
zapewne estetyki obrazka.
Utwrz nowy projekt typu Win32 Project i znajd w kodzie rdowym funkcj - 
-'
&. Zmie funkcj tworzc okno:
& 4 +-*5- 1  )*15)- ,<"#((   
 
,7#
"@@
""
""
&5*:-
""

Dwie kolejne liczby 200 odnosz si do wymiarw okna dopasowanych do rozmiarw


obrazka. Jeli masz zamiar wykorzysta inny obrazek, powiniene odpowiednio
zmieni wartoci parametrw.
Z okna usuniemy te menu, bo nie bdzie nam potrzebne. W tym celu znajd funkcj
=#&(-& ,' i wiersz, w ktrym ustawiane jest pole 
&>5,4?&'&. Przypisz
do niej zero:
:->A)B1- *-4

W sekcji zmiennych globalnych dodaj dwie nowe zmienne:


%!#(*K!5*B
% & 

Pierwsza z nich bdzie przechowywa uchwyt obrazka, a druga to znana nam ju dobrze
zmienna uchwytu okna programu. Jej zadeklarowanie jako globalnej wymusza usunicie
lokalnej zmiennej + z funkcji - -'
&.
Zmie funkcj -' zgodnie z listingiem 3.4. Program jest gotowy.
Zanim uruchomisz program, skompiluj go i otwrz katalog, w ktrym znajduje si kod
rdowy. Jeli w czasie pracy wczony by tryb kompilacji Debug, zobaczysz podkatalog Debug. W innym przypadku znajdziesz tam podkatalog Release. Aby unikn
bdu uruchomienia, powiniene skopiowa do tego katalogu plik obrazka.
Listing 3.4. Tworzenie okna o dowolnych rozmiarach na bazie obrazka-maski

#( M5 *% ,# &5*:-
% ,# &(+-65*:-
"(,)B "-

 ,&

''()*:-:-&-+,=.
%# "&#::-)*8)-
''5*)1-.)8*)5+.
"*,5+.&5*:-,#(("15)-#/"#, =
"*,5+.&5*:- #,$   1  )*#/"#, =
J-.5-+ )*&5*:-
''(-+E+*BB):*55*)1*5
 355*:-&5*:- ,&


116

C++. Elementarz hakera


 
7#",

&#::-)*8)-4"*#::-)-+*5+&5*:-"( , #,$   
''Dodaj poniszy kod
''Na pocztek pozbaw okno belki tytuowej i menu systemowego

,5J)-
,5J)-4=-5 ".& = ",M"
,5J)-4,5J)-LL , #( 
,5J)-4,5J)-LL ,,M,

,-5 ".& = ",M",5J)-
,& &  ,&

B*5- & 
''Wczytaj rysunek
*K!5*B4%!#("**.-
""0*KA8B0
#=!#(""#77"
 3*K!5*B 

""
''Deklaracje niezbdnych zmiennych
!#(8
!M8BB
 +*(>-)
 B>-)

5*+5>
 9
%= .-.4 +-*5--:5.
=-589-:5*K!5*B !#(8
8BB48A8!5(>-)NND
!MOB!54 !MG8A8 5&O8A8%-.&5O8BBH
''Skopiuj pami rysunku

B4=-5!5*B!5*K!5*B8A8 5&O8A8%-.&5O8BBB!5
''Znajd kolor przezroczystoci
+*(>-)4O OB!5
+*(>-)II4D@F8A8!5(>-)
''Ptla przegldajca linie rysunku
  4I8A8%-.&5CC

5*+5>4F;
  949I8A8 5&9CC

B>-)4O OB!5CO8A8 5&C9O8BB
IID@F8A8!5(>-)
 B>-)34+*(>-)

 5*+5>I

5*+5>49
  9448A8 5&F;

Rozdzia 3. Programowanie w systemie Windows

117


.4 +-*5--:5.5*+5>9C;
 8-.-.-..= 
5*+5>4F;

  5*+5>N4

.4 +-*5--:5.5*+5>9C;
 8-.-.-..= 
5*+5>4F;




B!5
,-5 .& -.

6*)*5--:5&  
''Koniec dodanego kodu
''*-*.-)B
=-5-*.-.
"" 

 3+*)*5-#::-)-+*5+.A&&#::-)*8)-.

+*)*5--*.-.
B*5:&-*.-.


 

.A(*+*

W pierwszej kolejnoci usuwamy z okna belk tytuow i menu systemowe.


Nastpnie wczytujemy do pamici programu bitmap, korzystajc z funkcji !' '(&.
Obrazek jest wczytywany z pliku, wic pierwszy parametr ma warto !!, drugi to
nazwa pliku obrazka, a ostatni znacznik !# !" # !. Poniewa okrelamy
sam tylko nazw pliku obrazka (bez cieki dostpu) program bdzie szuka pliku
w tym samym katalogu, z ktrego zosta uruchomiony. Dlatego wanie przed uruchomieniem skompilowanego programu trzeba rcznie skopiowa plik obrazka do podkatalogu z plikiem wykonywalnym programu (Debug albo Release).
Program powinien sprawdza, czy plik znajduje si w biecym katalogu. Jeli '@$-'4
ma warto zero, naley uzna, e wczytanie obrazka si nie powiodo (najprawdopodobniej z powodu jego braku) i program powinnimy zakoczy.
 3*K!5*B 

""

Test ten jest niezbdny, poniewa prba odwoania si do pamici nienalecej faktycznie do obrazka spowodowaaby natychmiastowe zaamanie programu.
Dalej zaczyna si do skomplikowany kod. Aby go zrozumie, musisz wiedzie, jak
korzysta ze wskanikw. Nie bd jednak tego wyjania to temat na inn ksik.

118

C++. Elementarz hakera

Jeli uruchomisz przykad, zobaczysz okno takie jak na rysunku 3.10. Okno przyjmie
ksztat obrazka, ale bdzie puste. Utworzylimy bowiem tylko ksztat okna. Aby wypeni okno obrazkiem, bdziemy musieli uzupeni program o nastpujcy kod obsugi
komunikatu  " ):
 (# 
&:4!-.(*5& B
''#J+*.:-&-+-AAA
&:!54 +-*5- B*58)- &:
,-)-:589-:5&:!5*K!5*B
!5!)5&:@@&:!5, (M
-)-5- &:!5
(*5& B
 

Rysunek 3.10.
Pusty ksztat okna

Odrysowujemy zawarto okna tak samo jak swego czasu odrysowywalimy w oknie obraz przycisku Start. Efekt moesz podziwia na swoim ekranie i rysunku 3.11.
Rysunek 3.11.
Kompletne okno
o dowolnym
ksztacie

Kod rdowy tego przykadu oraz jego pliki wykonywalne znajduj si na doczonej
do ksiki pycie CD-ROM w podkatalogu \Przykady\Rozdzia3\MaskWindow.

Rozdzia 3. Programowanie w systemie Windows

119

3.6. Sposoby chwytania


nietypowego okna
Korzystajc z kodu z podrozdziau 3.5, moemy uzyska okno o dowolnym niemal
ksztacie. Ma ono jednak pewn dotkliw wad okna nie mona przesuwa po ekranie, gdy nie ma go po prostu za co chwyci mysz! Okno nie posiada belki tytuowej
ani menu systemowego, za pomoc ktrych mona przesuwa zwyke okna. Posiada za
to prostoktny obszar roboczy, co dodatkowo utrudnia zadanie.
Aby pozby si tej niedogodnoci, powinnimy nauczy program, jak przesuwa
okno po klikniciu mysz w dowolnym punkcie ksztatu okna. Mamy do wyboru
dwa sposoby:
 Kiedy uytkownik kliknie w obszarze roboczym okna, moemy oszuka system

operacyjny, udajc, e uytkownik klikn w obszarze (nieistniejcej) belki


tytuowej. To najprostsze rozwizanie i wymaga zaledwie jednego wiersza
kodu. Jest jednak w praktyce mao wygodne, dlatego zainteresujemy si
sposobem drugim.
 Moemy samodzielnie przesuwa okno. Wymaga to wikszej iloci kodu,

ale daje rozwizanie uniwersalne i elastyczne.


Aby zaimplementowa drugie z proponowanych rozwiza, powinnimy oprogramowa
obsug nastpujcych zdarze:
 Zdarzenia nacinicia przycisku myszy naley wtedy zapisa biec pozycj

wskanika myszy i sygna zdarzenia w odpowiedniej zmiennej. W naszym


przykadzie zastosujemy zmienn  '((( typu /,. Dodatkowo powinnimy
przechwyci mysz tak, aby po klikniciu okna wszystkie komunikaty o ruchu
myszy byy kierowane do naszego okna. Suy do tego funkcja %&-'4- &
wymagajca przekazania uchwytu okna-odbiorcy komunikatw.
 Zdarzenia przesunicia wskanika myszy jeli zmienna  '((( ma warto
)#, oznacza to, e uytkownik ostatnio klikn w obszarze okna i obecne

przesunicia powinny porusza oknem. W tym przypadku powinnimy


aktualizowa pozycj okna zgodnie z nowymi wsprzdnymi wskanika
myszy. Jeli  '((( ma warto "!%, nie trzeba przesuwa okna.
 Zdarzenia zwolnienia przycisku myszy naley przypisa zmiennej  '(((
warto "!%, aby zablokowa dalsze przesuwanie okna wraz z przesuniciami

wskanika myszy.
Moemy wykorzysta kod poprzedniego przykadu, wystarczy znale w nim funkcj
 
i doda do niej oznaczony odpowiednimi komentarzami kod z listingu 3.5.

Wczeniej w sekcji zmiennych globalnych naleaoby zadeklarowa dwie zmienne:


8)+*...47#",
( -(5

120

C++. Elementarz hakera

Listing 3.5. Kod przecigajcy okno za wskanikiem myszy


",
" #""!# $ (+:% & 
 -*.- (##(*+*"(##)(*+*


6-5
(# ,
B
% &:
% &:!5
 +-:5
( B5

-*.-

  # 
4" (*+*
6-54% (*+*
''(*+-5&---)-:5



#!

*).!>&5"( ,#!
!/& "=( #85
 
/
-5+J & 
 
  

 
-E (+:& -*.-(*+*)(*+*

 
 (# 
&:4!-.(*5& B
''#J+*.:-&-+-AAA
&:!54 +-*5- B*58)- &:
,-)-:589-:5&:!5*K!5*B
!5!)5&:@@&:!5, (M
-)-5- &:!5
(*5& B
 
 ,M
(5P5-*.-
 
''Kod obsugi interesujcych nas zdarze
''Nacinicie lewego przycisku myszy:
 "!
  
=-5 ++(-(5
+*...4

,-5 *B5+-& 
 
''Przesuwanie wskanika myszy:
 
,<
 +*...''jeli wczeniej nacinito przycisk myszy

''Pobierz biec pozycj wskanika:
=-5 ++(B5
''Pobierz biecy obszar okna:

Rozdzia 3. Programowanie w systemie Windows

121

=-5 -:5& +-:5


''Dostosuj pozycj okna
+-:5A)-E54+-:5A)-E5CB5A>F-(5A>
+-:5A5B4+-:5A5BCB5AJF-(5AJ
''Ustaw nowy obszar okna:
,-5 (& 
""+-:5A)-E5+-:5A5B
, (  L, ( , 
''Zapisz biec pozycj wskanika myszy w zmiennej:
-(54B5

 
''Zwolnienie lewego przycisku myszy:
 "!

(
 +*...

+*...4 
-)-*- *B5+-

  

 
-E (+:& -*.-(*+*)(*+*

 


Wszystkie funkcje wykorzystane w tym przykadzie s ju Czytelnikowi znane. Program


jest jednak do rozlegy, wic opatrzyem go wiksz ni zwykle liczb komentarzy,
ktre powinny pomc w analizie jego dziaania.
Kod rdowy tego przykadu oraz jego pliki wykonywalne znajduj si na doczonej
do ksiki pycie CD-ROM w podkatalogu \Przykady\Rozdzia3\MaskWindow2.

3.7. Ujawnianie hase


W wikszoci aplikacji wprowadzane do nich hasa s wywietlane w postaci szeregu
gwiazdek. Ma to zapobiec podejrzeniu hasa przez osoby niepowoane. Ale co, jeli zapomnimy hasa? Jak je odczyta, jeli w polu hasa wida tylko gwiazdki? Istnieje kilka
narzdzi, ktre na to pozwalaj. Jestem jednak daleki od odsyania do nich Czytelnika.
Zamiast i na atwizn, sami napiszemy potrzebny program.
Program bdzie si skada z dwch plikw. Pierwszy z nich plik wykonywalny
bdzie wczytywa do pamici programu inny plik (plik biblioteki DLL). Kod z tej biblioteki zostanie zarejestrowany w systemie w roli kodu obsugi komunikatw nacinicia prawego przycisku myszy w konkretnym oknie. W tym momencie tekst z tego
okna zostanie zamieniony z postaci cigu gwiazdek na posta zwykego cigu znakw.
Brzmi to bardzo uczenie, ale da si oprogramowa w par minut.

122

C++. Elementarz hakera

3.7.1. Biblioteka deszyfrowania hase


Dla potrzeb tego przykadu oprogramowaem specjaln bibliotek DLL. Teraz zrobimy to
samo wsplnie. Utwrz w Visual C++ nowy projekt Win32 Project i nazwij go OpenPassDLL. W kreatorze aplikacji wybierz DLL jako typ aplikacji (jak na rysunku 3.12).
Rysunek 3.12.
Ustawienia kreatora
aplikacji dla
biblioteki DLL

Nowy projekt bdzie si skada z jednego tylko (poza standardowym plikiem stdafx.cpp)
pliku OpenPassDLL.cpp nie bdzie mia jednak adnego pliku nagwkowego.
Pliki nagwkowe zawieraj zwykle deklaracje, a my bdziemy kilku potrzebowa.
Musimy wic plik nagwkowy doda do projektu wasnorcznie. W tym celu w oknie
Solution Explorer kliknij prawym przyciskiem myszy pozycj Header Files. Z menu
podrcznego wybierz Add, a nastpnie Add New Item. Zobaczysz okno podobne do tego
z rysunku 3.13. W prawej czci okna zaznacz HeaderFile (.h) i wpisz w polu Name nazw 4&' !!5+. Kliknij przycisk Open, a projekt zostanie uzupeniony o nowy plik.
Rysunek 3.13.
Okno dodawania
pliku projektu

Rozdzia 3. Programowanie w systemie Windows

123

Kliknij dwukrotnie nowo dodany plik. Otworzy si edytor tekstu. Wpisz nastpujcy kod:
''Makrodefinicja eksportu DLL w Win32, zastpuje __export z Win16
Q-E-))>B+5
 0 0-:)B-:))->B+5
''Prototyp
))>B+5,5B%K8),5*5-% ,# &5*:-

Makrodefinicja ,,>4 - pozwala funkcjom, ktrych deklaracje s ni opatrzone, na


eksportowanie tzn. umoliwia im wywoywanie z innych aplikacji.
Drugi z wierszy kodu pliku nagwkowego deklaruje eksportowan funkcj. Jak wida,
deklaracja przypomina implementacj pozbawion kodu funkcji mamy tu jedynie
nazw funkcji i typu i nazwy parametrw. Waciwa definicja funkcji powinna wyldowa w pliku OpenPassDLL.cpp.
Przejdmy do pliku OpenPassDLL.cpp. Jego zawarto prezentowana jest na listingu 3.6.
Skopiuj ten kod do swojego pliku i sprawd go.
Listing 3.6. Plik OpenPassDLL.cpp
''B-(*""A:BB-E-5&--5+JB5  5&-""*BB):*5A
''
Q:)-IA&N
Q:)-05*E>A&0
Q:)-0B-(*""A&0
%%$,J%K
%  
% ,# &5
!"#( M))*%# "&)-
 )+-*E+:*))
"(<)B--+6-


&54% ,# &)-
 


",
" #""!# $,J.(+:

:-''Kod zaczepu
 (##(*+*''Znacznik usuwania
"(##)(*+*''Adres struktury komunikatu


''Przelij komunikat do pozostaych zaczepw w systemie
 *)) ->5%K>,J%K:-(*+*)(*+*
''Sprawd komunikat
 :-44% #  

''Pobierz uchwyt okna, ktre wygenerowao komunikat
 45*.,=O)(*+*FN&

124

C++. Elementarz hakera


''Sprawdzenie typu komunikatu.
''Czy uytkownik nacisn prawy przycisk myszy?
 5*.,=O)(*+*FN-*.-44 !
  

,--*.- ,(#,,  %#
6*)*5--:5 



 

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
))>B+5,5B%K8),5*5-% ,# &5*:-

 

,J%K4,-5 %K> %=,,#=,J.(+:&5


&K %K>,J%K

Przyjrzyjmy si bliej kodowi biblioteki DLL. Na pocztku kodu wczane s pliki nagwkowe. Jednym z nich jest plik OpenPassDLL.cpp zawierajcy makrodefinicj eksportujc funkcj naszej biblioteki.
Dalej deklarowane s trzy zmienne globalne:
 %= @ uchwyt zaczepu komunikatw systemowych.
  uchwyt okna (tego z gwiazdkami) kliknitego prawym przyciskiem

myszy.
 + - uchwyt dziaajcego egzemplarza DLL.

Deklaracje mamy z gowy. W tej czci programu jako gwna wystpuje funkcja ,,'.
Jest to standardowa funkcja wykonywana podczas uruchomiania biblioteki DLL. Przeprowadza si w niej czynnoci inicjalizacyjne. W naszym przypadku nie mamy czego
inicjalizowa poza zachowaniem pierwszego parametru wywoania funkcji (uchwytu
egzemplarza biblioteki) w zmiennej + -.
Przejdmy do funkcji #%-4 @. Jej zadanie polega na zakadaniu i zwalnianiu zaczepu systemowego. Przyjmuje ona dwa parametry:
 Warto logiczn (typu /,) )#, jeli zaczep jest zakadany, i "!%,

kiedy ma by zwolniony.
 Uchwyt egzemplarza aplikacji wywoujcej t funkcj. Nie bdziemy na razie

wykorzystywa tego parametru.


Jeli pierwszym parametrem przekazywana jest warto )#, rejestrujemy zaczep, za
porednictwem ktrego bdziemy przechwytywa komunikaty systemu Windows. Suy do tego funkcja %&- @>. Wymaga ona przekazania czterech parametrw:

Rozdzia 3. Programowanie w systemie Windows

125

 Typu zaczepu (tutaj  2)%%"2).


 Wskanika funkcji, ktra ma otrzyma przechwycony komunikat.
 Uchwytu egzemplarza aplikacji przekazujemy zachowany wczeniej

uchwyt egzemplarza biblioteki DLL.


 Identyfikatora wtku. Warto zero obejmuje wszystkie wtki.

W roli drugiego parametru przekazujemy adres funkcji %=( 


. Jest ona deklarowana
w tej samej bibliotece jej kodem zajmiemy si pniej.
Warto zwracan przez funkcj %&- @> zachowujemy w zmiennej %= @.
Bdzie ona potrzebna do zwolnienia zaczepu.
Jeli do funkcji #%-4 @ przekazana zostanie warto "!%, zwalniamy zaczep. Polega to na wywoaniu funkcji +@ @> i przekazaniu do niej zmiennej %= @.
Warto %= @ uzyskalimy wczeniej przy zakadaniu zaczepu.
Przyjrzyjmy si teraz funkcji %=( 
, ktra bdzie wywoywana w momencie
przechwycenia komunikatu o zdarzeniu.
W pierwszym wierszu kodu funkcji przechwycony komunikat jest funkcj ',,&>- @>
przesyany do pozostaych zaczepw systemowych. Krok ten jest niezbdny, aby obsuga komunikatu bya kompletna komunikat interesuje nie tylko nas, ale i, by moe,
wykorzystywany jest w innych zaczepach.
Nastpnie sprawdzamy typ komunikatu. Interesuj nas jedynie zdarzenia nacinicia
przyciskw myszy. Porwnujemy wic kod zdarzenia (
&) z  ") . Obsug pozostaych komunikatw moemy sobie darowa.
Dalej okrelamy okno, dla ktrego przeznaczony by pierwotnie komunikat, i sprawdzamy
typ tego komunikatu. Uchwyt okna jest pozyskiwany instrukcj: -'(%2A,' '
B+. Na pierwszy rzut okna jest ona kompletnie nieczytelna. Sprbujmy j rozszyfrowa. Wyraenie to opiera si na zmiennej typu ,' ', ktr pozyskalimy za porednictwem ostatniego parametru wywoania funkcji %=( 
. Zapis -'(%2A,' '
oznacza, e pod adresem wskazywanym przez przekazany do funkcji parametr ,' '
znajduje si struktura typu -'(%2. Struktura ta posiada pole +, ktre przechowuje
uchwyt okna, dla ktrego wygenerowano pierwotnie komunikat.
Dalej sprawdzamy rodzaj zdarzenia. Jeli komunikat reprezentuje nacinicie prawego
przycisku myszy, powinnimy usun gwiazdki z okna. Warunek ten sprawdzamy
przez test wartoci pola &'(& struktury -'(%2A,' '.
Jeli warto ta jest rwna  #$)) , oznacza to, e nacinity zosta prawy
przycisk myszy, wic powinnimy przystpi do ujawnienia zasonitego gwiazdkami
tekstu. W tym celu naley przesa do okna komunikat. Korzystamy z porednictwa
funkcji %&&'(& z nastpujcymi parametrami:
  uchwytem okna, do ktrego kierujemy komunikat.
  %)"%%#  "# typem komunikatu. Warto ta sygnalizuje konieczno

zmiany znakw wykorzystywanych do ukrywania cigu hasa.

126

C++. Elementarz hakera


  nowy znak wykorzystywany do usunicia maski i przywrcenia

waciwego tekstu hasa.


  parametr zarezerwowany.

Na koniec wywoujemy funkcj .','-&#&


-, ktra wymusza odrysowanie okna
okrelonego pierwszym parametrem wywoania. Drugi parametr okrela obszar, ktry
powinien zosta odrysowany jeli bdzie mia warto zero, odrysowaniem objte
zostanie cae okno. Jeli ostatni parametr wywoania ma warto )#, odrysowane
zostanie rwnie to.
Kod rdowy tego przykadu oraz pliki biblioteki znajduj si na doczonej do
ksiki pycie CD-ROM w podkatalogu \Przykady\Rozdzia3\OpenPassDLL.

3.7.2. Deszyfrowanie hasa


Napiszmy program, ktry bdzie wczytywa utworzon przed chwil bibliotek DLL
i zakada zaczep. Utwrz nowy projekt typu Win32 Project, zaznaczajc jako typ aplikacji Windows application. Do kodu pliku rdowego w funkcji -' wprowad
zmiany zgodnie z listingiem 3.7.
Listing 3.7. Wczytywanie biblioteki DLL i zakadanie zaczepu

#( M5 *% ,# &5*:-
% ,# &(+-65*:-
"(,)B "-

 ,&

''()*:-:-&-+-A
,=.
%# "&#::-)*8)-
''5*)1-.)8*)5+.
"*,5+.&5*:-,#(("15)-#/"#, =
"*,5+.&5*:- ( (#,,,1  )*#/"#, =
J-.5-+ )*&5*:-
''(-+E+*BB):*55*)1*5
 355*:-&5*:- ,&

 
7#",

&#::-)*8)-4"*#::-)-+*5+&5*:-"( , ( (#,,,
''''''''''''''''''''''''''''''''''''
''Dodaj poniszy kod:
" =)-)5
% ,# &)-
''Synonim typu dla wskanika funkcji:

 ,5B%K(+:8)% ,# 

Rozdzia 3. Programowanie w systemie Windows

127

,5B%K(+:O,5B%K4
''Wczytaj plik DLL:
&)-4"*"8+*+J0B-(*""A))0
''Pobierz adres funkcji z biblioteki:
,5B%K4,5B%K(+:O=-5(+:#+-%
"&)-
0,5B%K0
''Wywoaj funkcj:
O,5B%K
&5*:-
''*-*.-)B
=-5-*.-.
""

 3+*)*5-#::-)-+*5+.A&&#::-)*8)-.

+*)*5--*.-.
B*5:&-*.-.


O,5B%K7#",&5*:-
7+--"8+*+J&)-
 

.A(*+*

Poniewa funkcja zadeklarowana jest w bibliotece DLL, a wywoywana jest w innym


programie, trzeba w tym programie okreli typ funkcji. Jeli tego nie zrobimy, kompilator nie bdzie w stanie zrealizowa poprawnie wywoania. Typ funkcji, o ktrej mowa,
opisany jest nastpujco:

 ,5B%K(+:8)% ,# 

Instrukcja ta deklaruje typ #%-4 @ 


jako funkcj, ktra nie zwraca adnych wartoci i przyjmuje dwa parametry (pierwszy typu /,, drugi typu %)"). W nastpnym wierszu deklarujemy funkcj tego typu i przypisujemy do niej chwilowo zero.
Teraz powinnimy wczyta do pamici bibliotek DLL. Suy do tego specjalna funkcja o nazwie !'!/ ' = przyjmuje ona za porednictwem parametrw nazw pliku
i ciek dostpu. My przekazujemy tylko nazw pliku biblioteki, co powoduje, e
przed uruchomieniem programu powinnimy skopiowa plik biblioteki do katalogu
programu, ewentualnie do jednego z katalogw bibliotek systemu Windows.
Po wczytaniu biblioteki okrelamy adres funkcji #%-4 @ w pamici, tak aby mona
byo j spod tego adresu wywoa. Wykorzystujemy do tego funkcj 2&- 
" &,
ktra wymaga przekazania wskanika uchwytu egzemplarza biblioteki i nazwy funkcji.
Wynik wywoania zapisujemy w zmiennej #%-4 @.
Jestemy ju gotowi do wywoania funkcji zakadajcej zaczep. Wywoanie wyglda
do niecodziennie:
O,5B%K
&5*:-

128

C++. Elementarz hakera

Zaraz po wywoaniu startuje gwna ptla komunikatw, w ktrej nie musimy nic zmienia. Pod koniec programu musimy jedynie zwolni zaczep i usun bibliotek DLL
z pamici. Realizuj to dwa wiersze:
O,5B%K7#",&5*:-
7+--"8+*+J&)-

Kod rdowy tego przykadu oraz jego pliki wykonywalne znajduj si na doczonej
do ksiki pycie CD-ROM w podkatalogu \Przykady\Rozdzia3\OpenPassTest.

Aby przetestowa dziaanie caoci, powiniene umieci plik biblioteki DLL OpenPasDLL.dll w katalogu pliku wykonywalnego projektu OpenPasTest. Po uruchomieniu
programu kliknij prawym przyciskiem myszy dowolne okno tekstowe z hasem. Gwiazdki
(albo inne znaki maskujce haso) zamieni si w zwyke litery.
Przykad efektw dziaania programu ilustruje rysunek 3.14. Wida na nim okno dialogowe logowania wywietlane przez klienta poczty elektronicznej. Zauwa, e pole hasa,
zazwyczaj maskujce tre gwiazdkami, zawiera jawny tekst hasa.
Rysunek 3.14.
Program
OpenPassTest
w dziaaniu

3.7.3. Obrmy to w art


Ten przykad moe by atwo przerobiony na art programowy. Aby zmieni zachowanie
programu, wystarczy zmieni kilka parametrw biblioteki DLL. Wemy si wic za
obsug rwnie kliknicia lewym przyciskiem myszy tym razem zamiast ujawnia,
bdziemy maskowa znaki w polu tekstowym. Jeli uytkownik zechce przeczy si
mysz na pole zawierajce tekst, zobaczy tylko cig liter d. Zmodyfikowany kod
przykadu widnieje na listingu 3.8.
Listing 3.8. Zaczep komunikatw zastpujcy wszelkie litery liter d
",
" #""!# $,J.(+:

:-''Kod zaczepu
 (##(*+*''Znacznik usuwania
"(##)(*+*''Adres struktury komunikatu


''Przelij komunikat do pozostaych zaczepw systemu
 *)) ->5%K>,J%K:-(*+*)(*+*

Rozdzia 3. Programowanie w systemie Windows

129

''Sprawd komunikat
 :-44% #  

''Pobierz uchwyt okna, ktre wygenerowao komunikat
 45*.,=O)(*+*FN&
''Sprawdzenie typu komunikatu.
''Czy uytkownik nacisn lewy przycisk myszy?
 5*.,=O)(*+*FN-*.-44 "!
  

,--*.- ,(#,,  %#;
6*)*5--:5 



 


Tym razem sprawdzamy, czy komunikat dotyczy zdarzenia nacinicia lewego przycisku
myszy. Jeli tak, to za porednictwem funkcji %&&'(& wysyamy do okna, na rzecz
ktrego pierwotnie wygenerowano komunikat, komunikat zmiany znaku maskowania
z trzecim parametrem o wartoci 7 (100 to kod litery d). W efekcie, kiedy w czasie
dziaania programu uytkownik kliknie jakiekolwiek pole tekstowe, jego zawarto zastpiona zostanie cigiem liter d. Przykad dziaania programu mamy na rysunku 3.15,
na ktrym wida okno Waciwoci skrtu do Kalkulatora pola tekstowe zawieraj
zamaskowane cigi znakw.
Rysunek 3.15.
Zmiana
waciwoci skrtu

Kod rdowy tego przykadu znajduje si na doczonej do ksiki pycie CD-ROM


w podkatalogu \Przykady\Rozdzia3\SetPassDLL.

130

C++. Elementarz hakera

3.8. Monitorowanie plikw


wykonywalnych
Czasem chcielibymy wiedzie, jakie programy uruchamia uytkownik i jak dugo ich
uywa. Takie informacje przydaj si nie tylko hakerom, ale rwnie opiekunom systemw informatycznych i kierownictwu dziaw.
Haker moe, na przykad, oczekiwa na uruchomienie konkretnego programu, aby wykona na nim jakie czynnoci. Administrator sieci moe z kolei chcie wiedzie, co
uytkownik robi, kiedy system uleg awarii. Przeoeni chtnie za dowiedzieliby si,
czy ich pracownicy zajmuj si w pracy tym, czym powinni.
Prbujc odpowiedzie na te pytania musiaem swego czasu dowiedzie si, jak monitorowa uruchamianie i czas dziaania programw w systemie operacyjnym. Okazuje
si, e jest to cakiem proste, przy czym program monitorujcy nie rni si wiele od
poprzednio omawianego programu ujawniajcego zamaskowane hasa. Powinnimy
bowiem rwnie w tym przypadku zaoy zaczep, za porednictwem ktrego monitorowalibymy wybrane komunikaty systemowe. Poprzednio zaczep zakadalimy wywoaniem %&- @>, a przechwytywaniu podlegay komunikaty typu  2)%%"2.
Jeli zmienimy ten parametr na  $), przechwytywane bd nastpujce komunikaty:


$) ") 1") sygnalizujcy aktywacj aplikacji.

$) #") sygnalizujcy utworzenie nowego okna.

$) %)#: sygnalizujcy usunicie jednego z istniejcych okien.

$)  "* sygnalizujcy minimalizacj albo maksymalizacj jednego


z istniejcych okien.

$) 1%  sygnalizujcy przesunicie albo zmian rozmiaru jednego


z istniejcych okien.

Kod biblioteki DLL monitorujcej dziaajce programy prezentowany jest na listingu 3.9.
Na razie opowiemy sobie jedynie o rozpoznawaniu zdarze; ich obsug zajmiemy si
pniej.
Listing 3.9. Kod biblioteki monitorujcej pliki wykonywalne
''7)-5+A:BB-E-5&--5+JB5  5&-""*BB):*5A
''
Q:)-IA&N
Q:)-05*E>A&0
Q:)-07)-5+A&0
%%$,J%K
% ,# &5
!"#( M))*%# "&)-
 )+-*E+:*))
"(<)B--+6-


Rozdzia 3. Programowanie w systemie Windows

131


&54% ,# &)-
 


",
" #""!# $,J.(+:

:-''Kod zaczepu
 (##(*+*''Znacznik usuwania
"(##)(*+*''Adres struktury komunikatu


''Przelij komunikat do pozostaych zaczepw systemu
 *)) ->5%K>,J%K:-(*+*)(*+*
 :-44% !# <#

 5->5G@RRH
%  45*.,=O)(*+*FN&
=-5 ->5 5->5@RR
''Tu moesz zapisa tytu aktywnego pliku

 :-44% ! # 

 5->5G@RRH
%  45*.,=O)(*+*FN&
=-5 ->5 5->5@RR
''Tu moesz zapisa nowy tytu pliku

 

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
))>B+5,5B%K8),5*5-% ,# &5*:-

 

,J%K4,-5 %K> % !,J.(+:&5


&K %K>,J%K

Nasz zaczep bdzie wywoywany zawsze przy tworzeniu nowego okna albo aktywowaniu
jednego z istniejcych. W tej chwili funkcja zaczepu zawiera kod okrelajcy nazw
okna, ktre wygenerowao komunikat. Moesz uzupeni ten kod wasnymi czynnociami
(na przykad zapisaniem daty i czasu utworzenia czy aktywowania okna). Zostawi t
kwesti otwart, poniewa kod tej czci naley dopasowa do konkretnych potrzeb.
Za pomoc tej prostej metody moemy uzyskiwa dostp do komunikatw o zdarzeniach dotyczcych okien innych programw i monitorowa dziaalno uytkownika w systemie.

132

C++. Elementarz hakera

Kod rdowy tego przykadu znajduje si w katalogu \Przykady\Rozdzia3\FileMonitor doczonej do ksiki pyty CD-ROM, a kod rdowy programu testujcego
dziaanie biblioteki znajduje si w katalogu \Przykady\Rozdzia3\FileMonitorTest. Zanim uruchomisz plik wykonywalny tego ostatniego, upewnij si, e w jego katalogu
znajduje si plik biblioteki DLL.

3.9. Zarzdzanie ikonami pulpitu


Ikony pulpitu s w rzeczywistoci elementami obiektu sterujcego typu List View (widok
listy). Dziki temu bardzo atwo nimi zarzdza. Wystarczy znale okno klasy  
('. Z tego okna mona pobra uchwyt widoku listy przechowujcego ikony pulpitu.
Wskazwki te bardzo atwo zaimplementowa w kodzie rdowym:
% -K5B%*)-47 0(+.*0
-K5B%*)-4=-5 -K5B%*)-=  %"
-K5B%*)-4=-5 -K5B%*)-=  %"

Powyszy kod najpierw wyszukuje w systemie okno, ktre zarejestrowano z klas o nazwie  ('. Cho okna tego nie wida na ekranie, istnieje w systemie od czasw Windows 3.0, a program okna nosi nazw Menedera programw. W nastpnym wierszu
mamy wywoanie funkcji pozyskujcej uchwyt okna potomnego, a w nastpnym
okna potomnego okna uzyskanego poprzednio. W ten sposb otrzymujemy uchwyt
obiektu systemowego klasy %=!-1&C9. Przechowuje on wszystkie ikony pulpitu.
Ikony te moemy teraz kontrolowa, przesyajc do owego obiektu komunikaty (funkcj
%&&'(&). Moemy, na przykad, wyrwna wszystkie ikony do lewej krawdzi ekranu:
,--*.--K5B%*)-"<## ="<##"= "7

Przyjrzyjmy si parametrom tego wywoania:


 &@-4 ',& to uchwyt obiektu, do ktrego wysyamy komunikat.
 Drugi parametr wywoania to typ komunikatu. !1 "##"2 sygnalizuje

konieczno rozmieszczenia ikon.


 Trzeci parametr wywoania to pierwszy parametr komunikatu !1" "! 2!)

okrela wyrwnanie ikon do lewej.


 Czwarty parametr wywoania to drugi parametr komunikatu. Podajemy 0.

Jeli zmienisz !1" "! 2!) na !1" "! 2), ikony zostan rozmieszczone wzdu
grnej krawdzi pulpitu.
Poniszy wiersz usuwa wszystkie ikony z pulpitu:
,--*.--K5B%*)-"<"#"",

Rozdzia 3. Programowanie w systemie Windows

133

Wywoanie jest podobne do poprzedniego, tyle e tu mamy komunikat !1 !)"!


! )% wymuszajcy usunicie wszystkich ikon z pulpitu. Uruchomienie takiego programu spowoduje wyczyszczenie pulpitu. Mona co prawda odzyska usunite ikony
wystarczy przeadowa system operacyjny. Osigniesz jednak dobry efekt zaskoczenia, jeli uruchomisz w systemie niewidzialny program, ktry od czasu do czasu
bdzie czyci pulpit.
Teraz najciekawsze przesuwanie ikon po pulpicie. Suy do tego nastpujcy kod:
% -K5B%*)-47 0(+.*0
-K5B%*)-4=-5 -K5B%*)-=  %"
-K5B%*)-4=-5 -K5B%*)-=  %"
 
4I@CC
,--*.--K5B%*)-"<,(, #$"(##;

Podobnie jak poprzednio, na pocztku odnajdujemy uchwyt okna-obiektu zawierajcego


ikony. Nastpnie inicjujemy ptl wykonywan dla wartoci  od 0 do 199, wywoujc
funkcj %&&'(& z nastpujcymi parametrami:
 Uchwytem okna, do ktrego kierowany jest komunikat (tutaj jest to uchwyt

obiektu zarzdzajcego ikonami pulpitu).


 Komunikatem. !1 %) )% )  wymusza zmian pozycji ikony.
 Pierwszym parametrem komunikatu numerem ikony do przesunicia.
 Drugim parametrem komunikatu now pozycj ikony. Parametr ten skada si

z dwch zmiennych: wsprzdnej poziomej i pionowej ikony. Aby zmieci


te zmienne w jednym parametrze, s one kombinowane wywoaniem "D!"#".
Powyszy kod pozwala na dowolne niemal zabawy z pulpitem. Jedyn jego wad jest
dziwaczne przesuwanie ikon na pulpicie Windows XP. W pozostaych systemach operacyjnych z rodziny Windows przesuwanie dziaa gadko i daje odpowiedni efekt.
Co jeszcze mona zrobi z ikonami na pulpicie? C, wszystko to, co da si zrobi z elementem sterujcym widoku listy (list view). Zobaczmy.

3.9.1. Animowanie tekstu


Bardzo ciekawym efektem jest animowanie podpisw ikon. Wystarczy wiedzie, jak
zmieni kolor tekstu w podpisach ikon. Majc t wiedz, mona zaprogramowa ptl
animacji, ktra zmieniaaby kolor podpisw zgodnie z pewnym algorytmem. Jedyn
trudnoci jest konieczno odrysowywania pulpitu zmiany kolorw bd widocznie jedynie po odwieeniu obrazu pulpitu.
Aby zmieni kolor podpisw pod ikonami, naley przesa do zarzdcy ikon pulpitu
komunikat !1 %) ))*). Pierwszy parametr komunikatu powinien mie warto
zero, a drugi by ustawiony na podany kolor podpisw. Aby, na przykad, zmieni
kolor na czarny, wystarczy uruchomi taki kod:
% -K5B%*)-47 0(+.*0
-K5B%*)-4=-5 -K5B%*)-=  %"

134

C++. Elementarz hakera


-K5B%*)-4=-5 -K5B%*)-=  %"
,--*.--K5B%*)-"<,/"(## "7

Wyzwaniem pozostaje tylko sposb odwieenia pulpitu, tak aby mona byo zobaczy
zmiany.

3.9.2. Odwieanie pulpitu


Kod przesuwajcy ikony pulpitu, prezentowany w poprzednim podrozdziale, jest mao
efektowny, poniewa na pulpicie nie wida waciwie animacji. Uytkownik zobaczy jedynie pozycj pocztkow i kocow, wic najciekawsze mu umknie. Mona t sytuacj
poprawi, odwieajc ikon po zmianie jej pozycji. Suy do tego komunikat !1  "):
% -K5B%*)-47 0(+.*0
-K5B%*)-4=-5 -K5B%*)-=  %"
-K5B%*)-4=-5 -K5B%*)-=  %"
 
4I@CC

,--*.--K5B%*)-"<,(, #$"(##;
,--*.--K5B%*)-"<
(#
,)--B;

Wewntrz ptli zmieniamy pozycj pierwszej ikony pulpitu (ikony o numerze 0) i wymuszamy jej odrysowanie komunikatem !1  "). Trzeci parametr wywoania
%&&'(& to numer ikony do odwieenia. Jeli zachodziaby potrzeba odwieenia
obrazu drugiej ikony pulpitu, trzeba by zainicjowa wywoanie:
,--*.--K5B%*)-"<
(#;

Kod rdowy tego przykadu umieszczony jest w podkatalogu \Przykady\Rozdzia3\


ArrangeIcons doczonej do ksiki pyty CD-ROM.

3.10. arty z wykorzystaniem schowka


Dowcipkowa mona z uyciem dowolnego niemal komponentu systemu, nie ujdzie wic
naszej uwadze rwnie poyteczny schowek systemowy. Ten pozornie niewinny skadnik Windows moe by w rku hakera wydajnym narzdziem. Wystarczy puci wodze
wyobrani.
Schowek jest zwykle wykorzystywany do przenoszenia danych pomidzy aplikacjami
najczciej chodzi o kopiowanie blokw tekstu. Czego uytkownik spodziewa si po
schowku? e wklejone z niego dane bd tymi samymi danymi, ktre wczeniej do
niego skopiowa. Zaskoczmy go.
W systemie Windows dostpna jest funkcja oraz zestaw komunikatw o zdarzeniach, ktre pozwalaj na monitorowanie stanu schowka. Komunikaty te i funkcje s niezbdne

Rozdzia 3. Programowanie w systemie Windows

135

w dziaaniu aplikacji korzystajcych ze schowka, ktre powinny udostpnia funkcj


wklejania ze schowka tylko wtedy, kiedy zawiera on dane o odpowiednim dla aplikacji formacie. Wykorzystajmy to do wasnych celw.
Sprbujemy napisa program, ktry bdzie monitorowa stan schowka i psu to, co
zostanie do schowka skopiowane. Utwrz now aplikacj MFC (moe ona wykorzystywa dialogi) i nazwij j ClipboardChange.
Dodaj do projektu dwa zdarzenia, ktre bdziemy wykorzystywa w programie do monitorowania schowka:    "2$ "  i   #"! $"# . W tym celu otwrz
plik kodu rdowego ClipboardChangeDlg.cpp, znajd w nim map komunikatw
(%%"2 ") i uzupenij j nastpujco:
!= ,,#=#( )B8*+ &*.-). *).
   %# = ! %# 
  # "(!#
  ,M, # 
  (# 
  P
M#=  
'' #7/,=#(
 ,,#=#(

Teraz otwrz plik nagwkowy ClipboardChangeDlg.h i znajd w nim deklaracje funkcji


odpowiedzialnych za obsug zdarze deklarowanych w mapie komunikatw. Powinny
znajdowa si w sekcji  
 klasy okna dialogowego. Dodaj do nich dwie deklaracje:
*E>. &*.- 8 &*% & -6-% & #E5-+
*E>.+* )B8*+

Bdziemy te potrzebowa zmiennej typu  , w ktrej bdziemy przechowywa


uchwyt okna przegldarki schowka. Nazwij zmienn ,4/' 1&& .
Wr do pliku kodu rdowego ClipboardChangeDlg.cpp i dodaj do niego kod obu
funkcji. Nie bd one co prawda wywoane, zanim faktycznie nie uczynimy naszego
programu przegldark zawartoci schowka. Mona to zrobi, uzupeniajc funkcj
 - ',( nastpujcym wierszem:
)B8*+<--+4,-5 )B8*+<--+

Przyjrzyjmy si teraz funkcjom wywoywanym w reakcji na zdarzenia zwizane ze


schowkiem. Ich kod prezentowany jest na listingu 3.10.
Listing 3.10. Przegldarka schowka
 )B8*+ &*.-). &*.- 8 &*% & -6-% & #E5-+

  )B8*+<--+44& -6-
 )B8*+<--+4& #E5-+
 
""34 )B8*+<--+

,--*.- )B8*+<--+  %# = ! %# 
 (##& -6-"(##& #E5-+


136

C++. Elementarz hakera


 )B8*+ &*.-). &*.- 8 &*& -6-& #E5-+
 )B8*+ &*.-).+* )B8*+

 3B- )B8*+

-*.-!>0,:&-K9-5:1*-52BJ0
 


 3B5J )B8*+

 )- )B8*+
-*.-!>0 -S*B+TSU:&K*0
 


 ,5+.->540 V-5*KW0
%="!#"&=)8*)4=)8*)#)):=<#!"->5A=-5"-.5&C;
 3&=)8*)

 )- )B8*+
-*.-!> ,5+.0!XYB+1J1*XB*2:0
 


5+:BJ O=)8*)":K&=)8*)->5
=)8*)
):K&=)8*)
 3,-5 )B8*+*5* 7/&=)8*)
-*.-!>0!XYB:&K*0

 )- )B8*+

Najciekawsze rzeczy dziej si w funkcji  ',4/' , ktra jest wywoywana


za kadym razem, kiedy w schowku lduj nowe dane. W takim przypadku czycimy
zawarto schowka i wstawiamy do niego wasne dane (napis Co nie tak?), przez co
uytkownik nie moe korzysta z operacji kopiowania i wklejania.
Zanim bdziemy mogli skorzysta ze schowka, musimy go otworzy wywoaniem funkcji
4&,4/' . Jeli schowek zostanie pomylnie otwarty, funkcja zwrci warto )#.
Nastpnie oprniamy schowek funkcj 4-=,4/' . Jeli operacja si powiedzie, funkcja zwrci )#. W przeciwnym przypadku schowek zostanie zamknity,
a nasz program wywietli komunikat o bdzie. Do zamykania schowka suy funkcja
,&,4/' .
Moemy teraz wstawi do schowka wasne dane. W tym celu musimy przydzieli dla
nich odpowiedni blok pamici globalnej i umieci w niej np. wasny napis. W naszym
przykadzie jest to napis Co nie tak?. Nastpnie wstawiamy tak spreparowane dane
do schowka, wywoujc w tym celu funkcj %&-,4/'  '-'. Funkcja przyjmuje
dwa parametry:

Rozdzia 3. Programowanie w systemie Windows

137

 Sta definiujc typ danych. Podajemy  )*), czyli dane tekstowe.


 Wskanik pamici, w ktrej znajduj si dane przeznaczone do umieszczenia

w schowku.
Po zakoczeniu tych manipulacji naley schowek zamkn, wywoujc ,&,4/' .
Jak wida, schowek, cho tak przydatny, moe kiedy zacz by kopotliwy. Uruchom
program i sprbuj skorzysta ze schowka czego by do niego nie wkleja, za kadym
razem wyjdzie z niego napis Co nie tak?.
Kod rdowy tego przykadu umieszczony jest w podkatalogu Przykady\Rozdzia3\
ClipboardChange doczonej do ksiki pyty CD-ROM.

You might also like