You are on page 1of 65

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

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

Hack Wars. Tom 1.


Na tropie hackerw

Autor: John Chirillo


Tumaczenie: Pawe Koronkiewicz, Leonard Milcin
ISBN: 83-7197-599-6
Tytu oryginau: Hack Attacks Revealed: A Complete
Reference with Custom Security Hacking Toolkit
Format: B5, stron: 736
Zawiera CD-ROM
Ekspert w dziedzinie zabezpiecze, John Chirillo, zachca Czytelnika do poznania
mrocznego i tajemniczego wiata hakerw. Czerpic z bogatego dowiadczenia we
wsppracy z firmami Fortune 1000, Chirillo przedstawia rne sposoby wykorzystania
przez hakerw luk w zabezpieczeniach sieci oraz metody rozpoznawania tego rodzaju
zagroe. Uzupenieniem jest szczegowy opis pakietu TigerBox, umoliwiajcego
hakerom przeprowadzanie skutecznych wama, a administratorowi sieci zyskanie
pewnoci, e jest waciwie chroniona.
W tej prowokacyjnej ksice znajdziemy:
Opis protokow sieciowych i technologii komunikacyjnych z punktu widzenia
hakera
Peny opis stosowanych metod wama, wyjaniajcy, jak dziaaj hakerzy,
crackerzy, phreaks i cyberpunki
Narzdzia do gromadzenia informacji i skanowania sieci, umoliwiajce wykrycie
i przeanalizowanie przypadkw naruszenia bezpieczestwa systemu
Dokadne instrukcje, jak posugiwa si pakietem typu TigerBox
i wykorzystywa go do wykrywania atakw

"
"
"
"

O Autorze .............................................................................................................9
Wstp ................................................................................................................11
Rozdzia 1. Protokoy komunikacyjne .................................................................15
Krtka historia Internetu ...................................................................................................15
IP Internet Protocol ................................................................................................16
Datagramy IP transportowanie, rozmiar i fragmentacja ........................................18
Adresy IP, klasy i maski podsieci ...............................................................................21
VLSM krtka instrukcja tworzenia podsieci i odczytywania adresu IP ................22
ARP/RARP rozpoznawanie adresu sprztowego.........................................................31
ARP transportowanie, budowa nagwka pakietu .................................................31
RARP transportowanie, dokonywanie transakcji ..................................................33
Usuga RARP..............................................................................................................33
TCP Transmission Control Protocol ............................................................................33
Sekwencje oraz okna...................................................................................................34
Budowa nagwka pakietu TCP..................................................................................35
Porty, kocwki, nawizywanie poczenia ...............................................................37
UDP User Datagram Protocol ......................................................................................37
Budowa i transportowanie datagramw UDP.............................................................38
Multiplexing, demultiplexing oraz porty UDP ...........................................................39
ICMP Internet Control Message Protocol....................................................................39
Budowa i transportowanie pakietw ICMP................................................................39
Komunikaty ICMP, wyszukiwanie maski podsieci ....................................................40
Przykady datagramw ICMP.....................................................................................42

Rozdzia 2. NetWare oraz NetBIOS .....................................................................43


NetWare wprowadzenie ...............................................................................................43
IPX Internetwork Packet Exchange .......................................................................44
SPX Sequenced Packet Exchange .........................................................................48
Budowa i przykady nagwkw SPX ........................................................................49
Zarzdzanie poczeniami, przerywanie .....................................................................49
Algorytm Watchdog....................................................................................................50
Korekcja bdw, ochrona przed zatorami .................................................................51
NetBIOS wprowadzenie...............................................................................................51
Konwencje nazywania, przykadowe nagwki..........................................................51
Usugi NetBIOS ..........................................................................................................52

Hack Wars. Na tropie hakerw


NetBEUI wprowadzenie ..............................................................................................53
Zwizki z NetBIOS.....................................................................................................54
Okna i liczniki.............................................................................................................54

Rozdzia 3. Porty standardowe oraz zwizane z nimi usugi..................................55


Przegld portw.................................................................................................................55
Porty TCP oraz UDP...................................................................................................56
Luki w bezpieczestwie zwizane z portami standardowymi ....................................57
Niezidentyfikowane usugi................................................................................................69

Rozdzia 4. Techniki rozpoznania i skanowania ...................................................99


Rozpoznanie ......................................................................................................................99
Katalog Whois ..........................................................................................................100
PING .........................................................................................................................102
Serwisy wyszukiwawcze ..........................................................................................105
Social Engineering ....................................................................................................106
Skanowanie portw .........................................................................................................107
Techniki skanowania portw ....................................................................................107
Popularne skanery portw.........................................................................................108
Przykadowy skan ...........................................................................................................120

Rozdzia 5. Niezbdnik hakera..........................................................................127


Pojcia zwizane z sieci ................................................................................................127
Model warstwowy Open Systems Interconnection Model ..................................127
Rodzaje okablowania przepustowo oraz maksymalna dugo........................129
Konwersje pomidzy postaciami dwjkowymi, dziesitkowymi
i szesnastkowymi liczb .......................................................................................129
Funkcje wydajnociowe protokow ........................................................................140
Technologie sieciowe......................................................................................................141
Adresowanie MAC i kody producentw ..................................................................141
Ethernet .....................................................................................................................141
Token Ring................................................................................................................148
Sieci Token Ring i mostkowanie trasy nadawcy ......................................................149
Sieci Token Ring i translacyjne mostkowanie trasy nadawcy..................................153
Sieci FDDI ................................................................................................................155
Protokoy wybierania tras................................................................................................157
Protokoy wektorowo-odlegociowe i protokoy stanw przyczy........................157
Protok RIP..............................................................................................................159
Protok IGRP...........................................................................................................160
Protok RTMP sieci Appletalk................................................................................161
Protok OSPF ..........................................................................................................161
Wane polecenia .............................................................................................................162
append .......................................................................................................................162
assign.........................................................................................................................164
attrib ..........................................................................................................................164
backup .......................................................................................................................165
break..........................................................................................................................166
chcp ...........................................................................................................................166
chdir (cd)...................................................................................................................167
chkdsk .......................................................................................................................168
cls ..............................................................................................................................168
command...................................................................................................................168
comp..........................................................................................................................169
copy...........................................................................................................................170
ctty.............................................................................................................................171

Spis treci

5
date............................................................................................................................171
del (erase)..................................................................................................................172
dir ..............................................................................................................................172
diskcomp ...................................................................................................................173
diskcopy ....................................................................................................................174
exe2bin......................................................................................................................174
exit.............................................................................................................................175
fastopen .....................................................................................................................175
fc ...............................................................................................................................175
fdisk...........................................................................................................................177
find ............................................................................................................................177
format........................................................................................................................178
graftabl ......................................................................................................................179
Graphics ....................................................................................................................179
join ............................................................................................................................180
keyb...........................................................................................................................181
label...........................................................................................................................182
mkdir (md) ................................................................................................................182
mode..........................................................................................................................183
more ..........................................................................................................................186
nlsfunc.......................................................................................................................186
path............................................................................................................................187
print ...........................................................................................................................187
prompt .......................................................................................................................188
recover.......................................................................................................................189
rename (ren) ..............................................................................................................190
replace .......................................................................................................................190
restore........................................................................................................................191
rmdir (rd)...................................................................................................................192
select .........................................................................................................................192
set ..............................................................................................................................193
share ..........................................................................................................................194
sort.............................................................................................................................194
subst ..........................................................................................................................195
sys .............................................................................................................................196
time ...........................................................................................................................196
tree.............................................................................................................................197
type............................................................................................................................197
ver .............................................................................................................................197
verify .........................................................................................................................198
vol .............................................................................................................................198
xcopy.........................................................................................................................198

Rozdzia 6. Podstawy programowania dla hakerw ...........................................201


Jzyk C ............................................................................................................................201
Wersje jzyka C ........................................................................................................202
Klasyfikowanie jzyka C ..........................................................................................203
Struktura jzyka C...........................................................................................................203
Komentarze ...............................................................................................................205
Biblioteki...................................................................................................................205
Tworzenie programw ....................................................................................................205
Kompilacja................................................................................................................205
Typy danych..............................................................................................................206
Operatory ..................................................................................................................210

Hack Wars. Na tropie hakerw


Funkcje......................................................................................................................212
Polecenia preprocesora C..........................................................................................216
Instrukcje sterujce ...................................................................................................219
Wejcie-wyjcie ........................................................................................................223
Wskaniki .................................................................................................................226
Struktury ...................................................................................................................229
Operacje na plikach...................................................................................................234
Cigi..........................................................................................................................244
Obsuga tekstu...........................................................................................................250
Data i godzina ...........................................................................................................253
Pliki nagwkowe......................................................................................................259
Debugowanie programu............................................................................................259
Bdy wartoci zmiennoprzecinkowych ...................................................................260
Obsuga bdw ........................................................................................................260
Konwersja typw zmiennych....................................................................................263
Prototypy...................................................................................................................265
Wskaniki do funkcji ................................................................................................266
Sizeof ........................................................................................................................267
Przerwania.................................................................................................................267
Funkcja signal() ........................................................................................................270
Dynamiczne alokowanie pamici .............................................................................271
Funkcja atexit() .........................................................................................................273
Wydajno.................................................................................................................274
Przeszukiwanie katalogw........................................................................................275
Dostp do pamici rozbudowanej.............................................................................278
Dostp do pamici rozszerzonej ...............................................................................282
Tworzenie programw TSR......................................................................................290

Rozdzia 7. Metody przeprowadzania atakw ....................................................319


Streszczenie przypadku ...................................................................................................319
Tylne wejcia (backdoors)...........................................................................................320
Zakadanie tylnego wejcia ...................................................................................322
Typowe techniki tylnego wejcia ................................................................................323
Filtry pakietw ..........................................................................................................323
Filtry stanowe............................................................................................................328
Bramy proxy i poziomu aplikacji .............................................................................333
Przecianie (flooding) ...................................................................................................333
Zacieranie ladw (log bashing) .....................................................................................342
Zacieranie ladw aktywnoci online .......................................................................343
Unikanie rejestrowania wcini klawiszy ...............................................................344
Bomby pocztowe, spam i podrabianie korespondencji...................................................355
amanie hase (password cracking) ................................................................................357
Deszyfrowanie i krakowanie.....................................................................................357
Zdalne przejcie kontroli.................................................................................................362
Krok 1. Rozpoznanie ................................................................................................363
Krok 2. Przyjazna wiadomo email ........................................................................363
Krok 3. Kolejna ofiara ..............................................................................................364
Monitorowanie komunikacji (sniffing) ...........................................................................366
Podrabianie IP i DNS (spoofing) ....................................................................................374
Studium przypadku ...................................................................................................375
Konie trojaskie ..............................................................................................................382
Infekcje wirusowe ...........................................................................................................388
Wardialing.......................................................................................................................391
Zamanie strony WWW (Web page hack)...................................................................392

Spis treci

7
Krok 1. Rozpoznanie ................................................................................................394
Krok 2. Uszczegowienie danych ...........................................................................394
Krok 3. Rozpoczcie waciwego ataku ...................................................................397
Krok 4. Poszerzenie wyomu ....................................................................................397
Krok 5. Hakowanie strony.....................................................................................397

Rozdzia 8. Bramy, routery oraz demony usug internetowych ............................401


Bramy i routery ...............................................................................................................401
3Com.........................................................................................................................402
Ascend/Lucent ..........................................................................................................409
Cabletron/Enterasys ..................................................................................................416
Cisco .........................................................................................................................423
Intel ...........................................................................................................................431
Nortel/Bay.................................................................................................................438
Demony serwerw internetowych...................................................................................442
Apache HTTP ...........................................................................................................443
Lotus Domino ...........................................................................................................445
Microsoft Internet Information Server......................................................................446
Netscape Enterprise Server .......................................................................................448
Novell Web Server....................................................................................................451
OReilly Web Site Professional ................................................................................454

Rozdzia 9. Systemy operacyjne .......................................................................459


UNIX.........................................................................................................................460
AIX ...........................................................................................................................462
BSD...........................................................................................................................470
HP-UX ......................................................................................................................484
IRIX ..........................................................................................................................494
Linux .........................................................................................................................497
Macintosh..................................................................................................................522
Microsoft Windows ..................................................................................................527
Novell NetWare ........................................................................................................543
OS/2 ..........................................................................................................................552
SCO...........................................................................................................................566
Solaris .......................................................................................................................568

Rozdzia 10. Serwery proxy i zapory firewall........................................................573


Bramy midzysieciowe ...................................................................................................573
BorderWare...............................................................................................................573
FireWall-1 .................................................................................................................577
Gauntlet.....................................................................................................................581
NetScreen..................................................................................................................585
PIX ............................................................................................................................589
Raptor........................................................................................................................596
WinGate ....................................................................................................................599

Rozdzia 11. TigerSuite kompletny pakiet narzdzi do badania i ochrony sieci ...605
Terminologia ...................................................................................................................605
Wprowadzenie.................................................................................................................607
Instalacja ...................................................................................................................610
Moduy ............................................................................................................................613
Moduy grupy System Status ....................................................................................614
TigerBox Tookit..............................................................................................................619
TigerBox Tools .........................................................................................................619
TigerBox Scanners....................................................................................................624

Hack Wars. Na tropie hakerw


TigerBox Penetrators ................................................................................................626
TigerBox Simulators.................................................................................................627
Przykadowy scenariusz wamania..................................................................................628
Krok 1. Badanie celu.................................................................................................629
Krok 2. Rozpoznanie ................................................................................................631
Krok 3. Socjotechnika...............................................................................................633
Krok 4. Atak..............................................................................................................635
Podsumowanie ................................................................................................................635

Dodatek A Klasy adresw IP oraz podzia na podsieci.......................................637


Dodatek B Porty standardowe .........................................................................641
Dodatek C Pena lista portw specjalnych .......................................................645
Dodatek D Porty usug niepodanych .............................................................685
Dodatek E

Zawarto pyty CD .......................................................................691

Skorowidz.........................................................................................................701

Rozdzia 6.

Jzyk C
Dla kadego hakera, modego czy starego, mniej lub bardziej dowiadczonego, znajomo jzyka C jest jednym z fundamentw wiedzy. Niemal wszystkie narzdzia
i programy, stosowane w trakcie analiz sieci i wama, powstaj wanie w tym jzyku. Rwnie w niniejszej ksice wikszo przedstawianego kodu to wanie kod
rdowy w jzyku C. Programy te mona modyfikowa, dostosowywa do wasnych
potrzeb i odpowiednio kompilowa.
W pracy nad niniejszym rozdziaem wykorzystano obszerne fragmenty pracy guru
programowania Matthew Proberta. Maj one peni funkcj wprowadzenia do programowania w jzyku C i umoliwi stosowanie przedstawianych w ksice (i zaczonych na CD-ROM-ie) listingw programw. Peny kurs jzyka znajdziesz w niejednej ksice wydawnictwa Helion.

Jzyk C wyrniaj nastpujce cechy, ktre omawiamy niej.


J Blokowe konstrukcje sterowania wykonywaniem programu (typowe dla

wikszoci jzykw wysokiego poziomu).


J Swobodne operowanie podstawowymi obiektami maszynowymi (takimi jak

bajty) i moliwo odwoywania si do nich przy uyciu dowolnej, wymaganej


w danej sytuacji, perspektywy obiektowej (typowe dla jzykw asemblerowych).
J Moliwo wykonywania operacji zarwno wysokiego poziomu (na przykad

arytmetyka zmiennoprzecinkowa), jak i niskiego poziomu (zblionych


do instrukcji jzyka maszynowego), co umoliwia tworzenie kodu wysoce
zoptymalizowanego bez utraty jego przenonoci.

202

Hack Wars. Na tropie hakerw

Przedstawiony w niniejszym rozdziale opis jzyka C bazowa bdzie na funkcjach


oferowanych przez wikszo kompilatorw dla komputerw PC. Powinien dziki
temu umoliwi rozpoczcie tworzenia prostych programw osobom nieposiadajcym szerokiej wiedzy o jzyku (uwzgldnimy midzy innymi funkcje zapisane w pamici ROM i funkcje DOS-u).
Przyjmujemy zaoenie, e masz, drogi Czytelniku, dostp do kompilatora C i odpowiedniej dokumentacji funkcji bibliotecznych. Programy przykadowe powstay
w Turbo C firmy Borland; wikszo elementw niestandardowych tego narzdzia
uwzgldniono rwnie w pniejszych edycjach Microsoft C.

Wersje jzyka C
W pierwotnej edycji jzyka C (jeszcze przed publikacj Kernighana i Ritchieego,
The C Programming Language, Prentice-Hall 1988 (polskie wydanie: Jzyk ANSI C,
Wydawnictwa Naukowo-Techniczne 1994)) zintegrowane operatory przypisania (+=,
*= itd.) definiowane byy odwrotnie (tj. =+, =* itd.). Znakomicie utrudniao to interpretacj wyrae takich jak:


co mogoby znaczy


lub


Ritchie szybko zauway dwuznaczno takiego zapisu i zmodyfikowa go do postaci


znanej dzisiaj (+=, *= itd.). Mimo to wci stosowanych jest wiele odmian bdcych
rodzajem wyporodkowania midzy pierwotn wersj jzyka C Kernighana i Ritchieego
a jzykiem ANSI C. Rnice midzy nimi dotycz przede wszystkim:
J wprowadzenia prototypw funkcji i zmiany preambuy definicji funkcji,

aby dostosowa j do stylu prototypw,


J wprowadzenia znaku wielokropka (...) do oznaczenia list argumentw o zmiennej

dugoci,
J wprowadzenia sowa kluczowego  (dla funkcji, ktre nie zwracaj wartoci)
i typu  dla oglnych zmiennych wskanikowych,
J wprowadzenie w preprocesorze mechanizmw scalania cigw, wklejania

elementu (token-pasting) i zamiany na cig (string-izing),


J dodanie w preprocesorze translacji trygrafw (trigraph) trjznakowych

sekwencji reprezentujcych znaki specjalne,


J dodanie w preprocesorze dyrektywy 

i formalizacja pseudofunkcji
 
,

Rozdzia 6. Podstawy programowania dla hakerw

203

J wprowadzenie cigw i znakw wielobajtowych, zapewniajcych obsug

jzykw narodowych,
J wprowadzenie sowa kluczowego    (jako uzupenienie sowa   ,

stosowane w deklaracjach liczb cakowitych) i jednoargumentowego


operatora plus ().

Klasyfikowanie jzyka C
Szerokie moliwoci jzyka C, dopuszczenie bezporedniego operowania na adresach
i danych w pamici oraz strukturalne podejcie do programowania sprawiaj, e jzyk
ten klasyfikuje si jako jzyk programowania redniego poziomu. Znajduje to wyraz
w mniejszej liczbie gotowych rozwiza ni w jzykach wysokiego poziomu, takich
jak BASIC, ale wyszym poziomie strukturalnym ni niskopoziomowy Assembler.

Sowa kluczowe
Pierwotna edycja jzyka C definiuje 27 sw kluczowych. Komitet ANSI doda do
nich 5 nowych. Wynikiem s dwa standardy jzyka, cho norma ANSI przeja wikszo elementw od Kerninghana i Ritchieego. Oto lista:







 





 






 




 
 









 

 

 



 
 

 



 

 

 

 










Warto zwrci uwag, e niektre kompilatory C wprowadzaj dodatkowe sowa kluczowe, specyficzne dla rodowiska sprztowego. Warto zapozna si z nimi.

Struktura jzyka C
Jzyk C wymaga programowania strukturalnego. Oznacza to, e na program skada
si pewna grupa nawzajem wywoujcych si blokw kodu. Dostpne s rnorodne
polecenia suce do konstruowania ptli i sprawdzania warunkw:
 

Blok programu w jzyku C ujmowany jest w nawiasy klamrowe (). Moe on by


kompletn procedur, nazywan funkcj lub czci kodu funkcji. Przyjrzyjmy si
przykadowi:

204

Hack Wars. Na tropie hakerw


 !
"
 #
 !#
$

Instrukcje wewntrz nawiasw klamrowych wykonane zostan tylko wtedy, gdy speniony zostanie warunek .
Jako kolejny przykad przedstawimy peny blok kodu funkcji, zawierajcy wewntrz
blok ptli:

%&'()
"

#

"

*+,     !  !*#
*- *.#
$
!//0 !#

#
$

Zwrmy uwag, e kady wiersz instrukcji zakoczony jest rednikiem, o ile nie jest
sygnaem pocztku bloku kodu (w takim przypadku kolejnym znakiem jest nawias
klamrowy). Jzyk C rozpoznaje wielko liter, ale nie bierze pod uwag biaych znakw. Odstpy midzy poleceniami s pomijane, std konieczno uycia rednika,
aby oznaczy koniec wiersza. Tego rodzaju podejcie powoduje, e nastpujce polecenia interpretowane s jako identyczne:
!#
!#
!#

Oglna posta programu w jzyku C jest nastpujca:


J instrukcje preprocesora kompilacji,
J globalne deklaracje danych.
J deklaracje i definicje funkcji (wczajc w to zawarto programu):
 
 
"

 
$
 
  
"

 
$
 
1 
"

 
$
2

Rozdzia 6. Podstawy programowania dla hakerw

205

 

 
"

 
$

Komentarze
Podobnie jak wikszo jzykw, C pozwala umieszcza w kodzie programu komentarze. Ich ogranicznikami s symbole  i :
34' 5
 
56 743

(Rwnie czsto korzysta si z komentarzy jednoliniowych, otrzymywanych poprzez


sekwencj //, np.:
33' 
85
 
92:2

Biblioteki
Programy w jzyku C kompiluje si i czy z funkcjami bibliotecznymi, dostarczanymi wraz z kompilatorem. Na biblioteki skadaj si funkcje standardowe, ktrych
dziaanie zdefiniowane zostao w normie ANSI. Ich powizanie z konkretnym kompilatorem zapewnia dostosowanie do platformy sprztowej. Wynika std, e standardowa
funkcja biblioteczna   dziaa tak samo w systemach DEC VAX i IBM PC,
cho rni si jej, zapisany w bibliotece, kod maszynowy. Programista C nie musi zagbia si w zawarto bibliotek, wymagana jest jedynie umiejtno ich stosowania
i znajomo dziaania funkcji, ktre pozostaj niezmienne na kadym komputerze.

Tworzenie programw
Kompilacja
Zanim zajmiemy si funkcjami, poleceniami, sekwencjami i innymi zaawansowanymi
zagadnieniami, przyjrzyjmy si praktycznemu przykadowi, w ktrym doprowadzimy
do skompilowania kodu. Kompilowanie programw C jest stosunkowo prost czynnoci, jednak rni si zalenie od stosowanego kompilatora. Kompilatory wyposaone
w menu umoliwi skompilowanie, skonsolidowanie i uruchomienie programu jednym wciniciem klawisza. Podchodzc jednak do zagadnienia moliwie uniwersalnie i tradycyjnie, przeprowadzimy poniej ca procedur w oparciu o wiersz polece.
W dowolnym edytorze wprowadzamy poniszy fragment kodu i zapisujemy plik jako
przyklad.c:
34
;   



43

206

Hack Wars. Na tropie hakerw


< 
 20
  
"

*= >+*#
$

Kolejnym krokiem jest skompilowanie kodu do postaci pliku programu dopiero


wtedy mona bdzie go uruchomi (czy te wykona). W wierszu polece w tym samym katalogu, w ktrym zapisalimy plik przyklad.c, wprowadzamy nastpujce polecenie kompilacji:
 2

Nie wolno zapomina, e skadnia polecenia kompilacji zaley od kompilatora. Nasz


przykad opiera si na standardzie jzyka C. Wspczenie jednak popularne jest stosowanie skadni wywodzcej si z kompilatora GNU C:
 2

Po wykonaniu takiego polecenia nasz kod jest ju skompilowany i ma posta pliku


programu, ktry moemy uruchomi. Wynik jego dziaania atwo wydedukowa
z prostego kodu:
= >
9
 
 

To wszystko! Kompilowanie maych programw w C nie jest trudne, naley jedynie


mie wiadomo szkodliwych niekiedy efektw ich dziaania. Programy przedstawiane na stronach tej ksiki i zaczone na CD-ROM-ie s oczywicie znacznie bardziej skomplikowane, jednak zasady pozostaj te same.

Typy danych
W jzyku C wyrnia si cztery podstawowe typy danych: znakowy, cakowity,
zmiennoprzecinkowy i nieokrelony. Odpowiadaj im sowa kluczowe: 
, ,

 i . Dalsze typy danych tworzy si na tej podstawie, dodajc modyfikatory:
   (ze znakiem),    (bez znaku),  (duga) i   (krtka). Modyfikator    jest elementem domylnym, co sprawia, e jego uycie moe si okaza
konieczne jedynie w wypadku gdy zastosowano przecznik kompilacji nakazujcy
domylne korzystanie ze zmiennych bez znaku. Rozmiar kadego typu danych zaley
od platformy sprztowej, jednak norma ANSI wyznacza pewne zakresy minimalne,
zestawione w tabeli 6.1.
W praktyce tak okrelone konwencje oznaczaj, e typ danych 
nadaje si najlepiej do przechowywania zmiennych typu znacznikowego, takich jako kody stanu,
o ograniczonym zakresie wartoci. Mona rwnie korzysta z typu . Gdy jednak
zakres wartoci nie przekracza 127 (lub 255 dla   
), kada deklarowana
w ten sposb zmienna przyczynia si do niepotrzebnego obciania pamici.
Natomiast trudniejsze jest pytanie o to, z ktrego typu liczb rzeczywistych korzysta

,   czy     . Gdy wymagana jest dokadno, na przykad
w aplikacji stosowanej w ksigowoci, instynktownie powinnimy uy typu    ,

Rozdzia 6. Podstawy programowania dla hakerw

207

Tabela 6.1. Rozmiary i zakresy typw danych jzyka C


Typ

Rozmiar

Zakres



128 do 127

 

0 do 255



16

32 768 do 32 767

 

16

0 do 65 535

 

32

2 147 483 648 do 2 147 483 647

  

32

0 do 4 294 967 295

 

32

precyzja 6-cyfrowa



64

precyzja 10-cyfrowa

  

80

precyzja 10-cyfrowa

wie si to jednak z wykorzystaniem przez kad zmienn 10 bajtw. Obliczenia na


liczbach rzeczywistych nie s tak dokadne jak na liczbach cakowitych, warto wic
zawsze rozway uycie typu  i obejcie problemu. Typ danych 
 nie jest
zbyt dobry, gdy jego 6-cyfrowa precyzja nie zapewnia dokadnoci, na ktrej zawsze
bdziemy mogli polega. Ogln zasad jest korzystanie z typw cakowitych tak
szeroko, jak tylko jest to moliwe, a gdy pojawia si konieczno uycia liczb rzeczywistych, wprowadzenie typu   .

Deklarowanie zmiennej
Kada zmienna musi zosta zadeklarowana przed uyciem. Ogln postaci deklaracji zmiennej jest:

#

Aby wic przykadowo zadeklarowa zmienn  typu , przeznaczon do przechowywania wartoci z zakresu od 32 768 do 32 767, uyjemy instrukcji:

#

Cigi znakowe deklarowa mona jako tabele znakw:



?  
@#

Deklaracja cigu o nazwie 


!"# i dugoci 30 znakw, wyglda bdzie nastpujco:
 ?A!@#

Tablice danych innych typw mog mie wicej ni jeden wymiar. Oto deklaracja
dwuwymiarowej tablicy liczb cakowitych:

? !@? !@#

Elementy tablicy wywoujemy jako:


?!@?!@
?!@? @
?@?@

208

Hack Wars. Na tropie hakerw

Wyrnia si trzy poziomy dostpu do zmiennych: lokalny, na poziomie moduu


i globalny. Zmienna deklarowana wewntrz bloku kodu bdzie dostpna wycznie
dla instrukcji wewntrz tego bloku. Zmienna deklarowana poza blokami kodu funkcji,
ale poprzedzona modyfikatorem 
, bdzie dostpna wycznie instrukcjom wewntrz moduu kodu rdowego. Zmienna deklarowana poza blokami kodu funkcji
i niepoprzedzona modyfikatorem bdzie dostpna dla dowolnych instrukcji w dowolnym module programu. Na przykad:

  #



#
  7   5 ;  5
B5
5 
  B
6 
8  
 B
5 55C5 
  5
2D 
  CE8 
6
;   56  92:2
"

#

#
$
 5
"
34F 5
G!43
!
"

 #
  !# 1!# HH

*+= ,  *#
$
$

W powyszym przykadzie zmienna 


 jest dostpna dla wszystkich, kompilowanych jako jeden program, moduw kodu rdowego. Zmienna
jest osigalna dla
wszystkich instrukcji w funkcjach
 i #$

, ale pozostaje niewidoczna


z poziomu innych moduw. Zmienne  i % s dostpne wycznie instrukcjom wewntrz funkcji
. Z kolei zmienna moe by uyta wycznie przez instrukcje
wewntrz bloku kodu po instrukcji .
Jeeli drugi blok kodu faktycznie ma skorzysta ze zmiennej 
, wymagane bdzie
umieszczenie w nim deklaracji zmiennej globalnej  :


  #
 5 
"
$

Jzyk C nie stawia szczeglnych przeszkd w przypisywaniu do siebie rnych typw


danych. Przykadowo moemy zadeklarowa zmienn typu 
, co spowoduje przypisanie do przechowywania jej wartoci jednego bajtu danych. Mona podj prb
przypisania do niej wartoci spoza tego zakresu:

Rozdzia 6. Podstawy programowania dla hakerw

209

  
"
I!!!#
$

Zmienna  moe przechowywa wartoci z zakresu od 127 do 128, a wic warto 5000
nie zostanie przypisana.  przyjmie jednak warto 136.
Potrzeba przypisania rnych typw danych nie jest niczym oryginalnym. Aby powstrzyma kompilator od generowania ostrzee o takich operacjach, mona skorzysta z instrukcji konwersji (cast statement), informujc kompilator o tym, e operacja
wykonywana jest wiadomie. Instrukcj tak budujemy, umieszczajc przed zmienn
lub wyraeniem nazw typu danych ujt w nawiasy:
  
"
 
#

#
 !!31I#

#
$

Operacja rzutowania  informuje kompilator o koniecznoci konwersji wartoci


zmiennej zmiennoprzecinkowej  do liczby cakowitej, zanim ta zostanie przypisana
do zmiennej %.

Parametry formalne
Funkcja w jzyku C moe przyjmowa parametry przekazywane przez funkcj wywoujc. Parametry te deklaruje si podobnie jak zmienne, podajc ich nazwy wewntrz towarzyszcych nazwie funkcji nawiasw:

JKLM


"
34MGE
  8 
43

4#
$
  
"

#

 #

#
I#
 N#
JKLM #

*- - G6- +* #
$

210

Hack Wars. Na tropie hakerw

Modyfikatory dostpu
Stosuje si dwa modyfikatory dostpu:  i 
 . Warto zmiennej zadeklarowanej jako  nie moe zosta zmieniona przez program, warto zmiennej zadeklarowanej jako 
 moe zosta zmieniona przez program. Dodatkowo, zadeklarowanie zmiennej jako 
 uniemoliwia kompilatorowi zaalokowanie jej
do rejestru i ogranicza przeprowadzan na niej optymalizacj.

Typy klas przechowywania zmiennych


Jzyk C przewiduje cztery rodzaje przechowywania zmiennych:  , 
,

i  . Typ   umoliwia moduowi kodu rdowego dostp do zmiennej
zadeklarowanej w innym module. Zmienne 
 dostpne s wycznie z poziomu
bloku kodu, w ktrym zostay zadeklarowane. Dodatkowo, jeeli zmienna ma zasig
lokalny, zachowuje swoj warto midzy kolejnymi wywoaniami bloku kodu.
Zmienne rejestrowe (  ) s, gdy tylko jest to moliwe, przechowywane w rejestrach procesora. Zapewnia to najszybszy dostp do ich wartoci. Typ
 stosuje si
wycznie w odniesieniu do zmiennych lokalnych. Nakazuje on zachowywanie wartoci zmiennej lokalnej. Poniewa jest to modyfikator domylny, rzadko mona spotka go w programach.

Operatory
Operatory to elementy kodu, ktre nakazuj wykonanie oblicze na zmiennych. W jzyku C dostpne s nastpujce:
.

adres,

porednio,

plus jednoargumentowy,

minus jednoargumentowy,

dopenienie bitowe,

>

negacja logiczna,

HH

jako prefiks preinkrementacja, jako sufiks postinkrementacja,

PP

jako prefiks predekrementacja, jako sufiks postdekrementacja,

dodawanie,

odejmowanie,

mnoenie,

dzielenie,

reszta z dzielenia (modulo),



przesunicie w lewo,

00

przesunicie w prawo,

bitowa operacja AND,

Rozdzia 6. Podstawy programowania dla hakerw


/

bitowa operacja OR,

bitowa operacja XOR,

..

logiczna operacja AND,

//

logiczna operacja OR,

przypisanie,

4

przypisanie iloczynu,

3

przypisanie ilorazu,

-

przypisanie reszty (moduu),

H

przypisanie sumy,



przypisanie rnicy,



przypisanie przesunicia w lewo,

00

przypisanie przesunicia w prawo,

.

przypisanie wyniku bitowej operacji AND,

/

przypisanie wyniku bitowej operacji OR,

Q

przypisanie wyniku bitowej operacji XOR,

mniejsze ni,

wiksze ni,



mniejsze lub rwne,

0

wiksze lub rwne,



rwne,

>

rne od,

bezporedni selektor skadnika,

0

poredni selektor skadnika,

RS

jeeli
to prawda, to , w przeciwnym razie %&

?@

definiowanie tablic,



nawiasy oddzielaj warunki i wyraenia,

222

wielokropek wykorzystuje si w listach parametrw formalnych prototypw


funkcji do deklarowania zmiennej liczby parametrw lub parametrw
zmiennych typw.

211

Aby zilustrowa sposb korzystania z podstawowych operatorw, przyjrzyjmy si


krtkiemu programowi:
  
"

#

 #

#
I#3495
BI43
 31#3495 
B  5143
 41#3495
B   8 5143
34F 
CC
BE543

212

Hack Wars. Na tropie hakerw



*M5

*#


*M5

*#
$

Typowym sposobem zwikszenia wartoci zmiennej o 1 jest wiersz:


H

Jzyk C dostarcza operatora inkrementacji, wystarczy wic napisa:


HH

W podobny sposb korzystamy z operatora dekrementacji, czyli zmniejszania wartoci o 1:




Pozostae operatory matematyczne wykorzystujemy podobnie. Warto jednak pamita o wprowadzanych przez jzyk C moliwociach zapisu skrconego:
Zapis typowy

Zapis w j+zyku C

H

HH





41

41

3

3

-I

-I

Funkcje
Funkcje to procedury kodu rdowego tworzce program w jzyku C. Ich ogln postaci jest:
 


   
"

 
$

 
to typ zwracanej przez funkcj wartoci: 
, ,   ,  itp.
Kod wewntrz funkcji C pozostaje niewidoczny dla innych funkcji C. Nie mona wykonywa skokw z jednej funkcji do wntrza innej. Funkcje mog jedynie wywoywa inne funkcje. Nie wolno rwnie definiowa funkcji wewntrz innych funkcji.
Definicja musi zosta umieszczona bezporednio na poziomie moduu kodu.

Parametry przekazywane s do funkcji jako wartoci lub jako odwoania (wskaniki).


Gdy parametr jest przekazywany jako warto, funkcja otrzymuje kopi tej wartoci.
Parametr przekazywany jako odwoanie jest jedynie wskanikiem do waciwego parametru. Pozwala to na zmian jego wartoci z poziomu wywoanej funkcji. W poniszym przykadzie przekazujemy dwa parametry jako warto do funkcji #$

,

Rozdzia 6. Podstawy programowania dla hakerw

213

ktra nastpnie podejmuje prb zmiany wartoci przekazanych zmiennych. Drugim


krokiem jest przekazanie tych samych parametrw do funkcji #$
, ktra rwnie podejmuje prb zmiany wartoci zmiennych:
< 
 20

 5


"
34T 55 5 
5 
B43
41#
41#

*+,
BE 5- 2,
BE 5- *#

#
$

 5 
4
4
"
34T 55 5 
5   ;43
4441#
4441#

*+,
BE 5 - 2,
BE 5 - *44#

4#
$
  
"

#

#

#
I#
N#
 5#
 5 ..#

*+,
BE- 
BE- 
BE- *#
$

#$
 nie zmienia wartoci otrzymanych parametrw. Modyfikowana jest zawarto wskazywanych parametrami adresw pamici. O ile #$

 otrzymuje
z funkcji
 wartoci zmiennych  i %, #$
 otrzymuje z funkcji
 ich

adresy w pamici.

Przekazywanie tablicy do funkcji


Nastpujcy program przekazuje do funkcji tablic, a funkcja nadaje wartoci elementom tablicy:

214

Hack Wars. Na tropie hakerw


< 
 20
   5
?@
"

#
 !# !!#HH
?@#
$
  
"


 ? !!@#

#
 5
 #
 !# !!#HH

*+,
BE
-  - *
 ?@#
$

Parametr funkcji, '(, jest tablic dowolnej dugoci. Deklaracja taka jest moliwa, poniewa kompilator przekazuje jedynie adres pocztkowy tablicy, a nie wartoci
poszczeglnych jej elementw. Konsekwencj tego jest fakt, e funkcja moe zmienia wartoci elementw tablicy. Aby uniemoliwi funkcji wprowadzanie modyfikacji, konieczne jest uycie typu :
 5 

?@
"
$

Przy takiej deklaracji wiersz zmieniajcy zawarto tablicy wywoaby bd kompilacji. Okrelenie parametru jako wartoci staej nie likwiduje jednak porednioci jego
przekazania. Ilustruje to poniszy program:
< 
 20
   5 

?@
"

4
#

#
34' 5 
8U   
  U43
34  5V43
345
V 

43

#
 !# !!#HH
"
4
#

HH#
$
$
  
"

Rozdzia 6. Podstawy programowania dla hakerw

215



 ? !!@#

#
 5
 #
 !# !!#HH

*+,
BE
-  - *
 ?@#
$

Przekazywanie parametrw funkcji main()


Jzyk C umoliwia przekazanie parametrw do uruchamianego programu z poziomu
systemu operacyjnego. Do ich odczytania wykorzystuje si zmienne
 i
'(:
< 
 20
  
4?@
"

#
 !##HH

*+,

 - 
-*?@#
$

Parametr
 przechowuje liczb przekazanych programowi parametrw. W tablicy

'( zapisane s ich adresy;


'( jest zawsze nazw uruchamianego programu.
Mechanizm ten ma szczeglne znaczenie dla aplikacji wymagajcych dostpu do plikw systemowych i danych. Rozwamy nastpujc sytuacj: maa aplikacja obsugi
baz danych przechowuje swoje dane w pojedynczym pliku dane.dat; aplikacja ta musi
zosta tak zaprojektowana, aby mona byo uruchomi j z dowolnego katalogu, czy
to na dysku twardym, czy dyskietce; musi rwnie zapewni uruchamianie za porednictwem cieki wyszukiwania DOS-u (
). Do poprawnej pracy aplikacji jest wic
wymagane, aby zawsze moga odnale plik dane.dat. Rozwizanie takie zapewni
przyjcie zaoenia, e plik danych jest zawsze w identycznym katalogu co sam program. Poniszy fragment ilustruje wykorzystanie parametrw
 i
 w celu utworzenia cieki do pliku danych aplikacji:
< 
20
( ? W!@#
  
4?@
"
4( *XD'D2XD'*#
4#

( ?!@#


( *2*# 

   ;

92:2
KYZZ
"
349    5
27LJ43

216

Hack Wars. Na tropie hakerw




( *2 *#
$
34,  5 

  B43
4 >U++U
#

( #
$

Przedstawiony program tworzy i zapisuje w zmiennej 


!"
)# cig postaci cieka\dane.dat. Jeeli wic przykadow nazw pliku uruchomieniowego bdzie test.exe
i zostanie on umieszczony w katalogu \borlandc, zmiennej 
!"
)# przypisany
zostanie cig *  
*
 +
.

Wyj#cie z funkcji
Polecenie   powoduje natychmiastowe wyjcie z funkcji. Jeeli w deklaracji
funkcji podano typ zwracanej wartoci, w poleceniu   naley uy parametru tego samego typu.

Prototypy funkcji
Prototypy funkcji umoliwiaj kompilatorowi C sprawdzanie poprawnoci przekazywanych, do i z funkcji, danych. Ma to istotne znaczenie jako zabezpieczenie przed
przekroczeniem zakresu zaalokowanego dla zmiennej obszaru pamici. Prototyp funkcji
umieszcza si na pocztku programu po poleceniach preprocesora (takich jak  )
i przed deklaracjami funkcji.

Polecenia preprocesora C
W jzyku C w treci kodu rdowego mona umieszcza polecenia dla kompilatora.
Okrela si je terminem polecenia preprocesora. Norma ANSI definiuje nastpujce:
<
< 
< 
<
<
< 
< 
< 
<  
<
< 
<

Wszystkie polecenia preprocesora rozpoczyna znak krzyyka (hash), czyli #. Kade


wymaga osobnego wiersza kodu (uzupenionego ewentualnie komentarzem). Poniej
przedstawiamy krtkie omwienie.

Rozdzia 6. Podstawy programowania dla hakerw

217

#define
Polecenie   tworzy identyfikator, ktry kompilator zastpi podanym cigiem
w danym module kodu rdowego. Na przykad:
< TDZF&!
< '[Y&>TDZF&

Kompilator zastpi wszystkie dalsze wystpienia cigu ,-./0 znakiem , a wszystkie


dalsze wystpienia cigu 1230 cigiem 4. Zastpowaniu nie podlegaj identyfikatory wewntrz znakw cudzysowu, a wic wiersz:

*'[Y&*#

nie zostanie zmieniony, ale



*- *TDZF&#

podlega modyfikacji.
Polecenie   moe rwnie zosta uyte do definiowania makr, take makr z parametrami. Do zapewnienia poprawnoci zastpie zaleca si ujmowanie parametrw
w nawiasy. W poniszym przykadzie deklarujemy makro o nazwie 
, przyjmujce dwa parametry i zwracajce ten z nich, ktrego warto jest wiksza.
< 
 20
<  0 RS 


"

*+- 5
6*IN#
$

#error
Polecenie   powoduje przerwanie procesu kompilacji i wywietlenie podanego
tekstu, na przykad:
< F\LJ9]ZL,DK&XLJLXYZY:

powoduje zatrzymanie kompilacji i wywietlenie:


F\LJ9]ZL,DK&XLJLXYZY:

#include
Polecenie  nakazuje kompilatorowi odczytanie i przetworzenie zawartoci
dodatkowego pliku rdowego. Nazwa pliku musi zosta ujta w cudzysw lub
wstawiona midzy znaki 5, na przykad:
< * 12*
< 
 20

Jeeli nazwa pliku zostaa wpisana midzy znaki 5, kompilator wyszukuje go w katalogu okrelonym w konfiguracji. Jest to zasada oglna.

218

Hack Wars. Na tropie hakerw

#if, #else, #elif, #endif


Grupa polece  dostarcza mechanizmu kompilacji warunkowej. Stosowana jest
do typowa skadnia:
<
  

 
<

 
< 

Polecenie   to skrcona posta   :


<


 
<


 
< 

#ifdef, #ifndef
Rozwiniciem tych polece jest    (jeeli zdefiniowano) i   
(jeeli nie zdefiniowano). Konstrukcje skadniowe s nastpujce:
< 


 
<

 
< 
< 


 
<

 
< 

    to identyfikator utworzony za pomoc deklaracji   .

#undef
Polecenie   usuwa definicj makra utworzonego przy uyciu wczeniejszej instrukcji   .

#line
Polecenie  modyfikuje zmienne globalne kompilatora )).670)) i )),6.0)).
Ogln postaci instrukcji jest:
<
*
 *

Warto   zostaje umieszczona w zmiennej )).670)), a 8 


 8 w zmiennej )),6.0)).

Rozdzia 6. Podstawy programowania dla hakerw

219

#pragma
Umoliwia korzystanie z polece specyficznych dla kompilatora.

Instrukcje steruj"ce
Jak w kadym jzyku programowania, rwnie w C, znajdziemy instrukcje sprawdzajce warto wyraenia. Wynikiem takiego sprawdzenia jest warto 1230 lub ,-./0.
Wartoci ,-./0 odpowiada liczba , a 1230 liczba rna od zera.

Instrukcje wykonania warunkowego


Podstawow instrukcj wykonania warunkowego jest  o nastpujcej skadni:



 


 

gdzie    moe by instrukcj pojedyncz lub ujtym w nawiasy klamrowe
blokiem kodu. Element  jest opcjonalny. Jeeli wartoci  jest 1230,
wykonywana jest instrukcja podana bezporednio po nim. W pozostaych przypadkach
wykonywana jest instrukcja podana po sowie  (o ile ta cz skadni zostaa uyta).
Alternatyw dla konstrukcji +++  jest polecenie 9: w postaci:


 
  

Jeeli wartoci wyraenia jest 1230, wykonywana jest pierwsza instrukcja. W pozostaych przypadkach wykonywana jest instrukcja druga. Ilustruje to przykad:
< 
 20
  
"

#
W#

*+
 -*-1!R*
*S*
*#
$

Jzyk C oferuje rwnie instrukcj ", uatwiajc porwnywanie wyraenia


z pewn list wartoci. Wykonywane s instrukcje powizane z pierwsz dopasowan
wartoci listy. Skadnia polecenia " jest nastpujca:



"
 S
 
 #
!S
 
 #
2
2

220

Hack Wars. Na tropie hakerw



S
 
 #
  
S
 
$

Uycie instrukcji
# nie jest wymagane, ale jej pominicie powoduje dalsze porwnywanie wyraenia z kolejnymi elementami listy wartoci.
< 
 20
  
"

#
W#


"
!S
*+G6 *#
 #
 S
*+G65 *#
 #
1S
*+G6 *#
 #
AS
*+G6
*#
 #
  
S
*+5
6 
*#
$
$

Instrukcje " mona zagnieda.

Instrukcje iteracji
W jzyku C stosuje si trzy instrukcje ptli (iteracji):  , " i ;" . Skadnia
ptli  jest nastpujca:
 
  #
#



 

Jest ona szczeglnie przydatna, gdy korzystamy z licznika, jak w poniszym przykadzie wywietlajcym zestaw znakw ASCII:
< 
 20
  
"

#
 A1# 1^#HH

*- +
-+
*#
$

Dopuszczalna jest rwnie nieskoczona ptla  :

Rozdzia 6. Podstawy programowania dla hakerw

221

 ##
"

 
$

Jzyk C pozwala uywa te pustych instrukcji. Ponisza ptla usuwa z cigu pocztkowe znaki odstpu:
 #4
UU#
HH
#

Warto zwrci uwag na redniki odpowiadajce inicjalizacji ptli i pustej instrukcji.


Ptla " ma konstrukcj nieco prostsz:



 

Instrukcja lub blok instrukcji (ujty w nawiasy klamrowe) bd powtarzane do czasu,


gdy wyraenie warunku przyjmie warto ,-./0. Jeeli wyraenie nie jest prawdziwe
jeszcze przed wejciem do ptli, instrukcje nie bd wykonywane w ogle. Jest to
istotna rnica w stosunku do ptli ;" , ktra zawsze zostaje wykonana co najmniej raz. Jej skadnia to:

"

 
$

#

Instrukcje skoku
Instrukcja   pozwala powrci z funkcji wykonywanej do funkcji, z ktrej ta zostaa wywoana. W zalenoci od zadeklarowanego typu wartoci zwracanej przez
funkcj instrukcja   moe wymaga odpowiedniego parametru:

JYZ'


"

4#
$

lub
   5
"

*+= ,  *#

#
  
5
 92:2
$

Instrukcja
# suy do wychodzenia z ptli lub instrukcji ". W przypadku ptli powoduje to jej przedwczesne zakoczenie, jak w poniszym przykadzie:
< 
 20
  
"

#

222

Hack Wars. Na tropie hakerw


 !#1IW#HH
"
 !!
 #

*- +
*#
$
$

Uzupenieniem
# jest polecenie  , wymuszajce przeprowadzenie nastpnej iteracji ptli. Kolejn wykonywan instrukcj jest w tym przypadku instrukcja ptli (dalsze instrukcje w iterowanym bloku s pomijane). Dostpna jest rwnie funkcja przedwczesnego zakoczenia wykonywania programu . Mona za jej
pomoc przekaza warto zwracan do programu wywoujcego:

 
#

Continue
Sowo kluczowe  nakazuje skok do instrukcji kontrolnej ptli. W przypadku
ptli zagniedonych jest to instrukcja ptli wewntrznej (" , +++" ). To sposb na agodne zakoczenie ptli jak w poniszym przykadzie, gdzie odczytujemy
zapisane w pliku cigi:
< 
 20
  
"
T]Z&4#
4#
 ? !!@#
 * 2

***#
KYZZ
"


*K 8
 E  
2

*#

!#
$

"

  !!#
KYZZ
34, 5B43
 
 #

#
$
#
$

W przypadku ptli  instrukcja  powoduje najpierw wykonanie wyraenia


inkrementacji, a dopiero po nim nastpuje sprawdzenie warunku zakoczenia.

Rozdzia 6. Podstawy programowania dla hakerw

223

Wej#cie-wyj#cie
Pobieranie danych
Program w jzyku C moe pobiera dane z konsoli (ktra jest standardowym urzdzeniem wejciowym), pliku lub portu. Oglnym poleceniem odczytu danych ze standardowego strumienia wejciowego  jest 
. Skanuje ono po jednym znaku
kolejne pola wejciowe. Podlegaj one formatowaniu zgodnie z pierwszym z przekazanych funkcji 
 parametrw. Nastpnie pole zostaje zapisane pod adresem przekazanym jako kolejny parametr wywoania funkcji. Przykadowy program odczytuje
pojedyncz liczb cakowit ze strumienia :
  
"

#
*- *.#
$

Warto zwrci uwag na operator uyty jako prefiks zmiennej  na licie parametrw
wywoania funkcji 
. Funkcja ta zapisuje bowiem warto pod okrelonym adresem, nie posugujc si mechanizmem przypisywania wartoci zmiennej. Cigiem
formatujcym jest cig znakowy, ktry moe zawiera trzy typy danych: znaki odstpu
(spacja, tabulator, przejcie do nowego wiersza), znaki waciwe (wszystkie znaki ASCII
z wyjtkiem znaku %) i specyfikatory formatowania. Specyfikatory te maj nastpujc skadni:
-?4@? @?//Z@

Oto przykad:
< 
 20
  
"
 ?A!@#

#

*9 5 *#
*-A!- * .#

*+-- * #
$

Zwrmy uwag na wiersz  +5 nakazuje on kompilatorowi przetwarzanie pliku nagwkowego stdio.h, w ktrym zawarte s prototypy funkcji 

i  . Po uruchomieniu tego prostego programu atwo przekonamy si, e uycie
znaku odstpu przerwie wprowadzanie pierwszego pola danych.
Alternatywn funkcj pobierania danych jest , odczytujca cig znakw ze strumienia  do momentu napotkania znaku nowego wiersza. W cigu docelowym znak
nowego wiersza zastpiony zostaje znakiem 73... Charakterystyczna dla tej funkcji
jest moliwo odczytywania znakw odstpu. Oto nowa wersja powyszego programu
(korzystajca z  w miejsce 
):

224

Hack Wars. Na tropie hakerw


< 
 20
< 
 20
< 
20
  
"
 ?^!@#
4#
 ?A!@#

#

*+9 5 *#
34L 
C  43

 #
345
V  

    C 43
. ?
  @#
34Y 5 _ 
6 5C5KYZZ43
4UU"
4!#
#
$
34Z  5 

C56C 43

 UU#
34L 
5 643

#
34,
 _C    43
4!#
34\  5C  543

  #
34,B
 543

*+K S-S- * #
$

Wyprowadzanie danych
Podstawow funkcj wyprowadzania danych jest  . Jest ona podobna do 

z t rnic, e zapisuje dane do standardowego strumienia wyjciowego .
Funkcja pobiera list pl danych wyjciowych, odpowiednio stosuje specyfikatory
formatowania i wyprowadza wynik. Mona stosowa takie same przeksztacenia formatujce jak w przypadku funkcji 
, jak rwnie dodatkowe znaczniki:
;

wyrwnuje dane wyjciowe do lewej, uzupeniajc je z prawej strony


znakami odstpu midzywyrazowego (spacji),

wymusza poprzedzanie liczb znakiem.

Nieco odmienna jest take posta specyfikatora szerokoci. Jest on rozbudowany o element okrelajcy precyzj:
2 

Rozdzia 6. Podstawy programowania dla hakerw

225

Aby wic wywietli liczb zmiennoprzecinkow z dokadnoci do trzech miejsc


dziesitnych, piszemy:

*-2A*#

Poniej przedstawiamy list specjalnych staych znakowych, ktre mog pojawi si


na licie parametrw funkcji  :
+

nowy wiersz (NL),

+

powrt karetki (CR),

tabulator,

znak cofania (backspace),

+

znak nowej strony,

+

tabulator pionowy,

++

ukonik odwrotny (backslash),

+U

apostrof,

+*

cudzysw,

+R

znak zapytania,

+

cig w notacji semkowej,

+

cig w notacji szesnastkowej.

Kolejny program ilustruje, w jaki sposb wywietli liczb cakowit w postaci dziesitnej, szesnastkowej i semkowej. Liczba < po znaku procentw (=) w instrukcji
  nakazuje kompilatorowi dopenienie wywietlanej liczby do szerokoci co
najmniej czterech cyfr:
349 
  5  6
43
34  

 5G 543
< 
 20
  
"

#

"

*+9 5 6 !  _E*#
*- *.#

*-!` -!`)-!` *#
$
>!#
$

Do funkcji pokrewnych   naley  , ktrej prototyp ma posta:



T]Z&44 
? 
222@#

Jej zadaniem jest przesyanie sformatowanych danych wyjciowych do okrelonego


strumienia plikowego.

226

Hack Wars. Na tropie hakerw

Kolejn tego rodzaju funkcj jest   o prototypie:



44 
? 
222@#

Alternatyw dla   jest , funkcja przesyajca prosty cig do strumienia
. Przesyany cig zostaje automatycznie uzupeniony znakiem nowego wiersza.
Jest to rozwizanie szybsze od  , jednak jego moliwoci s ograniczone.

Bezpo#rednia wymiana danych z konsol*


Do przesyania i odczytu danych z konsoli (klawiatury i ekranu) mona wykorzystywa rwnie bezporednie funkcje we-wy. Wyrnia je litera c na pocztku odpowiednikiem   jest wic  , a odpowiednikiem  funkcja
. Rnice midzy funkcjami bezporedniej wymiany danych a funkcjami
standardowymi s nastpujce.
J Nie s wykorzystywane strumienie predefiniowane, nie mona wic przekierowa

danych przesyanych funkcjami komunikacji bezporedniej.


J Funkcji bezporednich nie mona przenosi midzy rnymi systemami

operacyjnymi (m.in. nie mona z nich korzysta w programach dla Windows).


J Funkcje bezporednie s szybsze ni standardowe.
J Nie zapewniaj wsppracy ze wszystkimi trybami wywietlania (zwaszcza

trybami graficznymi VESA).

Wska%niki
Wskanik to zmienna, ktra przechowuje adres elementu danych w pamici. Deklaracja wskanika jest podobna do deklaracji zwykej zmiennej, ale nazwa poprzedzana
jest znakiem gwiazdki (), na przykad:
4#

Powyszy wiersz deklaruje zmienn  jako wskanik do zmiennej typu 


.
Wykorzystanie wskanikw dostarcza szerokich moliwoci, wymaga jednak szczeglnej uwagi. Skutki przypisania bdnego adresu s najczciej nieprzewidywalne.
Oto przykad prostego programu, w ktrym wykorzystywany jest wskanik:
< 
 20
  
"

#

4#
345
V  
 
43
 !!#
.#

*+M  5
BE-   -2*#
$

Rozdzia 6. Podstawy programowania dla hakerw

227

Wartoci wskanikw mona zwiksza i zmniejsza, dopuszczalne s rwnie inne


operacje matematyczne. Typowym zastosowaniem wskanikw jest zapewnienie dynamicznego przydziau pamici. W trakcie pracy programu czsto pojawia si potrzeba przejciowego (tymczasowego) zaalokowania bloku pamici. Korzystamy wwczas z funkcji
:
 "

#  #

Funkcja
 zwraca wskanik typu , co oznacza, e moe on wskazywa
dane dowolnego typu , 
, 
 itd. W poniszym przykadzie alokujemy
pami dla tabeli 1000 liczb cakowitych.
< 
 20
< 
 20
  
"

4#

#
345
V  
 
43
34' 
 6 !!!
C43
34  
 
  5  43
34 5
G5  5
 
43
  !!!4 
#
34F  5 
; 43
KYZZ
"

*+K 8  E6  !!!
5
 
B
 
*#

!#
$
349 5
B G
43
 !# !!!#HH
"
4#
HH#
$
349
BE   C
  
 43
 !!!#
34,B

B
 43
 !# !!!#HH"

*+&
-   5
BE- *4#
HH#
$
349  8    5  643
#
$

228

Hack Wars. Na tropie hakerw

Wskaniki wykorzystuje si rwnie w odniesieniu do tablic znakw, czyli cigw


(strings). Poniewa wszystkie cigi w programach C koczy bajt o wartoci 0, korzystajc ze wskanika, moemy policzy znaki w cigu:
< 
 20
< 
20
  
"
4#


? !!@#

   #
34]5 5CU

U43



*' 5
 *#
34Y

BE5 C


43


#
34]5 5C ;  BE43
   !#
34M5

43
4
"
   HH#
HH#
$
34,B
43

*+X     
S- *   #
$

Wymagan do zaadresowania 1 MB pamici 20-bitow liczb dzieli si na dwie wartoci: przesunicie (offset) i segment (kady segment to 64 kB). Do przechowywania numerw segmentw pamici komputer IBM PC wykorzystuje tzw. rejestry segmentowe.
Konsekwencj takiego rozwizania s w jzyku C trzy dodatkowe sowa kluczowe:
J 
wskaniki bliskie maj rozmiar 16 bitw i umoliwiaj dostp

do danych biecego segmentu,


J 
wskaniki dalekie obejmuj wartoci okrelajce przesunicie

i segment, umoliwiajc dostp do dowolnego adresu w pamici,


J  wskaniki ogromne to odmiana wskanikw dalekich, zapewniajca

moliwo zwikszania i zmniejszania wartoci w caym zakresie 1 MB


(kompilator generuje odpowiedni kod modyfikujcy warto przesunicia).
Nie bdzie zapewne zaskakujce stwierdzenie, e przetwarzanie programu korzystajcego ze wskanikw typu 
bdzie szybsze ni w przypadku programu, w ktrym
zastosowano wskaniki 
. Wskaniki  s oczywicie najwikszym obcieniem.
Kompilatory C wyposaone s w makro zwracajce adres odpowiadajcy podanym
wartociom numeru segmentu i przesunicia:
  4J\(T9  
   
#

Rozdzia 6. Podstawy programowania dla hakerw

229

Struktury
Jzyk C oferuje technik grupowania zmiennych pod jedn nazw, dostarczajc w ten
sposb wygodnego sposobu przechowywania powizanych ze sob informacji i strukturalizowania ich. Skadnia definicji struktury jest nastpujca:

 
 

"
 


 

#
 


 

$
2
2
2
$

 #

Uywanie zmiennych strukturalnych jest niezbdne przy korzystaniu z plikw, w ktrych wystpuje uporzdkowanie oparte na rekordach danych. W poniszym przykadzie operowa bdziemy na prostym pliku z list adresw. Rozpoczniemy od deklaracji struktury 
 , zoonej z szeciu pl: 
!"#,
 , 
, "$ "!",
!
i    :

 
 

"
 ?A!@#
 ?A!@#

?A!@#
 5 
 ?A!@#
 ?W@#

  ? I@#
$
#

Odwoania do pl zmiennej strukturalnej maj posta:


 

 2
 #

Nie ma ograniczenia liczby pl struktury, nie jest rwnie wymagane, aby typy pl
byy takie same lub podobne, na przyklad:

 
 

"
 ?A!@#

#
4

#
$
#

Jest to poprawna deklaracja struktury obejmujca: pole tablicy znakowej, pole liczby
cakowitej i pole wskanika do zmiennej znakowej. Aby przekaza zmienn strukturaln jako parametr, korzystamy z jej adresu poprzedzamy nazw zmiennej operatorem >. Oto przykadowy program wykorzystujcy struktury w celu wykonania
prostych operacji na pliku listy adresw:

230

Hack Wars. Na tropie hakerw


< 
 20
< 
 20
<  20
< 
20
< 
20
< +

20
34 (
  43
<  (1I

 
 

"
 ?A!@#
 ?A!@#

?A!@#
 5 
 ?A!@#
 ?W@#

  ? I@#
$
#
  #

 #
349

 543
  DXX([&7  #
  7ZF  #
  X]F9XD'D  #
  TD'DZ4#
  %&'XD'D  #
  J&KY  #
  L9&KXD'D  #

F&D[7=  #
  7ZF
"

#
 !# (#HH

**#
$
  TD'DZ4  
"

*+: 
S-*  #

!#
$
  L9&KXD'D
"
34F V
5 2a8
G243
34a8

G  
  _  243
  * 2 
*L([X,[/L(D99&KXF(],[]'&#

Rozdzia 6. Podstawy programowania dla hakerw


  
"
  * 2 
*L([X,[/L(7[&D'F(],[]'&#
  
TD'DZ*K 8
 E  *#
$
$
  %&'XD'D
"
349    43
7ZF#

*K *#

  2 #

*+D *#

  2 #

*+J
*#

  2
#

*+, 5G 
 *#

  2 5 
 #

*+\  
*#

  2 #

*+K 
  *#

  2
  #
$
  X]F9XD'D
"
34,B
   43


?I@#
7ZF#

*K -*  2 #

*+D -*  2 #

*+J
-*  2
#

*+, 5G 
 -*  2 5 
 #

*+\  
-*  2 #

*+K 
  -++*  2
  #

*,B5&K'&[*#



#
$
  DXX([&7
"
34X ;C      43

#

 .    #
 
TD'DZ*M    8*#
$

F&D[7=
"

231

232

Hack Wars. Na tropie hakerw




? !!@#

#

*,  VG *#



#
4

!

 #
34M  5 C
 43
 !F&&\(F&'#

"
34M; 5   643
  .    #
0!
"
349 5  43


  2 

>KYZZ

 #


  2 

>KYZZ

 #


  2


>KYZZ

 #


  2 5 
 

>KYZZ

 #


  2 

>KYZZ

 #


  2
  

>KYZZ

 #
$
$
0!#

!#
$
  J&KY
"

 5#


? !@#

"
7ZF#

*++
+
+
,  56*#

*+++
+
+
X 5   *#

*+++
+
+
19  *#

*+++
+
+
A,5B*#

*+++++*#



#
 5


#

 5
"
 S%&'XD'D#
349  ;C  5 V  _ 43
 !F&&\(&KX#

Rozdzia 6. Podstawy programowania dla hakerw

233

DXX([&7#
 #
1SF&D[7=
X]F9XD'D#

"

*K]&MKDZ&M]LK&>*#

*,B5&K'&[*#



#
$
 #
AS #
$
$
 5>A#
$
  
"
7ZF#
L9&KXD'D#
J&KY#
$

Pola bitowe
Jzyk C przewiduje moliwo korzystania w strukturach ze zmiennych o rozmiarze
mniejszym ni 8 bitw. Okrela si je mianem pl bitowych, a ich rozmiar moe by
dowolny, od 1 bitu wzwy. Deklaracja pola bitowego wyglda nastpujco:

S  #

Przykadem moe by deklaracja kilku jednobitowych znacznikw stanu:

 
 

"
  S
   S
  S
  
S
$
#

#
#
#
#

#

Zmienna !
!# bdzie zajmowa w pamici tylko 4 bity, mimo e skada si z 4 pl,
z ktrych kade dostpne jest jako osobne pole struktury.

Union
Kolejnym uatwieniem jzyka C, pozwalajcym zapewni optymalne wykorzystanie
dostpnej pamici, jest struktura , czyli zbir zmiennych, wspuytkujcych jeden adres pamici. Oznacza to, oczywicie, e w danym momencie dostpna jest tylko jedna ze zmiennych skadowych. Deklaracja  ma nastpujc posta:

234

Hack Wars. Na tropie hakerw


 

"

 

#

 

#
2
2
2

 

#
$#

Wyliczenia
Wyliczenie (enumeracja) to przypisanie licie symboli rosncych wartoci cakowitych. Wyliczenie deklarujemy:
 
" $  

 %#

Przykadem moe by definicja listy kolorw:


 \LZL[b
"
7MD[Kb
K]&:]&F\]
M]&ZLKb
7M&[,LKb
:[DML,b
aDFKLFMD[b
7]&JKLFMD[b
aDFKLK]&:]&F\]
aDFKLM]&ZLKb
aDFKL7M&[,LKb
MLZ'b
:]DZb
$#

Operacje na plikach
W operacjach dostpu do plikw jzyk C posuguje si buforowanymi strumieniami
plikowymi. Niektre z platform jzyka, jak UNIX i DOS, oferuj rwnie niebuforowane uchwyty plikw.

Strumienie buforowane
Dostp do strumieni buforowanych realizowany jest za porednictwem wskanika do
zmiennej typu ,6.0. Ten szczeglny typ danych zdefiniowany zosta w nagwku stdio.h. Aby wic zadeklarowa wskanik do pliku, wprowadzamy:
< 
 20
T]Z&4
#

Aby otworzy strumie, uywamy funkcji  . Pobiera ona dwa parametry: nazw otwieranego pliku oraz tryb dostpu. Oto lista trybw dostpu.

Rozdzia 6. Podstawy programowania dla hakerw

235

Tryb

Opis

otwrz tylko do odczytu (plik musi istnie),

utwrz do zapisu; zastp, jeeli plik o podanej nazwie istnieje,

otwrz do doczania danych (dopisywania na kocu pliku); utwrz nowy plik,


jeeli plik o podanej nazwie nie istnieje,

H

otwrz istniejcy plik do odczytu i zapisu (plik musi istnie),

H

utwrz do odczytu i zapisu; zastp, jeeli istnieje,

H

otwrz do czytania i doczania danych; utwrz nowy plik, jeeli nie istnieje.

Aby okreli tryb tekstowy lub binarny, do opisu trybu mona doczy  lub . W przypadku pominicia tego znacznika strumie zostanie otwarty w trybie okrelanym
zmienn globaln )  . Odczyt i zapis danych do strumieni plikowych w trybie tekstowym wie si z konwersj podczas zapisu znaki CR i LF zamieniane s na pary
CR LF, a przy odczycie pary CR LF ulegaj zamianie na pojedynczy znak LF. Tego
rodzaju operacje nie s wykonywane w trybie binarnym.
Jeeli funkcja   nie bdzie moga otworzy pliku, zwrci w miejsce wskanika
warto 73.. (zdefiniowan w stdio.h). Poniszy program utworzy nowy plik dane.txt
i udostpni go do odczytu i zapisu:
< 
 20
  
"
T]Z&4#
 * 2

**H*#
$

Aby zamkn strumie, uywamy funkcji  , wymagajcej podania wskanika
do pliku.
 #

Jeeli podczas zamykania strumienia wystpi bd, funkcja   zwrci warto
niezerow (znacznik EOF End Of File). Do przesyania i odbierania danych ze
strumieni su cztery podstawowe funkcje:  , ,   i .
Funkcja   odczytuje pojedynczy znak z okrelonego strumienia wejciowego
(przeksztacany do liczby cakowitej):


T]Z&4#

Jej odwrotnoci jest , zapisujca pojedynczy znak do okrelonego strumienia


wyjciowego:



 T]Z&4#

Funkcja   odczytuje ze strumienia wejciowego cig:


4
4 
 T]Z&4#

236

Hack Wars. Na tropie hakerw

Odczyt zostaje przerwany po pobraniu    znakw lub znaku nowego
wiersza (rwnie wstawianego do tablicy). Do odczytanego cigu  doczany jest koczcy znak73..!
%
#? 
@A*A. W przypadku wystpienia bdw
funkcja zwraca 73...
Funkcja  zapisuje do strumienia cig zakoczony znakiem 73.. (inaczej A*A):


 
4 T]Z&4#

Wszystkie opisywane funkcje zwracaj w przypadku bdw warto 0B, (zdefiniowan w stdio.h) z wyjtkiem funkcji  , ktra w przypadku wystpienia bdu
zwraca 73... Poniszy program tworzy kopi pliku dane.dat, o nazwie dane.old, ilustrujc zarazem uycie wszystkich czterech funkcji:
< 
 20


"
T]Z&4#
T]Z&4
#
 * 
2 
***#
KYZZ
"

*+K 8
 E  
  2 
*#

!#
$

 * 2  **H*#

KYZZ
"

*+K 8
 E  2  *#

!#
$
349 
5 
 5  5
G43
348 
&LT43
> 



#
34M5
  43
 #
 
#

!#
$

W kolejnym przykadowym programie uywamy funkcji  do kopiowania tekstu


ze strumienia  (zazwyczaj oznacza to znaki wprowadzane z klawiatury) do nowego pliku dane.txt:
< 
 20


"

Rozdzia 6. Podstawy programowania dla hakerw

237

T]Z&4#


? !!@#
 * 2

**H*#

"



#



#
$
4

#
 #
$

Swobodny dostp do danych strumieni


Dostp swobodny do danych dostarczanych za porednictwem strumieni zapewnia
funkcja  # o prototypie:

T]Z&4  
 
#

Funkcja zmienia pozycj wskanika pliku skojarzonego ze strumieniem otwartym


wczeniej przez  . Wskanik ustawiany jest na    za (lub przed
w przypadku wartoci ujemnej) pozycj  . T ostatni moe by pocztek
pliku, biece pooenie wskanika lub koniec pliku. Pozycje te symbolizuj stae
/00C)/01, /00C)D32 i /00C)07E. Udan operacj  # sygnalizuje zwrcenie wartoci . Uzupenieniem  # jest funkcja  , zwracajca warto biecej pozycji wskanika pliku:
 

T]Z&4#

Funkcja zwraca pozycj wskanika pliku, okrelon jako ilo bajtw od pocztku
pliku, lub ; w przypadku bdu.

Uchwyty
Uchwyty plikw (handles) otwiera funkcja   o prototypie:

 4
 
 &?  @#

Udan operacj sygnalizuje zwrcenie numeru uchwytu. W pozostaych przypadkach


zwracane jest F. Na warto  
skadaj si poczone bitow operacj OR stae
symboliczne, odpowiadajce deklaracjom w pliku fcntl.h. Rni si one w zaleznoci
od kompilatora. Do typowych nale:
L(D99&KX

przed kadym zapisem wskanik pliku bdzie ustawiany na kocu pliku,

L(7[&D'

jeeli plik nie istnieje, zostanie utworzony,

L('[YK7

obcina istniejcy plik do dugoci 0 bajtw,

L(&)7Z

uywane w poczeniu z B)D20-1,

L(:]KD[b

otwiera plik w trybie binarnym,

L('&)'

otwiera plik w trybie tekstowym.

238

Hack Wars. Na tropie hakerw

Po przypisaniu uchwytu pliku za pomoc polecenia   mona korzysta z funkcji



 i "  . Prototyp
 jest nastpujcy:

 
%
   4   #

Funkcja podejmuje prb odczytu podanej liczby bajtw i zwraca liczb bajtw faktycznie pobranych przez uchwyt pliku. Odczytane dane umieszczane s w bloku pamici okrelonym parametrem . Funkcja   dziaa podobnie, nie rni si
rwnie jej prototyp i sposb generowania wartoci zwracanej. Zapisuje ona podan
ilo bajtw z okrelonego wskanikiem bloku pamici. Pliki otwierane funkcj
  zamykamy funkcj  :

 
%
 #

Funkcja   zwraca  w przypadku operacji udanej, a F w przypadku wystpienia bdw.


Dostp swobodny zapewnia funkcja  #, bardzo podobna do  #, ale pobierajca jako parametr numer uchwytu, a nie wskanik strumienia ,6.0. W poniszym
przykadzie wykorzystujemy uchwyt pliku do zapisu danych z  (czyli klawiatury) do nowego pliku o nazwie dane.txt:
<  20
< 
20
< +

20


"

 #


? !!@#
  * 2

*L([X,[/L(7[&D'/L('[YK7F(],[]'&#

"



#

 .




#
$
4

#
  #
$

Przegl*d funkcji plikowych


Norma ANSI definiuje zwizane z plikami operacje we-wy przy uyciu strumieni,
opisujc rnorodne funkcje. Prototyp funkcji   ma posta:
T]Z&4  
4
 
4#

Funkcja podejmuje prb otwarcia strumienia czcego z plikiem o podanej nazwie


w okrelonym trybie. Udana operacja koczy si zwrceniem wskanika typu ,6.0.
W przypadku niepowodzenia funkcji zwraca 73... Na wczeniejszych stronach przedstawiony zosta opis parametru .

Rozdzia 6. Podstawy programowania dla hakerw

239

Funkcja   suy do zamykania strumienia otwartego wczeniejszym wywoaniem  :

 T]Z&4#

Udana operacja   koczy si oprnieniem wszystkich buforw pliku i zwrceniem wartoci . W przypadku bdw zwracana jest warto 0B,.
Wiele komputerw korzysta z buforowanego dostpu do plikw. Oznacza to, e dane,
zapisywane do strumienia, wstpnie umieszczane s w pamici, a faktyczny zapis nastpuje dopiero po przekroczeniu pewnej granicznej iloci bajtw. Jeeli w czasie,
gdy dane nie zostay jeszcze faktycznie zapisane do strumienia, nastpi awaria zasilania, dane zostan utracone. Zabezpiecza przed tym funkcja , wymuszajca
zapisanie wszystkich danych oczekujcych:

 T]Z&4#

Jeeli wywoanie  jest udane, zwizane ze strumieniem bufory zostaj oprnione i zwracana jest warto . W przypadku bdw funkcja zwraca warto 0B,.
Kolejn funkcj jest   zwracajca lokalizacj wskanika pliku:
 

T]Z&4#

Funkcja zwraca przesunicie wskanika pliku w stosunku do pocztku pliku lub F.
w przypadku bdw. Przesunicie wskanika pliku do nowej pozycji umoliwia  #:

T]Z&4  
 
#

Funkcja podejmuje prb przesunicia wskanika pliku o  bajtw od pozycji


 , okrelonej jedn ze staych:
F&&\(F&'

pocztek pliku,

F&&\(7Y[

bieca pozycja wskanika pliku,

F&&\(&KX

koniec pliku.

Przesunicie ( ) moe by wartoci dodatni (przesuwanie wskanika w stron


koca pliku) lub ujemn (przesuwanie wskanika w stron pocztku pliku). Aby
szybko przenie wskanik do pocztku pliku i usun wczeniejsze odwoania do
bdw, C dostarcza funkcji ":
   T]Z&4#

Funkcja ta dziaa podobnie jak  #&.&/00C)/01. Jednak  # usuwa znacznik 0B,, a "
#" wszystkie sygnay bdw. Informacje o bdach funkcji plikowych mona pobra przy uyciu funkcji   :

 T]Z&4#

Funkcja zwraca warto niezerow, jeeli w okrelonym strumieniu wystpi bd. Po


sprawdzeniu wartoci    naley zadba o usunicie sygnaw bdw za pomoc funkcji 
:
  T]Z&4#

240

Hack Wars. Na tropie hakerw

Sprawdzenie, czy speniony jest warunek osignicia koca pliku, realizuje predefiniowane makro  :

 T]Z&4#

Makro zwraca warto niezerow, gdy dla danego strumienia stwierdzono osignicie
koca pliku. W pozostaych przypadkach zwracan wartoci jest .
Dostpnych jest kilka funkcji realizujcych odczyt danych ze strumienia plikowego.
Pojedyncze znaki mona odczytywa funkcj  :


T]Z&4#

  zwraca warto ASCII pobranego znaku lub znak 0B, w przypadku wystpienia bdu. Odczyt cigu danych umoliwia funkcja  , odczytujca cig zakoczony znakiem nowego wiersza:
4
' 

T]Z&4#

W wyniku udanego wywoania funkcji w zmiennej  umieszczany jest cig zakoczony znakiem nowego wiersza lub zawierajcy  znakw. Funkcja zachowuje
koczcy cig znak nowego wiersza, doczajc do cigu  bajt 73... W przypadku
nieudanego wywoania zwracany jest wskanik pusty. Cigi zapisujemy do strumienia funkcj :


 
4 T]Z&4#

Funkcja  zapisuje wszystkie znaki cigu , z wyjtkiem kocowego bajtu


73.., do strumienia 
. Standardowo funkcja zwraca ostatni zapisany znak, a w przypadku wystpienia bdw 0B,. Dostpna jest rwnie funkcja zapisujca do strumienia pojedynczy znak :



 T]Z&4#

Funkcja zwraca zapisany znak lub, w przypadku wystpienia bdw, znak 0B,.
Aby odczyta ze strumienia duy blok danych lub rekord, mona posuy si funkcj

:
(
   4(
 (

T]Z&4#

Funkcja podejmuje prb odczytu  elementw, z ktrych kady ma dugo  ,


ze strumienia plikowego 
do bloku pamici okrelonego wskanikiem
. Aby
ustali, czy operacja przebiega bez zakce, korzystamy z funkcji   .
Siostrzan funkcj 
 jest "  :
(

 
  4(
 (

T]Z&4#

Funkcja zapisuje  elementw o dugoci   z obszaru pamici okrelonego


wskanikiem
 do strumienia 
.
Funkcja 
 umoliwia odczyt danych formatowanych:

T]Z&4 
4? 222@#

Rozdzia 6. Podstawy programowania dla hakerw

241

Funkcja zwraca liczb faktycznie odczytanych pl, a 0B, w przypadku koca pliku.
Poniszy przykad ilustruje uyteczno funkcji 
 podczas odczytywania ze
strumienia liczb:
< 
 20
  
"
T]Z&4#

#

 #

#

 #

#


? !!@#
 * 2

**H*#
>
"
 *K 8
 E *#

!#
$

* 1A`I+*, +**#
 #
 
"

*:;C 
 *
#

 #
$
 #
 
"

*:;C 5 
 *
#

 #
$
*- - - - - -*.. .. .

#
 
"

*:;C  

 *
#

 #
$

*+T 5G;- - - - - -*  

#
$

Jak atwo zauway, zapis formatowanych danych realizuje funkcja  . Gdy
pojawia si potrzeba zapisania pooenia wskanika pliku i pniejszego jego przywrcenia, mona skorzysta z funkcji   i  . Pierwsza z nich odczytuje biec pozycj wskanika pliku:


 T]Z&4 (
4 #

242

Hack Wars. Na tropie hakerw

Funkcja   ustawia wskaniki pliku na okrelonej pozycji:




 T]Z&4 
 (
4 #

Typ ) zdefiniowany zosta w nagwku stdio.h. Funkcje te s wygodniejsze


w uyciu ni   i  #.
Z otwartym ju strumieniem mona skojarzy nowy plik. Umoliwia to funkcja   :
T]Z&4  
4
 
4T]Z&4#

Funkcja zamyka strumie istniejcy i podejmuje prb jego ponownego otwarcia przy
uyciu podanej nazwy pliku. Znajduje to zastosowanie przy przekierowywaniu strumieni predefiniowanych ,  i  do pliku lub urzdzenia. Przykadowo, gdy pojawia si potrzeba przekierowania wszystkich danych wyjciowych kierowanych do  na drukark, mona uy polecenia:
 *Z9' ***

#

Predefiniowane strumienie we-wy


Wstpnie zdefiniowane zostay trzy strumienie we-wy: ,  i  . Domylnie  i  odpowiadaj klawiaturze i monitorowi. Na wielu platformach,
w tym systemw DOS i UNIX, dostpna jest moliwo ich przekierowania. Strumie  domylnie powizany jest z monitorem (wywietlaczem). Praktyka jego
przekierowywania nie jest raczej stosowana. Jego podstawowym zadaniem jest zapewnienie moliwoci wywietlania komunikatw bdw, nawet w sytuacji gdy powizanie standardowego wyjcia () zostao zmienione:

*\  
  ;6 *
#

Funkcje   i  przekazuj dane do strumienia . Funkcje 



i  pobieraj dane ze strumienia . Przekierowanie tych strumieni zmienia
sposb dziaania funkcji.
Jako przykad plikowych operacji we-wy na platformie PC, korzystajcych z moliwoci przekierowania strumieni, przedstawimy prosty program przesyajcy do strumienia  zawarto okrelonego pliku, przedstawion jako wartoci szesnastkowe. Polecenie w postaci:
( 20 (5B 2

pozwoli zmieni domylne powizanie strumienia  z monitorem.


< 
 20
< 
20
<  20
< 
20

4?@
"
  #
   ?1!@#

 #

#

#

Rozdzia 6. Podstawy programowania dla hakerw


>1
"

*+:cdX29 ;  ;S  +*
#

 #
$
  ? @L([XLKZb#
  
"


*+:cdX2K 8
 E-+*? @#

 #
$



*+MD,D['Lef9Z]\Y-++*
 ? @#
!#
 
"
34,;  43

 !1!#
349      43
(  .  W#
34!
&LT   ;C 43
 
 #
34,  V 
 43



*-!W -!I*#
H W#
34,  V
 
B 5
G  43
 !# W#HH



*-!1* ?@#
34,  V
BDF7]] 5
G  43
 !# W#HH
"
 ?@0A .. ?@ 1^



*-* ?@#


*2*

#
$
34M _  43

*+*

#
$
34 _ 43

!#
$

243

244

Hack Wars. Na tropie hakerw

Ci"gi
Jzyk C naley do najlepiej wyposaonych w funkcje obsugi cigw pord uniwersalnych jzykw programowania. Cig to jednowymiarowa tablica znakw zakoczona bajtem zerowym. Cigi mona inicjowa dwoma sposobami. Pierwszym jest
nadanie im staej wartoci w kodzie programu:


"
4*F
I*#
?@*9 

*#

!#
$

Drugi to utworzenie cigu w czasie wykonywania programu za pomoc funkcji  %:


4
4   
4"#

Funkcja  % kopiuje cig rdowy do lokalizacji docelowej, na przykad:


< 
 20


"
?I!@#

*FF 
*#

*+,
BEC UU
-*#

!#
$

Jzyk C umoliwia bezporedni dostp do kadego bajtu cigu:


< 
 20


"
?I!@#

*FF 
*#

*+,
BEC UU
-*#
34M
C  5

CUU43
?!@UU#

*+,
BEC UU
-*#

!#
$

Niektre kompilatory C wyposaone zostay w funkcje konwersji cigw do wielkich


i maych liter, nie obejmuje ich jednak norma ANSI. W specyfikacji pojawiaj si za
to funkcje   i " , zwracajce pojedynczy znak ( w postaci wartoci )
zamieniony na liter wielk lub ma. atwo na tej podstawie utworzy wasne funkcje konwersji cigw:

Rozdzia 6. Podstawy programowania dla hakerw

245

< 
 20
  
 4  
"
4#
  #
4
"
40gN..4 11
4
4#
HH#
$
$
  
4  
"
4#
  #
4
"
40WI..4g!
4
 4#
HH#
$
$


"
?I!@#

*FF 
*#

*+,
BEC UU
-*#

 #

*+,
BEC UU
-*#

#

*+,
BEC UU
-*#

!#
$
'  ;
2T 5

 
 C
;
 5C55
 
EVG ; 2\ 5 6     
56   
B A1 
5
G8 6    5C
 
;2aB 
 5
 6 5 8
C
C 5 86  2,
  hFi 
 
hAi2, 5

 
  ; 6 
;
2S
4
"
40gN..4 11
4
4#
HH#

246

Hack Wars. Na tropie hakerw


$

4
"
40WI..4g!
4
 4#
HH#
$
X 
   
; 92:22

W przeciwiestwie do innych jzykw programowania C nie narzuca ograniczenia dugoci cigu. Jednak w przypadku niektrych procesorw (CPU) pojawia si ograniczenie wielkoci bloku pamici. Oto prosty program odwracajcy kolejno znakw w cigu:
< 
 20
< 
20
4
4
"
34L  5 BEGC   
5C5 43
34 _ KYZZ43
4 #
4 #

#
34Y
VU U 

C 43
 H
 #
34M V  C
 C 43
 #
34M43
 0
"

4 #
4 4#
4
#
 #
HH#
$

 #
$
  
"


? !!@#
4#



*' 5
C*#



#

*+-*#
$

Rozdzia 6. Podstawy programowania dla hakerw

247

strtok()
Funkcja  # jest istotn funkcj jzyka C, suc do wyczania fragmentw
cigu. Stosuje si j, gdy poszczeglne podcigi rozdzielone s znanymi ogranicznikami, na przykad przecinkami:
< 
 20
< 
20
  
"
 ?I!@#
4#

 *7M&[,LKb9LJD[Dj7ML,bklc'bM]&ZLKbK]&:]&F\]*#


 **#

"

#


KYZZ**#
$#
$

Program mona oprze te na ptli  :


< 
 20
< 
20
  
"
 ?I!@#
4#

 *7M&[,LKb9LJD[Dj7ML,bklc'bM]&ZLKbK]&:]&F\]*#
 

 **##

KYZZ**
"

#
$#
$

W pierwszym wywoaniu funkcji  # podajemy nazw zmiennej cigu oraz


ogranicznik. Funkcja zwraca wwczas wskanik do pocztku pierwszego podcigu
i zastpuje pierwszy ogranicznik zerem. Kolejne wywoania  # wykonywane s
w ptli. Pierwszym parametrem jest wwczas 73.., a funkcja zwraca kolejne podcigi. Poniewa dopuszczalne jest podanie listy ogranicznikw, funkcja  # moe
posuy do utworzenia prostego programu zliczajcego sowa:
< 
 20
< 
 20
< 
20
  
4?@
"
T]Z&4#
  ?1IW@#

248

Hack Wars. Na tropie hakerw


4#
 #
>1
"

*+:cdX29 ;  ;S  
 +*
#

!#
$
34L
G  
43
 ? @**#
34F V 
;

43
>
"

*+:cdX2K 8
 E VG ;  +*
#

!#
$
34]5 543
!#

"
34L 
5  43

  1II#
34F V
C; ;C  &LT43
 // 
 
 #
34M;   43
34F; G865 
   43
34+

 + #S2>R543


  *+
+#S2>R*#

"
HH#


KYZZ*+
+#S2>R*#
$
$
> ..> #
34L 
 _ 2:;C R43
 
"

*+:;C   VG ;  +*
#
 #

!#
$
34L 
 _  &LT43
34,   6;G43

*+9-- ;G; +*? @#
 #
$

Rozdzia 6. Podstawy programowania dla hakerw

249

Zamiana liczb na ci*gi i ci*gw na liczby


Wszystkie kompilatory C zapewniaj moliwo konwertowania liczb na cigi przy
uyciu takich funkcji jak  . Funkcja ta ma jednak wiele zastosowa, co powoduje, e jest rozbudowana i mao wydajna. Moe j zastpowa funkcja 61B/,
korzystajca z dwch parametrw: liczby cakowitej ze znakiem i wskanika do cigu
znakowego. Funkcja kopiuje liczb do okrelonego wskanikiem miejsca w pamici.
Podobnie jak  , funkcja 61B/ nie sprawdza, czy cig docelowy ma wystarczajc do przechowania wyniku konwersji dugo. Oto przykadowa funkcja, ktra
kopiuje liczb    do cigu znakowego.
  ]'LF 4

"
34M_ 6
C 6; 
CCG43
 
?g@" !!!!!!!! !!!!!!! !!!!!! !!!!! !!!! !!! !! ! $#

#
34F V43
!
"
4
HHUU#
34M_
BE 6 C43
!#
$
 !#g#HH
"
0
?@
"
4
HHU!UH3
?@#
-
?@#
$
$
4
U+!U#
 _;_     ; 
 
 
  68 
 
 592:2

#
$
9 8  ; ;   5 5 5C6
29 85 
   C C5692:2S
  ]'LF 4

"
34M_ 6
C 6; 
CCG43
 
?g@" !!!!!!!! !!!!!!! !!!!!! !!!!! !!!! !!! !! ! $#

#

!#33
   C
 C
34F V43
!
"
4
HHUU#
HH#
34M_
BE 6 C43
!#
$

250

Hack Wars. Na tropie hakerw


 !#g#HH
"
HH#
4
HHU!UH3
?@#
-
?@#
$
4
U+!U#


#33 G
V C
C
!#
4
UU33 6  C
 5B5


HH#
4
U!U"33 5 C
 
HH#

HH#
$
4
>U+!U"
4
4
#33C 5 8  C


HH#
$
4
U+!U#

#
$

Jzyk C oferuje dwie funkcje do zamiany cigw znakowych na liczby zmiennoprzecinkowe:


 i  . Prototyp funkcji
 ma posta:

 
4 #

a prototyp funkcji  :




 
4 44
#

Obie funkcje przegldaj cig i przeprowadzaj konwersj a do momentu natrafienia


na niezrozumiay znak. Rnica midzy nimi polega na tym, e   pobiera dodatkowy parametr, wskanik 
ustawiany na pierwszy znak cigu, ktry nie zosta
objty konwersj. Znacznie zwiksza to wygod sprawdzania poprawnoci wykonania operacji.
Aby zamieni cig na warto cakowit, mona uy funkcji
:


 
4 #

Naley pamita, e funkcja


 nie zapewnia adnej kontroli przepenienia zmiennej. Nie jest zdefiniowana warto zwracana w takiej sytuacji. W podobny sposb
dziaa funkcja
, zwracajca warto  . Odpowiedniki z dodatkowym parametrem nosz nazwy   i  .

Obsuga tekstu
Czowiek zapisuje informacje jako pewien tekst, zoony ze sw, liczb i znakw
przestankowych. Sowa zoone s z liter wielkich i maych, odpowiednio do wymaga gramatyki. Wszystko to sprawia, e komputerowe przetwarzanie tekstu nie jest

Rozdzia 6. Podstawy programowania dla hakerw

251

zadaniem prostym. Norma ANSI definiuje wiele funkcji przetwarzania cigw znakowych, ktre z natury rozpoznaj wielko liter. Oznacza to, e litera A rozpoznawana jest jako rna od a. Jest to pierwsze zagadnienie, ktrego rozwizanie
musi znale programista pracujcy nad programem przetwarzajcym tekst. Na szczcie, zarwno kompilatory Borlanda, jak i Microsoftu wyposaone zostay w funkcje
obsugi cigw, ktre nie rozpoznaj wielkoci liter.
Tak odmian funkcji    jest   , a      . Gdy jednak pojawia si kwestia przenonoci kodu, niezbdna jest zgodno z ANSI C, co
pociga za sob napisanie wasnych funkcji.
Poniej przedstawiamy prost implementacj nierozrniajcej wielkoci liter odmiany funkcji   . Tworzy ona kopie cigw, zamienia je na wielkie litery i wykonuje standardow operacj   . Pozwala to okreli poszukiwan warto przesunicia i utworzy wskanik do cigu rdowego.
4

4 41
"
 ? !!!@#
1? !!!@#
4#

  #

11#

  #

 1#


 1#


 H #

KYZZ#
$

Kolejna funkcja przeglda cig , wyszukujc sowo podane jako G. Aby funkcja
zwrcia warto 1230, znalezione musi zosta odrbne sowo, a nie jedynie sekwencja znakw. Wykorzystujemy przygotowan wczeniej funkcj   .

  (4 41
"
34
BE C5815
; 
 43
4#
4m#

 #
 !#
m #

"
34Z  5
C5G1 43


m1#

"

252

Hack Wars. Na tropie hakerw


34M 43
  #
0 
"
34F V  C43
4 0UDU..4 UU
 !#
$
34K 5 C 43
H
1#
4
"
34F V C43
40UDU..4UU
 !#
$
$
m#
$
..> #

 #
$

Szerokie zastosowanie znajdzie kilka dalszych prostych funkcji znakowych.   


obcina cig znakowy:
  
 
4
 
"
34L U UGC UU43
 

?
 @!#
$

   usuwa kocowe znaki spacji (odstpu midzywyrazowego) w cigu:


  
4


"
34  5 _ 43
4#
.

?


 @#
4A1..0


4!#
$

   zmienia dugo cigu:


  
4
 
"
34M ;  BEC  ;C5C   5C43
 0!
 H 
H #

"

Rozdzia 6. Podstawy programowania dla hakerw

253

 ! #
 H 
H #
$
$

  umieszcza jeden cig w innym:


  
44m
"
34,
Cm C 43


m#

m
m#
$

   zastpuje wszystkie wystpienia pewnego podcigu innym podcigiem:


  
4 4 41
"
34M
6 5

C C143
4#
 #

"
 !#


  #

"
34Y _C 43

!
 #
34,
C43

1#
  #
$
$
 #
$

Data i godzina
Jzyk C wyposaony jest w funkcj  , ktra odczytuje zegar systemowy komputera i podaje informacj o dacie i godzinie w postaci liczby sekund, ktra upyna
od pnocy 1 stycznia 1970 roku. Warto ta moe zosta zamieniona na czytelny dla
czowieka cig znakw za pomoc funkcji  :
< 
 20
< 
20


"
34F
 
   
 
243

(

#
349  
6 6
 43


KYZZ#

*:8C 
 S-+*
.
#
$

254

Hack Wars. Na tropie hakerw

Na cig zwracany przez   skada si siedem pl:


J dzie tygodnia,
J miesic roku,
J dzie miesica,
J godzina,
J minuty,
J sekundy,
J rok.

Uzupenieniem jest znak nowego wiersza i kocowe 0. Poniewa pola maj sta szeroko, cig zwracany przez   idealnie nadaje si do operacji wymagajcych
wyodrbnienia elementw daty lub godziny. W poniszym programie definiujemy
struktur !
oraz funkcj   !) ! , ktrej zadaniem jest wypenienie
struktury treci pl cigu  :
< 
 20
< 
20
< 
20

 
 
"

(#34J
43

( #34% 43

(#34F  43
$#
   ( 
 
 4

"

(

#

?1W@#
4
#
349  
6 6
 43


KYZZ#
349 
 
6 6 
C 43



.
#
34L 
5 

 43

? g@!#

.
? @#
349 5C  5
 
 
43

*-1 S-1 S-1 *.
0( .
0(.
0(#
$


"

Rozdzia 6. Podstawy programowania dla hakerw

255


 
 
#
 ( .
#

*+a
 -!1 S-!1 S-!1 *.
2( .
2(.
2(#
$

Norma ANSI przewidziaa rwnie funkcj konwertujc warto zwracan przez


funkcj   do postaci struktury. Przedstawiony poniej przykad zawiera deklaracj struktury  z nagwka  +:
< 
 20
< 
20


"

(

#

 

4
#
349  
43


KYZZ#
34M_
BE

 
6
43

 
.
#

*+a
 -!1 S-!1 S-!1 *
0
( 
0
(
0
(#

!#
$

Struktura  (zawarta w pliku   ) ma nastpujc posta:



 


"


(#


(#


( #


( #


( #


(#


( #


( #


( 
#
$#
'
 
 8 E6BC  5
    5
5 8
   ;G 2,
5
5 
B
 ;C 2
J 85C 
E
5  

G ;G6 
BE
 6I 92:2

Liczniki czasu
Programy czsto korzystaj z moliwoci pobrania daty i czasu z nieulotnej pamici
RAM komputera. Norma ANSI przewiduje kilka rnych funkcji, ktre mog zosta
do tego celu wykorzystane. Pierwsz jest funkcja  , zwracajca liczb sekund od
1 stycznia 1970 roku:

(


(
4 #

256

Hack Wars. Na tropie hakerw

Funkcja wypenia przekazan jej jako parametr zmienn typu  ) jeli nie jest to
73.., zwracajc t sam warto rwnie jako warto wyjciow. Mona wic wywoywa funkcj   z parametrem 73.. i korzysta z wartoci zwracanej:
< 
20
  
"

(

#


KYZZ#
$

Funkcja
  zamienia struktur  na 26-znakowy cig (przedstawiony przy
opisie funkcji  ):
4
 

 

4 #

Funkcja   zamienia warto czasu (zwracan przez  ) na 26-znakowy cig:
< 
 20
< 
20
< 
20
  
"

(

#
 
?A!@#


KYZZ#

 

.
#
$

Kolejna funkcja,  , zwraca, liczon w sekundach, rnic midzy dwoma
wartociami typu  ). Suy wic do wyznaczania iloci czasu, jaki upyn midzy dwoma zdarzeniami, czasu wykonywania funkcji lub generowania przerw w pracy programu, na przykad:
< 
 20
< 
20
  X&ZDb
 
"

(
 #
 
KYZZ#

KYZZ H 
#
$
  
"

*+[   222I  *#
X&ZDbI#

*+L _ 2*#
$

Rozdzia 6. Podstawy programowania dla hakerw

257

Funkcja   zamienia lokaln warto czasu  ) na warto GMT o postaci


struktury  . Dziaanie tej funkcji zaley od ustawienia globalnej zmiennej strefy czasowej. Struktura  zostaa wstpnie zdefiniowana w nagwku  +. Przedstawilimy j kilka stron wczeniej.

 


"


(#


(#


( #


( #


( #


(#


( #


( #


( 
#
$#

Element struktury  ) 
% przechowuje dzie miesica (od 1 do 31), a  )"
% dzie
tygodnia (gdzie niedzieli odpowiada 0). Czas jest mierzony od 1900 roku. Warto
 ) to znacznik, ktry informuje o tym, czy stosowany jest czas letni. Stosowane nazwy struktury i jej elementw mog rni si w zalenoci od kompilatora,
jednak sama struktura zasadniczo pozostaje niezmieniona.
Funkcja #  zamienia struktur  na warto  ), uzupeniajc wartoci pl
 )"
% i  )%
%:

(


 

4#

W kolejnym przykadzie umoliwiamy wprowadzanie daty i uywamy funkcji # 


do ustalenia dnia tygodnia. Naley pamita, e funkcje zwizane z czasem rozpoznaj wycznie daty pniejsze ni 1 stycznia 1970:
< 
 20
< 
20
< 
20
  
"

 



 
#

 #
 
? !!@#
4#
4 ?@
"* **  ;**
**B **
**C
**
**
  gN!*$#

"
 !#

*+,  V 
6  33*#

 
g
#


 
*3*#
>KYZZ


 
2
( 
#

 
 #

258

Hack Wars. Na tropie hakerw




KYZZ*3*#
>KYZZ


 
2
( 
#

 
 #


KYZZ*3*#
>KYZZ


 
2
(
#

 
 #
  #
$
> #


 
2
( !#


 
2
(!#


 
2
( #


 
2
( 
 #
34' 
 _
 43

.

 
 


 
2
( N#

*' _
-+* ?

 
2
( @#
$

Funkcja #  zapewnia rwnie wprowadzenie odpowiednich poprawek dla wartoci przekraczajcych swj dopuszczalny zakres. Mona to wykorzysta do ustalenia dokadnej daty, odlegej o  dni:
< 
 20
< 
20
< 
20
  
"

 

4

 
#

(
 5#
 5
KYZZ#


 
 
. 5#


 
0
( H !#



 
#


 
0
(0gg



 
0
(- !!#

  5CB
  ;6       5
 ;C;    g!!5
 ; 8 gg
92:2

*M 6E  6 -!1 3-!1 3-!1 +*

 
0
( 

 
0
( H
  

 
0
(#
$

You might also like