Professional Documents
Culture Documents
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
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 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.
98
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!.
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:
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:
99
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
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
100
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
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:
101
&44
102
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).
104
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=
%"
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
wzgldem pozostaych.
Cztery parametry okrelajce wsprzdne okna (zmniejszamy tu wsprzdn
107
108
wygld okna.
#&
- typu #) suc do przechowywania rozmiaru i pozycji okna.
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
110
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
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.
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
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+.
113
Kod rdowy tego przykadu oraz jego pliki wykonywalne znajduj si na doczonej do ksiki pycie CD-ROM w podkatalogu \Przykady\Rozdzia3\None.
114
Rysunek 3.9.
Maska ksztatu okna
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
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*:-
""
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
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(*+*
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
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.
119
wskanika myszy.
Moemy wykorzysta kod poprzedniego przykadu, wystarczy znale w nim funkcj
i doda do niej oznaczony odpowiednimi komentarzami kod z listingu 3.5.
120
121
122
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
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*:-
124
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
125
126
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(*+*
128
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
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
130
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-
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->55->5@RR
''Tu moesz zapisa tytu aktywnego pliku
:-44%
!
#
5->5G@RRH
% 45*.,=O)(*+*FN&
=-5->55->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
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.
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
Jeli zmienisz !1"
"!2!) na !1"
"!2), ikony zostan rozmieszczone wzdu
grnej krawdzi pulpitu.
Poniszy wiersz usuwa wszystkie ikony z pulpitu:
,--*.--K5B%*)-"<"#"",
133
134
Wyzwaniem pozostaje tylko sposb odwieenia pulpitu, tak aby mona byo zobaczy
zmiany.
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%*)-"<
(#;
135
136
137
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.