Вы находитесь на странице: 1из 393

Äæåéìñ Ñ.

Ôîñòåð
ïðè ó÷àñòèè Ìàéêà Ïðàéñà

Техника взлома:
сокеты, эксплойты, shеllкод
Серия «Информационная безопасность»

Москва, 2006
УДК 004.2
ББК 32.973.26018.2
Ф81
Содержание
Ф81 Äæåéìñ Ôîñòåð, ïðè ó÷àñòèè Ìàéêà Ïðàéñà Благодарности ......................................................................................... 23
Техника взлома: сокеты, эксплойты, shellкод: Пер. с англ. Слинкина А. А. – Об авторе ................................................................................................. 24
М.: ДМКпресс, 2006. – 784 с.: ил. (Серия «Информационная безопасность»).
Об основном соавторе ............................................................................ 25
ISBN 5970600199
Прочие соавторы, редакторы и авторы кода ..................................... 26
 ñâîåé íîâîé êíèãå Äæåéìñ Ôîñòåð, àâòîð ðÿäà áåñòñåëëåðîâ, âïåð- Об авторе предисловия .......................................................................... 28
âûå îïèñûâàåò ìåòîäû, êîòîðûìè ïîëüçóþòñÿ õàêåðû äëÿ àòàê íà îïå-
ðàöèîííûå ñèñòåìû è ïðèêëàäíûå ïðîãðàììû. Îí ïðèâîäèò ïðèìåðû Предисловие ............................................................................................. 29
ðàáîòàþùåãî êîäà íà ÿçûêàõ C/C++, Java, Perl è NASL, â êîòîðûõ èëëþ- Íàñòóïèò ëè «ñóäíûé äåíü»? ............................................................................. 29
ñòðèðóþòñÿ ìåòîäû îáíàðóæåíèÿ è çàùèòû îò íàèáîëåå îïàñíûõ àòàê.
Глава 1. Написание безопасных программ ......................................... 31
 êíèãå ïîäðîáíî èçëîæåíû âîïðîñû, ðàçáèðàòüñÿ â êîòîðûõ íàñóùíî
íåîáõîäèìî ëþáîìó ïðîãðàììèñòó, ðàáîòàþùåìó â ñôåðå èíôîðìà- Ââåäåíèå ............................................................................................................... 32
öèîííîé áåçîïàñíîñòè: ïðîãðàììèðîâàíèå ñîêåòîâ, shell-êîäû, ïåðåíî- C/C++ .................................................................................................................... 33
ñèìûå ïðèëîæåíèÿ è ïðèíöèïû íàïèñàíèÿ ýêñïëîéòîâ Õàðàêòåðèñòèêè ÿçûêà ...................................................................................... 34
ßçûê C ........................................................................................................ 34
ßçûê C++ .................................................................................................... 35
Áåçîïàñíîñòü ............................................................................................... 35
Ïðèìåð «Çäðàâñòâóé, ìèð!» ............................................................................. 36
Òèïû äàííûõ .................................................................................................... 37
Ïîòîê óïðàâëåíèÿ ........................................................................................... 40
Ôóíêöèè ........................................................................................................... 41
УДК 004.2 Êëàññû (òîëüêî C++) ....................................................................................... 42
ББК 32.973.26018.2 Ïðèìåð: ðÿäû Ôóðüå ....................................................................................... 44
ßçûê Java .............................................................................................................. 48
Original English language edition published by Syngress Publishing, Inc. Copyright © 2005 by
Syngress Publishing, Inc. All rights reserved. Õàðàêòåðèñòèêè ÿçûêà ...................................................................................... 49
Все права защищены. Любая часть этой книги не может быть воспроизведена в какой
Îáúåêòíî-îðèåíòèðîâàííûå âîçìîæíîñòè .............................................. 49
бы то ни было форме и какими бы то ни было средствами без письменного разрешения вла Ïëàòôîðìåííàÿ íåçàâèñèìîñòü ................................................................. 49
дельцев авторских прав. Ìíîãîïîòî÷íîñòü ....................................................................................... 49
Материал, изложенный в данной книге, многократно проверен. Но поскольку вероятность
технических ошибок все равно существует, издательство не может гарантировать абсолютную Áåçîïàñíîñòü ............................................................................................... 50
точность и правильность приводимых сведений. В связи с этим издательство не несет ответ Äîïîëíèòåëüíûå âîçìîæíîñòè ................................................................. 50
ственности за возможные ошибки, связанные с использованием книги.
Ïðèìåð «Çäðàâñòâóé, ìèð!» ............................................................................. 50
Òèïû äàííûõ .................................................................................................... 51
ISBN 1-597490-05-9 (àíãë.) Copyright © 2005 by Syngress Publishing, Inc.
Ïîòîê óïðàâëåíèÿ ........................................................................................... 52
ISBN 5-9706-0019-9 © Ïåðåâîä íà ðóññêèé ÿçûê, îôîðìëåíèå, èçäàíèå,
Èçäàòåëüñêèé Äîì ÄÌÊ-ïðåññ, 2006 Ìåòîäû ............................................................................................................. 54
6 Техника взлома: сокеты, эксплойты и shell!код Содержание 7

Êëàññû ............................................................................................................... 54 Глава 2. Язык сценариев NASL ............................................................ 107


Ïîëó÷åíèå çàãîëîâêîâ HTTP ............................................................................ 57 Ââåäåíèå ............................................................................................................. 108
ßçûê C# ................................................................................................................ 59 Èñòîðèÿ .......................................................................................................... 108
Îñíîâàíèÿ äëÿ ïåðåõîäà íà C# ......................................................................... 59 Íàçíà÷åíèå NASL .......................................................................................... 109
Õàðàêòåðèñòèêè ÿçûêà ...................................................................................... 60 Ïðîñòîòà è óäîáñòâî ................................................................................ 109
Îáúåêòíî-îðèåíòèðîâàííûå âîçìîæíîñòè .............................................. 60 Ìîäóëüíîñòü è ýôôåêòèâíîñòü ................................................................ 109
Ïðî÷èå âîçìîæíîñòè ................................................................................. 61 Áåçîïàñíîñòü ............................................................................................. 110
Áåçîïàñíîñòü ............................................................................................... 61 Îãðàíè÷åíèÿ NASL ................................................................................... 110
Ïðèìåð «Çäðàâñòâóé, ìèð!» íà ÿçûêå C# ........................................................ 62 Ñèíòàêñèñ ÿçûêà NASL ..................................................................................... 110
Òèïû äàííûõ .................................................................................................... 62 Êîììåíòàðèè ............................................................................................ 110
Ïîòîê óïðàâëåíèÿ ........................................................................................... 64 Ïðèìåð ïðàâèëüíîãî êîììåíòàðèÿ ................................................... 110
Ìåòîäû ............................................................................................................. 66 Ïðèìåðû íåïðàâèëüíûõ êîììåíòàðèåâ ............................................ 111
Êëàññû ............................................................................................................... 66 Ïåðåìåííûå .............................................................................................. 111
Ïîòîêè â ÿçûêå C# ........................................................................................... 69 Öåëûå ÷èñëà ......................................................................................... 111
Ïðèìåð: ðàçáîð IP-àäðåñà, çàäàííîãî â êîìàíäíîé ñòðîêå ........................... 70 Ñòðîêè .................................................................................................. 111
Ìàññèâû ............................................................................................... 111
ßçûê Perl .............................................................................................................. 79
NULL .................................................................................................... 113
Òèïû äàííûõ .................................................................................................... 80
Áóëåâñêèå âåëè÷èíû ........................................................................... 113
Îïåðàòîðû ........................................................................................................ 82 Îïåðàòîðû ................................................................................................ 113
Ïðèìåð Perl-ñöåíàðèÿ ...................................................................................... 84 Îïåðàòîðû âíå êàòåãîðèè .................................................................. 113
Àíàëèç ......................................................................................................... 85 Îïåðàòîðû ñðàâíåíèÿ ......................................................................... 114
Ñïåöèàëüíûå ïåðåìåííûå .............................................................................. 86 Àðèôìåòè÷åñêèå îïåðàòîðû .............................................................. 114
Ñîïîñòàâëåíèå ñ îáðàçöîì è ïîäñòàíîâêà ...................................................... 87 Îïåðàòîðû ðàáîòû ñî ñòðîêàìè ........................................................ 115
Ìîäèôèêàòîðû ðåãóëÿðíûõ âûðàæåíèé ........................................................ 88 Ëîãè÷åñêèå îïåðàòîðû ........................................................................ 115
Êàíîíè÷åñêèå èíñòðóìåíòû, íàïèñàííûå íà Perl .......................................... 88 Ïîáèòîâûå îïåðàòîðû ........................................................................ 116
ß óìåþ ïèñàòü íà Perl! ...................................................................................... 89 Îïåðàòîðû ñîñòàâíîãî ïðèñâàèâàíèÿ â ñòèëå C ............................... 116
Êàíîíè÷åñêàÿ àòàêà íà Web-ñåðâåð ............................................................ 89 Óïðàâëÿþùèå êîíñòðóêöèè ..................................................................... 117
Àíàëèç ......................................................................................................... 90 Èíñòðóêöèè if ....................................................................................... 117
Óòèëèòà ìîäèôèêàöèè ôàéëà ïðîòîêîëà ......................................................... 90 Öèêëû for .............................................................................................. 117
Ðåçóëüòàò âûïîëíåíèÿ ................................................................................ 93 Öèêëû foreach ....................................................................................... 118
Àíàëèç ......................................................................................................... 94 Öèêëû while ......................................................................................... 118
Öèêëû repeat-until ............................................................................... 118
ßçûê Python ........................................................................................................ 96
Èíñòðóêöèÿ break ................................................................................ 118
Ïàêåò Inl ineEgg ................................................................................................. 96
Ïîëüçîâàòåëüñêèå ôóíêöèè ............................................................... 119
Àíàëèç ......................................................................................................... 98
Âñòðîåííûå ôóíêöèè .......................................................................... 120
Àíàëèç ......................................................................................................... 99
Èíñòðóêöèÿ return ............................................................................... 120
Ðåçþìå ................................................................................................................ 101
Íàïèñàíèå ñöåíàðèåâ íà ÿçûêå NASL .......................................................... 120
Îáçîð èçëîæåííîãî ìàòåðèàëà ..................................................................... 103 Íàïèñàíèå ñöåíàðèåâ äëÿ ëè÷íîãî ïîëüçîâàíèÿ ........................................ 121
Ññûëêè íà ñàéòû ................................................................................................ 104 Ñåòåâûå ôóíêöèè ..................................................................................... 121
×àñòî çàäàâàåìûå âîïðîñû ............................................................................ 105 Ôóíêöèè, ñâÿçàííûå ñ ïðîòîêîëîì HTTP ................................................ 121
8 Техника взлома: сокеты, эксплойты и shell!код Содержание 9

Ôóíêöèè ìàíèïóëèðîâàíèÿ ïàêåòàìè ..................................................... 121 Êîìïèëÿöèÿ ................................................................................................... 160


Ôóíêöèè ìàíèïóëèðîâàíèÿ ñòðîêàìè ..................................................... 122 Ïðèìåð èñïîëíåíèÿ ....................................................................................... 160
Êðèïòîãðàôè÷åñêèå ôóíêöèè ................................................................. 122 Àíàëèç ............................................................................................................. 161
Èíòåðïðåòàòîð êîìàíä NASL .................................................................. 122 Êîìïèëÿöèÿ ................................................................................................... 163
Ïðèìåð ................................................................................................. 122 Ïðèìåð èñïîëíåíèÿ ....................................................................................... 163
Ïðîãðàììèðîâàíèå â ñðåäå Nessus ............................................................... 124 Àíàëèç ............................................................................................................. 163
Îïèñàòåëüíûå ôóíêöèè ........................................................................... 124
Êîìïèëÿöèÿ ................................................................................................... 165
Ôóíêöèè, îòíîñÿùèåñÿ ê áàçå çíàíèé ............................................... 124
Ïðèìåð èñïîëíåíèÿ ....................................................................................... 165
Ôóíêöèè èçâåùåíèÿ î ðåçóëüòàòàõ ðàáîòû ....................................... 125
Àíàëèç ............................................................................................................. 165
Ïðèìåð ................................................................................................. 125
Îïöèè ñîêåòîâ .................................................................................................. 166
Ïðèìåð: êàíîíè÷åñêèé ñöåíàðèé íà ÿçûêå NASL ....................................... 127
Àíàëèç ............................................................................................................. 168
Ïåðåíîñ íà ÿçûê NASL è íàîáîðîò ............................................................... 131
Ñêàíèðîâàíèå ñåòè ñ ïîìîùüþ UDP-ñîêåòîâ ............................................ 169
Ëîãè÷åñêèé àíàëèç ......................................................................................... 131
Êîìïèëÿöèÿ ................................................................................................... 176
Ëîãè÷åñêàÿ ñòðóêòóðà ïðîãðàììû ............................................................ 131
Ïñåâäîêîä ................................................................................................. 132 Ïðèìåð èñïîëíåíèÿ ....................................................................................... 176
Ïåðåíîñ íà NASL ...................................................................................... 133 Àíàëèç ............................................................................................................. 177
Ïåðåíîñ íà NASL ñ C/C++ ........................................................................ 134 Ñêàíèðîâàíèå ñåòè ñ ïîìîùüþ TCP-ñîêåòîâ ............................................. 178
Ïåðåíîñ ñ ÿçûêà NASL .............................................................................. 140 Êîìïèëÿöèÿ ................................................................................................... 188
Ðåçþìå ................................................................................................................ 142 Ïðèìåð èñïîëíåíèÿ ....................................................................................... 188
Îáçîð èçëîæåííîãî ìàòåðèàëà ..................................................................... 143 Àíàëèç ............................................................................................................. 189
Ññûëêè íà ñàéòû ................................................................................................ 144 Ìíîãîïîòî÷íîñòü è ïàðàëëåëèçì .................................................................. 191
×àñòî çàäàâàåìûå âîïðîñû ............................................................................ 145 Ðåçþìå ................................................................................................................ 193
Îáçîð èçëîæåííîãî ìàòåðèàëà ..................................................................... 193
Глава 3. BSD!сокеты ............................................................................... 147
Ññûëêè íà ñàéòû ................................................................................................ 195
Ââåäåíèå ............................................................................................................. 148
×àñòî çàäàâàåìûå âîïðîñû ............................................................................ 195
Ââåäåíèå â ïðîãðàììèðîâàíèå BSD-ñîêåòîâ ............................................. 148
Êëèåíòû è ñåðâåðû äëÿ ïðîòîêîëà TCP ........................................................ 149 Глава 4. Сокеты на платформе Windows (Winsock) ......................... 197
Êîìïèëÿöèÿ ................................................................................................... 151 Ââåäåíèå ............................................................................................................. 198
Ïðèìåð âûïîëíåíèÿ ...................................................................................... 151 Îáçîð Winsock ................................................................................................... 198
Àíàëèç ............................................................................................................. 151 Winsock 2.0 ......................................................................................................... 200
Êîìïèëÿöèÿ ................................................................................................... 154 Êîìïîíîâêà ñ èñïîëüçîâàíèåì Visual Studio 6.0 ........................................... 201
Ïðèìåð âûïîëíåíèÿ ...................................................................................... 154 Çàäàíèå êîìïîíîâêè â èñõîäíîì êîäå ......................................................... 201
Àíàëèç ............................................................................................................. 154 Àíàëèç ............................................................................................................. 203
Àíàëèç ............................................................................................................. 156 Ïðèìåð: ñêà÷èâàíèå Web-ñòðàíèöû ñ ïîìîùüþ WinSock ...................... 206
Êëèåíòû è ñåðâåðû äëÿ ïðîòîêîëà UDP ....................................................... 156 Àíàëèç ............................................................................................................. 207
Êîìïèëÿöèÿ ................................................................................................... 158 Ïðîãðàììèðîâàíèå êëèåíòñêèõ ïðèëîæåíèé ............................................ 207
Ïðèìåð èñïîëíåíèÿ ....................................................................................... 158 Àíàëèç ............................................................................................................. 210
Àíàëèç ............................................................................................................. 158 Ïðîãðàììèðîâàíèå ñåðâåðíûõ ïðèëîæåíèé .............................................. 211
10 Техника взлома: сокеты, эксплойты и shell!код Содержание 11

Àíàëèç ............................................................................................................. 214 Êëèåíòû è ñåðâåðû äëÿ ïðîòîêîëà UDP ......................................................... 266
Íàïèñàíèå ýêñïëîéòîâ è ïðîãðàìì äëÿ ïðîâåðêè íàëè÷èÿ Êîìïèëÿöèÿ .............................................................................................. 271
óÿçâèìîñòåé ....................................................................................................... 215 Ïðèìåð âûïîëíåíèÿ ................................................................................. 271
Àíàëèç ............................................................................................................. 222 Àíàëèç ....................................................................................................... 272
Àíàëèç ............................................................................................................. 223 Ðåçþìå ................................................................................................................ 275
Ðåçþìå ................................................................................................................ 224 Îáçîð èçëîæåííîãî ìàòåðèàëà ..................................................................... 276
Îáçîð èçëîæåííîãî ìàòåðèàëà ..................................................................... 224 ×àñòî çàäàâàåìûå âîïðîñû ............................................................................ 277
Ññûëêè íà ñàéòû ................................................................................................ 225 Глава 6. Написание переносимых программ .................................... 279
×àñòî çàäàâàåìûå âîïðîñû ............................................................................ 226 Ââåäåíèå ............................................................................................................. 280
Глава 5. Сокеты в языке Java ............................................................... 233 Ðåêîìåíäàöèè ïî ïåðåíîñó ïðîãðàìì ìåæäó ïëàòôîðìàìè UNIX
è Microsoft Windows ......................................................................................... 280
Ââåäåíèå ............................................................................................................. 234
Äèðåêòèâû ïðåïðîöåññîðà ............................................................................. 281
Îáçîð ïðîòîêîëîâ TCP/IP ............................................................................... 234
Èñïîëüçîâàíèå äèðåêòèâ #ifdef ..................................................................... 281
TCP-êëèåíòû .................................................................................................. 235
Îïðåäåëåíèå îïåðàöèîííîé ñèñòåìû ........................................................... 283
Êîìïèëÿöèÿ .............................................................................................. 237
Ïðèìåð èñïîëíåíèÿ ................................................................................. 284
Ïðèìåð âûïîëíåíèÿ ................................................................................. 238 Àíàëèç ....................................................................................................... 284
Àíàëèç ....................................................................................................... 238
Ïîðÿäîê áàéòîâ ............................................................................................. 285
Ðàçðåøåíèå IP-àäðåñîâ è äîìåííûõ èìåí .................................................... 239 Ïðèìåð èñïîëíåíèÿ ................................................................................. 286
Ïðèìåð âûïîëíåíèÿ ................................................................................. 240 Àíàëèç ....................................................................................................... 286
Àíàëèç ....................................................................................................... 240 Ñîçäàíèå è çàâåðøåíèå ïðîöåññîâ ............................................................... 287
Ïðèìåð âûïîëíåíèÿ ................................................................................. 241
Ñèñòåìíûé âûçîâ exec .................................................................................... 287
Àíàëèç ....................................................................................................... 242
Ïðèìåð èñïîëíåíèÿ ................................................................................. 288
Ââîä/âûâîä òåêñòà: êëàññ LineNumberReader ................................................. 242 Àíàëèç ....................................................................................................... 288
Êîìïèëÿöèÿ .............................................................................................. 245 Ïðèìåð èñïîëíåíèÿ ................................................................................. 289
Ïðèìåð âûïîëíåíèÿ ................................................................................. 245 Àíàëèç ....................................................................................................... 289
Àíàëèç ....................................................................................................... 245 Ïðèìåð èñïîëíåíèÿ ................................................................................. 292
TCP-ñåðâåðû ................................................................................................... 246 Àíàëèç ....................................................................................................... 292
Êîìïèëÿöèÿ .............................................................................................. 249 Ñèñòåìíûé âûçîâ fork ................................................................................... 293
Ïðèìåð âûïîëíåíèÿ ................................................................................. 249 Ñèñòåìíûé âûçîâ exit .................................................................................... 293
Àíàëèç ....................................................................................................... 249 Ìíîãîïîòî÷íîñòü .......................................................................................... 293
Èñïîëüçîâàíèå Web-áðàóçåðà äëÿ ñîåäèíåíèÿ ñ ñåðâåðîì TCPServer1 ....... 250 Ñîçäàíèå ïîòîêà ............................................................................................. 294
Ðàáîòà ñ íåñêîëüêèìè ñîåäèíåíèÿìè ............................................................ 251 Ïðèìåð èñïîëíåíèÿ ................................................................................. 295
Êîìïèëÿöèÿ .............................................................................................. 257 Àíàëèç ....................................................................................................... 295
Ïðèìåð âûïîëíåíèÿ ................................................................................. 257 Ïðèìåð èñïîëíåíèÿ ................................................................................. 296
Àíàëèç ....................................................................................................... 258 Àíàëèç ....................................................................................................... 296
Ïðîãðàììà WormCatcher ................................................................................ 260 Ñèíõðîíèçàöèÿ ïîòîêîâ ................................................................................ 297
Êîìïèëÿöèÿ .............................................................................................. 264 Ïðèìåð èñïîëíåíèÿ ................................................................................. 299
Ïðèìåð âûïîëíåíèÿ ................................................................................. 264 Àíàëèç ....................................................................................................... 299
Àíàëèç ....................................................................................................... 265 Ïðèìåð èñïîëíåíèÿ ................................................................................. 301
12 Техника взлома: сокеты, эксплойты и shell!код Содержание 13

Àíàëèç ....................................................................................................... 301 Àíàëèç ....................................................................................................... 339


Ñèãíàëû .......................................................................................................... 302 Àíàëèç ....................................................................................................... 340
Àíàëèç ....................................................................................................... 303 Àíàëèç ....................................................................................................... 341
Àíàëèç ....................................................................................................... 304 Ðàñøèðåííàÿ èíôîðìàöèÿ îá îøèáêàõ ....................................................... 341
Ðàáîòà ñ ôàéëàìè ............................................................................................ 304 Àíàëèç ....................................................................................................... 342
Àíàëèç ....................................................................................................... 305 API ................................................................................................................... 343
Àíàëèç ....................................................................................................... 307 Ðàñøèðåíèÿ, îïðåäåëåííûå â Winsock 2.0 .................................................... 343
Ðàáîòà ñ êàòàëîãàìè ........................................................................................ 307 Ôóíêöèè read() è write() ................................................................................ 343
Àíàëèç ....................................................................................................... 308 Ôóíêöèÿ socket() ............................................................................................ 343
Àíàëèç ....................................................................................................... 309 Àíàëèç ....................................................................................................... 345
Àíàëèç ....................................................................................................... 311 Ôóíêöèÿ connect() .......................................................................................... 346
Áèáëèîòåêè ..................................................................................................... 311 Àíàëèç ....................................................................................................... 348
Äèíàìè÷åñêàÿ çàãðóçêà áèáëèîòåê ............................................................... 313 Ôóíêöèÿ bind() ............................................................................................... 348
Àíàëèç ....................................................................................................... 315 Àíàëèç ....................................................................................................... 351
Àíàëèç ....................................................................................................... 316 Ôóíêöèÿ l isten() ............................................................................................. 351
Ïðîãðàììèðîâàíèå äåìîíîâ è Win32-ñåðâèñîâ .......................................... 317 Àíàëèç ....................................................................................................... 354
Ïðèìåð èñïîëíåíèÿ ................................................................................. 319 Ôóíêöèÿ accept() ............................................................................................ 354
Àíàëèç ....................................................................................................... 319 Àíàëèç ....................................................................................................... 357
Àíàëèç ....................................................................................................... 323 Ôóíêöèÿ select() .............................................................................................. 358
Óïðàâëåíèå ïàìÿòüþ ..................................................................................... 324 Àíàëèç ....................................................................................................... 362
Àíàëèç ....................................................................................................... 325 Ôóíêöèè send() è sendto() .............................................................................. 363
Îáðàáîòêà àðãóìåíòîâ, çàäàííûõ â êîìàíäíîé ñòðîêå ................................ 325 Àíàëèç ....................................................................................................... 366
Àíàëèç ....................................................................................................... 326 Ôóíêöèè recv() è recvfrom() ........................................................................... 366
Àíàëèç ....................................................................................................... 328 Àíàëèç ....................................................................................................... 370
Ïðèìåð èñïîëíåíèÿ ................................................................................. 329 Ôóíêöèè close() è closesocket() ...................................................................... 370
Àíàëèç ....................................................................................................... 329 Àíàëèç ....................................................................................................... 372
Öåëî÷èñëåííûå òèïû äàííûõ ....................................................................... 330 Ôóíêöèÿ setsockopt() ...................................................................................... 372
Àíàëèç ....................................................................................................... 331 Àíàëèç ....................................................................................................... 375
Ðåçþìå ................................................................................................................ 332 Ôóíêöèè ioctl() è ioctlsocket() ........................................................................ 375
Îáçîð èçëîæåííîãî ìàòåðèàëà ..................................................................... 332 Àíàëèç ....................................................................................................... 377
×àñòî çàäàâàåìûå âîïðîñû ............................................................................ 332 Ïðîñòûå ñîêåòû ............................................................................................. 378
Îáçîð API ....................................................................................................... 378
Глава 7. Написание переносимых сетевых программ ..................... 335
Çàãîëîâî÷íûå ôàéëû ..................................................................................... 379
Ââåäåíèå ............................................................................................................. 336 Çàãîëîâîê IPv4 ......................................................................................... 379
BSD-ñîêåòû è Winsock ..................................................................................... 336 Çàãîëîâîê ICMP ........................................................................................ 381
Òðåáîâàíèÿ ñïåöèôèêàöèè Winsock ............................................................. 337 Çàãîëîâîê UDP .......................................................................................... 381
Àíàëèç ....................................................................................................... 338 Çàãîëîâîê TCP ........................................................................................... 382
Ïîäëåæàùèå ïåðåíîñó êîìïîíåíòû ............................................................. 338 Îïðåäåëåíèå ëîêàëüíîãî IP-àäðåñà .............................................................. 383
Âîçâðàùàåìûå çíà÷åíèÿ ............................................................................... 338 Çàïðîñ ó ïîëüçîâàòåëÿ .................................................................................... 383
14 Техника взлома: сокеты, эксплойты и shell!код Содержание 15

Ïåðå÷èñëåíèå èíòåðôåéñîâ ...................................................................... 384 Shell-êîä, âûïîëíÿþùèé setuid ..................................................................... 419


Ïðèìåð èñïîëíåíèÿ ................................................................................. 388 Shell-êîä, âûïîëíÿþùèé chroot .................................................................... 420
Àíàëèç ....................................................................................................... 388 Íàïèñàíèå shell-êîäà äëÿ Windows ................................................................ 425
Áèáëèîòåêè pcap è WinPcap ........................................................................ 389 Ðåçþìå ................................................................................................................ 431
Ïðèìåð èñïîëíåíèÿ ................................................................................. 394
Îáçîð èçëîæåííîãî ìàòåðèàëà ..................................................................... 431
Àíàëèç ....................................................................................................... 394
Ññûëêè íà ñàéòû ................................................................................................ 433
Ðåçþìå ................................................................................................................ 396
Ñïèñêè ðàññûëêè .............................................................................................. 434
Îáçîð èçëîæåííîãî ìàòåðèàëà ..................................................................... 397
×àñòî çàäàâàåìûå âîïðîñû ............................................................................ 434
×àñòî çàäàâàåìûå âîïðîñû ............................................................................ 397
Глава 8. Написание shell!кода I ........................................................... 399 Глава 9. Написание shell!кода II .......................................................... 437
Ââåäåíèå ............................................................................................................. 438
Ââåäåíèå ............................................................................................................. 400
Ïðèìåðû shell-êîäîâ ........................................................................................ 438
×òî òàêîå shell-êîä? ......................................................................................... 400
Èíñòðóìåíòû ............................................................................................ 401 Ñèñòåìíûé âûçîâ write .................................................................................. 441
ßçûê àññåìáëåðà ....................................................................................... 402 Àíàëèç ....................................................................................................... 442
Àíàëèç .................................................................................................. 403 Àíàëèç ....................................................................................................... 444
Àíàëèç .................................................................................................. 403 Ñèñòåìíûé âûçîâ execve ................................................................................ 446
Àíàëèç .................................................................................................. 404 Àíàëèç ....................................................................................................... 446
Àññåìáëåð â Windows è UNIX .................................................................. 406 Àíàëèç ....................................................................................................... 447
Ïðîáëåìà àäðåñàöèè ...................................................................................... 406 Àíàëèç ....................................................................................................... 449
Ïðèìåíåíèå êîìàíä call è jmp ............................................................... 407 Àíàëèç ....................................................................................................... 451
Àíàëèç .................................................................................................. 407 Àíàëèç ....................................................................................................... 453
Àíàëèç .................................................................................................. 408 Àíàëèç ....................................................................................................... 454
Çàòàëêèâàíèå àðãóìåíòîâ â ñòåê ............................................................. 408 Shell-êîä äëÿ ïðèâÿçêè ê ïîðòó ..................................................................... 455
Àíàëèç ....................................................................................................... 456
Ïðîáëåìà íóëåâîãî áàéòà ............................................................................... 409
Ñèñòåìíûé âûçîâ socket ................................................................................ 458
Ðåàëèçàöèÿ ñèñòåìíûõ âûçîâîâ ..................................................................... 410
Àíàëèç ....................................................................................................... 458
Íîìåðà ñèñòåìíûõ âûçîâîâ ........................................................................... 410
Ñèñòåìíûé âûçîâ bind ................................................................................... 459
Àðãóìåíòû ñèñòåìíûõ âûçîâîâ ............................................................... 411
Àíàëèç ....................................................................................................... 459
Àíàëèç .................................................................................................. 411
Ñèñòåìíûé âûçîâ l isten ................................................................................. 460
Àíàëèç .................................................................................................. 412
Àíàëèç ....................................................................................................... 460
Àíàëèç .................................................................................................. 412
Çíà÷åíèå, âîçâðàùàåìîå ñèñòåìíûì âûçîâîì ....................................... 413 Ñèñòåìíûé âûçîâ accept ................................................................................ 460
Àíàëèç ....................................................................................................... 461
Âíåäðåíèå shell-êîäà â óäàëåííóþ ïðîãðàììó ............................................ 413
Ñèñòåìíûé âûçîâ dup2 ................................................................................. 461
Shell-êîä äëÿ ïðèâÿçêè ê ïîðòó ..................................................................... 413
Àíàëèç ....................................................................................................... 462
Àíàëèç .................................................................................................. 415
Ñèñòåìíûé âûçîâ execve ................................................................................ 462
Shell-êîä äëÿ èñïîëüçîâàíèÿ ñóùåñòâóþùåãî äåñêðèïòîðà ñîêåòà .............. 415
Àíàëèç ....................................................................................................... 462
Àíàëèç .................................................................................................. 416
Àíàëèç ....................................................................................................... 466
Âíåäðåíèå shell-êîäà â ëîêàëüíóþ ïðîãðàììó ............................................ 417 Shell-êîä äëÿ îáðàòíîãî ñîåäèíåíèÿ ............................................................. 468
Shell-êîä, âûïîëíÿþùèé execve ..................................................................... 417 Àíàëèç ....................................................................................................... 470
16 Техника взлома: сокеты, эксплойты и shell!код Содержание 17

Shell-êîä äëÿ ïîâòîðíîãî èñïîëüçîâàíèÿ ñîêåòà .......................................... 471 Èñïðàâëåíèå îøèáêè èç-çà íåêîððåêòíîãî èñïîëüçîâàíèÿ
Àíàëèç ....................................................................................................... 473 ôîðìàòíîé ñòðîêè .................................................................................... 510
Ïîâòîðíîå èñïîëüçîâàíèå ôàéëîâûõ äåñêðèïòîðîâ .................................. 474 Ïðèìåð: óÿçâèìîñòü xlockmore âñëåäñòâèå çàäàíèÿ ïîëüçîâàòåëåì
Àíàëèç ....................................................................................................... 474 ôîðìàòíîé ñòðîêè (CVE-2000-0763) ............................................................. 510
Àíàëèç ....................................................................................................... 476 Äåòàëè óÿçâèìîñòè .................................................................................... 510
Àíàëèç ....................................................................................................... 477 Äåòàëè ýêñïëîéòà ....................................................................................... 511
Àíàëèç ....................................................................................................... 478 Àíàëèç ....................................................................................................... 513
Àíàëèç ....................................................................................................... 479 Óÿçâèìîñòè TCP/IP ........................................................................................... 513
Àíàëèç ....................................................................................................... 480
Àíàëèç ....................................................................................................... 480 Ãîíêè ................................................................................................................... 514
Êîäèðîâàíèå shell-êîäà .................................................................................. 481 Ãîíêè, ñâÿçàííûå ñ ôàéëàìè ......................................................................... 515
Àíàëèç ....................................................................................................... 482 Ãîíêè, ñâÿçàííûå ñ ñèãíàëàìè ...................................................................... 516
Àíàëèç ....................................................................................................... 485 Ïðèìåð: îøèáêà â ïðîãðàììå man ïðè êîíòðîëå âõîäíûõ äàííûõ ...... 517
Àíàëèç ....................................................................................................... 486 Äåòàëè óÿçâèìîñòè .................................................................................... 517
Ïîâòîðíîå èñïîëüçîâàíèå ïåðåìåííûõ ïðîãðàììû ................................ 488 Ðåçþìå ................................................................................................................ 520
Ïðîãðàììû ñ îòêðûòûìè èñõîäíûìè òåêñòàìè ..................................... 488 Îáçîð èçëîæåííîãî ìàòåðèàëà ..................................................................... 521
Àíàëèç ....................................................................................................... 489
Ññûëêè íà ñàéòû ................................................................................................ 523
Ïðîãðàììû ñ íåäîñòóïíûìè èñõîäíûìè òåêñòàìè ................................ 490
Àíàëèç ....................................................................................................... 491 ×àñòî çàäàâàåìûå âîïðîñû ............................................................................ 523
Àíàëèç ....................................................................................................... 492 Глава 11. Написание эксплойтов II ..................................................... 525
Shell-êîä, ðàáîòàþùèé â ðàçíûõ ÎÑ ............................................................. 492 Ââåäåíèå ............................................................................................................. 526
Àíàëèç ....................................................................................................... 493
Ïðîãðàììèðîâàíèå ñîêåòîâ è ïðèâÿçêè ê ïîðòó â ýêñïëîéòàõ .............. 527
Êàê ðàçîáðàòüñÿ â ðàáîòå ãîòîâîãî shell-êîäà? .......................................... 493 Ïðîãðàììèðîâàíèå êëèåíòñêèõ ñîêåòîâ ...................................................... 527
Àíàëèç ....................................................................................................... 496
Àíàëèç ....................................................................................................... 528
Ðåçþìå ................................................................................................................ 499 Àíàëèç ....................................................................................................... 529
Îáçîð èçëîæåííîãî ìàòåðèàëà ..................................................................... 499 Ïðîãðàììèðîâàíèå ñåðâåðíûõ ñîêåòîâ ....................................................... 529
Ññûëêà íà ñàéòû ................................................................................................. 500 Àíàëèç ....................................................................................................... 530
Ñïèñêè ðàññûëêè .............................................................................................. 500 Ýêñïëîéòû äëÿ ïåðåïîëíåíèÿ ñòåêà .............................................................. 531
×àñòî çàäàâàåìûå âîïðîñû ............................................................................ 501 Îðãàíèçàöèÿ ïàìÿòè ...................................................................................... 531
Ïåðåïîëíåíèå ñòåêà ......................................................................................... 532
Глава 10. Написание эксплойтов I....................................................... 503
Ïîèñê ïîääàþùèõñÿ ýêñïëóàòàöèè ïåðåïîëíåíèé ñòåêà â ïðîãðàììàõ
Ââåäåíèå ............................................................................................................. 504 ñ îòêðûòûìè èñõîäíûìè òåêñòàìè .......................................................... 537
Îáíàðóæåíèå óÿçâèìîñòåé ............................................................................. 504 Ïðèìåð: ïåðåïîëíåíèå XLOCALEDIR â X11R6 4.2 .................................... 538
Ýêñïëîéòû äëÿ àòàêè íà ëîêàëüíûå è óäàëåííûå ïðîãðàììû ................. 505 Îïèñàíèå óÿçâèìîñòè .............................................................................. 538
Àíàëèç ....................................................................................................... 507 Ýêñïëîéò ................................................................................................... 541
Àòàêè íà ôîðìàòíóþ ñòðîêó ........................................................................... 507 Âûâîä ........................................................................................................ 543
Ôîðìàòíûå ñòðîêè ........................................................................................ 507 Ïîèñê ïåðåïîëíåíèé ñòåêà â ïðîãðàììàõ ñ íåäîñòóïíûìè èñõîäíûìè
Àíàëèç ....................................................................................................... 508 òåêñòàìè .................................................................................................... 543
Àíàëèç ....................................................................................................... 509 Ýêñïëîéòû äëÿ çàòèðàíèÿ êó÷è ...................................................................... 544
18 Техника взлома: сокеты, эксплойты и shell!код Содержание 19

Ðåàëèçàöèÿ Äóãà Ëåà .................................................................................. 545 Îïðåäåëåíèå âåêòîðà àòàêè ........................................................................... 596
Àíàëèç ....................................................................................................... 547 Íàõîæäåíèå ñìåùåíèÿ .................................................................................. 597
Ïðèìåð: óÿçâèìîñòü, ñâÿçàííàÿ ñ ïåðåïîëíåíèåì áóôåðà Âûáîð âåêòîðà óïðàâëåíèÿ ............................................................................ 602
èç-çà íåïðàâèëüíî ñôîðìèðîâàííîãî êëèåíòñêîãî êëþ÷à Âû÷èñëåíèå àäðåñà âîçâðàòà .......................................................................... 607
â OpenSSL SSLv2, CAN-2002-0656 .................................................................. 549 Èñïîëüçîâàíèå àäðåñà âîçâðàòà ..................................................................... 612
Îïèñàíèå óÿçâèìîñòè .............................................................................. 550 Îïðåäåëåíèå íåäîïóñòèìûõ ñèìâîëîâ ......................................................... 614
Îïèñàíèå ýêñïëîéòà ................................................................................. 550
Îïðåäåëåíèå îãðàíè÷åíèé íà ðàçìåð ............................................................ 615
Òðóäíîñòè .................................................................................................. 552
Óñîâåðøåíñòâîâàíèå ýêñïëîéòà ............................................................... 553 Äîðîæêà èç NOP-êîìàíä ............................................................................... 617
Âûâîä ........................................................................................................ 553 Âûáîð ïîëåçíîé íàãðóçêè è êîäèðîâùèêà .................................................... 619
Êîä ýêñïëîéòà äëÿ ïåðåïîëíåíèÿ áóôåðà èç-çà íåïðàâèëüíî Èíòåãðèðîâàíèå ýêñïëîéòà â êàðêàñ ............................................................. 629
ñôîðìèðîâàííîãî êëèåíòñêîãî êëþ÷à â OpenSSL SSLv2 ................. 554 Âíóòðåííåå óñòðîéñòâî êàðêàñà .................................................................... 629
Ðåàëèçàöèÿ malloc â ÎÑ System V ............................................................ 560 Àíàëèç ñóùåñòâóþùåãî ìîäóëÿ ýêñïëîéòà ................................................... 631
Àíàëèç ....................................................................................................... 562 Ïåðåîïðåäåëåíèå ìåòîäîâ ............................................................................. 637
Àíàëèç ....................................................................................................... 563
Ðåçþìå ................................................................................................................ 638
Ýêñïëîéòû äëÿ îøèáîê ïðè ðàáîòå ñ öåëûìè ÷èñëàìè ........................... 564
Îáçîð èçëîæåííîãî ìàòåðèàëà ..................................................................... 639
Ïåðåïîëíåíèå öåëîãî ÷èñëà .......................................................................... 564
Àíàëèç ....................................................................................................... 565 Ññûëêè íà ñàéòû ................................................................................................ 640
Àíàëèç ....................................................................................................... 567 ×àñòî çàäàâàåìûå âîïðîñû ............................................................................ 641
Îáõîä ïðîâåðêè ðàçìåðà ................................................................................ 567
Глава 13. Написание компонентов для задач, связанных
Àíàëèç ....................................................................................................... 568
с безопасностью ..................................................................................... 643
Àíàëèç ....................................................................................................... 569
Äðóãèå îøèáêè, ñâÿçàííûå ñ öåëûìè ÷èñëàìè ........................................... 569 Ââåäåíèå ............................................................................................................. 644
Ïðèìåð: óÿçâèìîñòü OpenSSH èç-çà ïåðåïîëíåíèÿ öåëîãî â ïðîöåäóðå Ìîäåëü COM ...................................................................................................... 644
îêëèêà/îòçûâà CVE-2002-0639 ........................................................................ 570 COM-îáúåêòû ................................................................................................ 645
Äåòàëè óÿçâèìîñòè ......................................................................................... 570 COM-èíòåðôåéñû .......................................................................................... 645
Äåòàëè ýêñïëîéòà ....................................................................................... 571 Èíòåðôåéñ IUnknown ............................................................................... 645
Ïðèìåð: óÿçâèìîñòü â UW POP2, ñâÿçàííàÿ ñ ïåðåïîëíåíèåì áóôåðà, Ñîãëàøåíèå î âûçîâå .............................................................................. 645
CVE-1999-0920 ................................................................................................... 574 Ñðåäà èñïîëíåíèÿ COM ................................................................................. 646
Äåòàëè óÿçâèìîñòè ......................................................................................... 574 Ðåàëèçàöèÿ COM-îáúåêòà .............................................................................. 647
Ðåãèñòðàöèÿ COM-îáúåêòà ....................................................................... 647
Ðåçþìå ................................................................................................................ 584
Êëþ÷ HKEY_CLASSES_ROOT\CLSID ....................................................... 649
Îáçîð èçëîæåííîãî ìàòåðèàëà ..................................................................... 584 Êëþ÷ HKEY_CLASSES_ROOT\CLSID\
Ññûëêè íà ñàéòû ................................................................................................ 585 {xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx} ................................................. 649
×àñòî çàäàâàåìûå âîïðîñû ............................................................................ 586 Êëþ÷ InprocServer32 ................................................................................. 649
Êëþ÷ LocalServer32 ................................................................................... 649
Глава 12. Написание эксплойтов III .................................................... 587
Ðåàëèçàöèÿ âíóòðèïðîöåññíîãî ñåðâåðà ....................................................... 649
Ââåäåíèå ............................................................................................................. 588 Ôóíêöèÿ DllGetClassObject ....................................................................... 650
Èñïîëüçîâàíèå êàðêàñà Metasploit Framework ............................................. 588 Ôóíêöèÿ DllCanUnloadNow ...................................................................... 650
Ðàçðàáîòêà ýêñïëîéòîâ ñ ïîìîùüþ êàðêàñà Metasploit .............................. 595 Ôóíêöèÿ DllRegisterServer .......................................................................... 650
20 Техника взлома: сокеты, эксплойты и shell!код Содержание 21

Ôóíêöèÿ DllUnregisterServer ...................................................................... 651 Èíòåãðàöèÿ ñ ïðèëîæåíèåì: ôàéë RPCDump.c ............................................. 695
Áèáëèîòåêà ATL ................................................................................................. 651 Àíàëèç ....................................................................................................... 696
Øàáëîíû â ÿçûêå C++ ................................................................................... 652 Ðåçþìå ................................................................................................................ 698
Òåõíîëîãèÿ ðåàëèçàöèè êëèåíòà ñ ïîìîùüþ ATL ........................................ 652 Îáçîð èçëîæåííîãî ìàòåðèàëà ..................................................................... 698
Èíòåëëåêòóàëüíûå óêàçàòåëè ................................................................... 653 Ññûëêè íà ñàéòû ................................................................................................ 699
Ïîääåðæêà òèïîâ äàííûõ ......................................................................... 653
×àñòî çàäàâàåìûå âîïðîñû ............................................................................ 699
Òèï äàííûõ BSTR ..................................................................................... 653
Òèï äàííûõ VARIANT .............................................................................. 654 Глава 14. Создание инструмента для проверки уязвимости
Òåõíîëîãèÿ ðåàëèçàöèè ñåðâåðà ñ ïîìîùüþ ATL ........................................ 656 Web!приложения ................................................................................... 703
Êîìïîçèöèÿ êëàññîâ ................................................................................. 656 Ââåäåíèå ............................................................................................................. 704
ßçûê îïðåäåëåíèÿ èíòåðôåéñîâ ............................................................. 659 Ïðîåêòèðîâàíèå................................................................................................ 705
Ðåãèñòðàöèÿ êëàññà .................................................................................... 663
Ôîðìàò ñèãíàòóðû àòàêè ................................................................................ 705
Ðåàëèçàöèÿ âíóòðèïðîöåññíîãî COM-ñåðâåðà ....................................... 666
Ñèãíàòóðû ...................................................................................................... 705
Ãëîáàëüíàÿ ïåðåìåííàÿ _AtlModule ......................................................... 666
Ôóíêöèè, ýêñïîðòèðóåìûå èç DLL .......................................................... 667 Óãëóáëåííûé àíàëèç ......................................................................................... 706
Òî÷êà âõîäà â ìîäóëü ................................................................................. 669 Ñîêåòû è îòïðàâêà ñèãíàòóðû .................................................................. 706
Ðåàëèçàöèÿ âíåïðîöåññíîãî COM-ñåðâåðà ............................................. 669 Àíàëèç ....................................................................................................... 715
Ãëîáàëüíàÿ ïåðåìåííàÿ _AtlModule ................................................... 669 Ðàçáîð áàçû äàííûõ ................................................................................. 717
Òî÷êà âõîäà â ìîäóëü ................................................................................. 669 Àíàëèç ....................................................................................................... 721
Àíàëèç ....................................................................................................... 727
Àòðèáóòû ATL ................................................................................................ 670
Çàãîëîâî÷íûå ôàéëû ..................................................................................... 730
Àòðèáóò module ......................................................................................... 672
Àòðèáóò interface ....................................................................................... 673 Êîìïèëÿöèÿ ................................................................................................... 733
Àòðèáóò coclass .......................................................................................... 674 Âûïîëíåíèå ................................................................................................... 733
Êîìïèëÿöèÿ COM-ñåðâåðà .................................................................. 675 Ñïðàâêà î ïðîãðàììå ............................................................................... 733
Äîáàâëåíèå COM-ðàñøèðåíèé â ïðîãðàììó RPCDUMP ......................... 675 Ðåçóëüòàòû ðàáîòû ........................................................................................... 734
Àíàëèç ....................................................................................................... 678 Ðåçþìå ................................................................................................................ 735
Ïîòîê óïðàâëåíèÿ ......................................................................................... 680 Îáçîð èçëîæåííîãî ìàòåðèàëà ..................................................................... 735
Àíàëèç ....................................................................................................... 681 Ññûëêè íà ñàéòû ................................................................................................ 736
Ïðîöåäóðû èíòåãðàöèè ñ ïðèëîæåíèåì ....................................................... 682 ×àñòî çàäàâàåìûå âîïðîñû ............................................................................ 736
Àíàëèç ....................................................................................................... 683
Îïðåäåëåíèå èíòåðôåéñîâ COM-îáúåêòîâ .................................................. 685 Приложение А. Глоссарий .................................................................... 739
Èíòåðôåéñ IRpcEnum .............................................................................. 686 Приложение В. Полезные программы для обеспечения
Èíòåðôåéñ IEndPointCollection ................................................................ 686 безопасности .......................................................................................... 747
Èíòåðôåéñ IEndPoint ................................................................................ 688
Ïðîâåðêà èñõîäíûõ òåêñòîâ ........................................................................... 748
Êëàññû êîìïîíåíòîâ ...................................................................................... 688
Èíñòðóìåíòû äëÿ ãåíåðèðîâàíèÿ shell-êîäà ................................................. 748
Àíàëèç ....................................................................................................... 689
Îòëàä÷èêè ...................................................................................................... 748
Àíàëèç ....................................................................................................... 690
Àíàëèç ....................................................................................................... 693 Êîìïèëÿòîðû ................................................................................................. 749
Èíòåãðàöèÿ ñ ïðèëîæåíèåì: ôàéë COMSupport.h ........................................ 695 Ýìóëÿòîðû àïïàðàòóðû ................................................................................. 749
Àíàëèç ....................................................................................................... 695 Áèáëèîòåêè ..................................................................................................... 750
22 Техника взлома: сокеты, эксплойты и shell!код

Àíàëèç óÿçâèìîñòåé ....................................................................................... 750


Àíàëèçàòîðû ñåòåâîãî òðàôèêà ..................................................................... 751
Ãåíåðàòîðû ïàêåòîâ ....................................................................................... 751
Ñêàíåðû .......................................................................................................... 752 Благодарности
Приложение С. Архивы эксплойтов .................................................... 753
Àðõèâû ýêñïëîéòîâ â Èíòåðíåòå ............................................................ 754 Ïðåæäå âñåãî, õî÷ó ïîáëàãîäàðèòü ñâîþ ñåìüþ çà íåèçìåííóþ âåðó â ìåíÿ
è â òå àìáèöèîçíûå öåëè, êîòîðûå ÿ ïåðåä ñîáîé ñòàâëþ. Âû ïðîäîëæàåòå
Приложение D. Краткий справочник по системным вызовам ........ 755 ïîääåðæèâàòü ìîè ìå÷òû è óñòðåìëåíèÿ. Ìàìà, ïàïà, Ñòèâ è Ìàìó – ìîÿ áëà-
exit (int ) .......................................................................................................... 756 ãîäàðíîñòü âàì íå çíàåò ãðàíèö.
open (file, flags, mode) ..................................................................................... 756 Õîòåë áû òàêæå âûðàçèòü ïðèçíàòåëüíîñòü âñåì, êòî ïîìîãàë ìíå â íàïè-
close (äåñêðèïòîð ôàéëà) ............................................................................... 756 ñàíèè ýòîé êíèãè, â òîì ÷èñëå Ìàéêó Ïðàéñó (Mike Price), Ìàðøàëëó Áåääîó
read (äåñêðèòîð ôàéëà, óêàçàòåëü íà áóôåð, ÷èñëî áàéòîâ) ......................... 756 (Marshall Beddoe), Òîíè Áåòòèíè (Tony Bettini), ×àäó Êýðòèñó (Chad Curtis),
write (äåñêðèòîð ôàéëà, óêàçàòåëü íà áóôåð, ÷èñëî áàéòîâ) ........................ 756 Íèëüñó Õåéíåíó (Niels Heinen), Ðàññó Ìèëëåðó (Russ Miller), Áëåéêó Óîòòñó
execve (ôàéë, ôàéë + àðãóìåíòû, ïåðåìåííûå îêðóæåíèÿ) ......................... 756 (Blake Watts), Êýâèíó Õýððèôîðäó (Kevin Harriford), Òîìó Ôåððèñó (Tom
socketcall (íîìåð ôóíêöèè, àðãóìåíòû) ........................................................ 757 Ferris), Äåéâó Ýéòåëþ (Dave Aitel), Ñèíàí Ýðåí (Sinan Eren) è Ñòþàðòó Ìàêêëå-
ðó (Stuart McClure). Ðåáÿòà, âû âåëèêîëåïíû. Ñïàñèáî âàì!
socket (àäðåñíîå ñåìåéñòâî, òèï, ïðîòîêîë) ................................................. 757
Îòäåëüíîå ñïàñèáî êîðïîðàöèè Computer Sciences Corporation çà ðàçðåøå-
bind (äåñêðèïòîð ñîêåòà, ñòðóêòóðà sockaddr, ðàçìåð âòîðîãî
íèå îïóáëèêîâàòü ýòó ðàáîòó. Ðåã Ôîóëêñ (Reg Foulkes) – òû ïàðåíü ÷òî íàäî!
àðãóìåíòà) ................................................................................................. 757
Êðîìå òîãî, áëàãîäàðíîñòü çàñëóæèëè Êðèñ Ñòåéíáàõ (Chris Steinbach), Äæåé-
l isten (äåñêðèïòîð ñîêåòà, ìàêñèìàëüíûé ðàçìåð î÷åðåäè ñîåäèíåíèé) ..... 757
ñîí Ýíðàéò (Jason Enwright), Ðîí Íîóä (Ron Knode), Äæåííèôåð Øóëüöå
accept (äåñêðèïòîð ñîêåòà, ñòðóêòóðà sockaddr, ðàçìåð âòîðîãî (Jennifer Shulze) è Ìýðè Ïðàòò (Mary Pratt).
àðãóìåíòà) ................................................................................................. 758 È íàïîñëåäîê õî÷ó ïîáëàãîäàðèòü âåñü êîëëåêòèâ èçäàòåëüñòâà Syngress
Приложение Е. Справочник по преобразованию данных ............. 759 Publishing. Ãýðè, ñïàñèáî òåáå çà òå äîëãèå ÷àñû, êîòîðûå òû ïîòðàòèë íà ýòó
êíèãó. Ýìè, ñïàñèáî çà ðàáîòó íàä ýòîé è äðóãèìè êíèãàìè. Ýíäðþ, ïðèìè
Предметный указатель ......................................................................... 765 áëàãîäàðíîñòü çà îêàçàííóþ ìíå ïîääåðæêó è çà òî, ÷òî òû ïðîäîëæàåøü ðà-
áîòàòü íàä òàêèìè óâëåêàòåëüíûìè ïðîåêòàìè. Òàê äåðæàòü, Syngress. ß æå
íàäåþñü â çàíÿòüñÿ áëèæàéøåì áóäóùåì íå ìåíåå èíòåðåñíûì ïðîåêòîì.
Об основном авторе 25

íèå), Advanced Intrusion Detection, Hacking the Code: ASP.NET Web Application
Security (Syngress, ISBN: 1-932266-65-8), Anti-Spam Toolkit è Google Hacking for
Penetration Techniques (Syngress, ISBN: 1-931836-36-1).
Об авторе
Äæåéìñ Ê. Ôîñòåð ÿâëÿåòñÿ çàìåñòèòåëåì äèðåêòîðà êîìïàíèè Global Security
Solution Development for Computer Sciences Corporation, ãäå îòâå÷àåò çà ïîñòà-
íîâêó è ðåàëèçàöèþ ðåøåíèé, îòíîñÿùèõñÿ ê ðàçëè÷íûì àñïåêòàì áåçîïàñ-
íîñòè: ôèçè÷åñêîé, êàäðîâîé è èíôîðìàöèîííîé. Äî ïåðåõîäà â CSC Ôîñòåð
Об основном соавторе
ðàáîòàë äèðåêòîðîì ïî èññëåäîâàíèÿì è ðàçðàáîòêàì â ôèðìå Foundstone
Inc. (ïîçäíåå åå ïðèîáðåëà êîìïàíèÿ McAfee), ãäå îòâå÷àë çà âñå àñïåêòû èç- Ìàéêë Ïðàéñ çàíèìàåò äîëæíîñòü ãëàâíîãî èíæåíåðà ïî èññëåäîâàíèÿì è
ãîòîâëåíèÿ ïðîäóêòîâ, êîíñàëòèíã è êîðïîðàòèâíûå èíèöèàòèâû â îáëàñòè ðàçðàáîòêàì â êîìïàíèè McAfee (ðàíåå ðàáîòàë â ôèðìå Foundstone, Inc.),
ÍÈÎÊÐ. Åùå ðàíüøå Ôîñòåð áûë êîíñóëüòàíòîì è íàó÷íûì ñîòðóäíèêîì åãî ïðîôåññèÿ – èíôîðìàöèîííàÿ áåçîïàñíîñòü.  äîïîëíåíèå ê îñíîâíîé
â êîìïàíèè Guardent Inc. (åå ïðèîáðåëà ôèðìà Verisign) è îäíèì èç àâòîðîâ, ðàáîòå Ìàéê àêòèâíî çàíèìàåòñÿ àóäèòîì áåçîïàñíîñòè, àíàëèçîì êîäà,
ïèøóùèõ äëÿ æóðíàëà Information Security (ïðèîáðåòåííîãî TechTarget). Äî îáó÷åíèåì, ðàçðàáîòêîé ïðîãðàììíîãî îáåñïå÷åíèÿ è èññëåäîâàíèÿìè äëÿ
ýòîãî îí ðàáîòàë ñïåöèàëèñòîì-èññëåäîâàòåëåì â îáëàñòè áåçîïàñíîñòè â ìè- ïðàâèòåëüñòâà è ÷àñòíîãî ñåêòîðà.  êîìïàíèè Foundstone Ìàéê îòâå÷àë çà
íèñòåðñòâå îáîðîíû. Îñíîâíûå åãî èíòåðåñû ëåæàò â ñôåðå âûñîêîòåõíîëî- ïîèñê óÿçâèìîñòåé, íàó÷íûå èçûñêàíèÿ â îáëàñòè ñåòåé è ïðîòîêîëîâ, ðàçðà-
ãè÷íîãî äèñòàíöèîííîãî óïðàâëåíèÿ, ìåæäóíàðîäíîé ýêñïàíñèè, ïðèêëàä- áîòêó ïðîãðàìì è îïòèìèçàöèþ êîäà. Åãî èíòåðåñû ëåæàò ãëàâíûì îáðàçîì
íîé áåçîïàñíîñòè, àíàëèçà ïðîòîêîëîâ è àëãîðèòìîâ ïîèñêà. Ôîñòåð ìíîãî â ñôåðå ðàçðàáîòêè ïðîãðàìì äëÿ îáåñïå÷åíèÿ áåçîïàñíîñòè ñåòåé è îòäåëü-
ðàç âûïîëíÿë àíàëèç êîäà îòäåëüíûõ êîìïîíåíòîâ êîììåð÷åñêèõ ÎÑ, ïðèëî- íûõ ìàøèí íà ïëàòôîðìàõ BSD è Windows. Ðàíåå Ìàéê ðàáîòàë â êîìïàíèè
æåíèé äëÿ ïëàòôîðìû Win32 è êîììåð÷åñêèõ ðåàëèçàöèé êðèïòîãðàôè÷å- SecureSoft Systems èíæåíåðîì ïî ðàçðàáîòêå ïðîãðàìì äëÿ îáåñïå÷åíèÿ áåçî-
ñêèõ ñèñòåì. ïàñíîñòè. Ìàéê íàïèñàë ìíîæåñòâî ïðîãðàìì, â òîì ÷èñëå ðåàëèçàöèè ðàç-
Ôîñòåð ÷àñòî âûñòóïàåò íà ðàçëè÷íûõ êîíôåðåíöèÿõ, òåõíè÷åñêèõ ôîðó- ëè÷íûõ êðèïòîãðàôè÷åñêèõ àëãîðèòìîâ, àíàëèçàòîðû ñåòåâûõ ïðîòîêîëîâ è
ìàõ, ïîñâÿùåííûõ èññëåäîâàíèÿì â îáëàñòè áåçîïàñíîñòè â ÑØÀ, óäåëÿÿ îñî- ñêàíåðû óÿçâèìîñòåé.
áîå âíèìàíèå òàêèì ìåðîïðèÿòèÿì êàê Microsoft Security Summit, Black Hat
USA, Black Hat Windows, MIT Wireless Research Forum, SANS, MilCon, TechGov,
InfoSec World 2001 è Thomson Security Conference. Åãî íåðåäêî ïðîñÿò âûñêà-
çàòü ìíåíèå ïî àêòóàëüíûì ïðîáëåìàì áåçîïàñíîñòè è öèòèðóþò â òàêèõ èç-
äàíèÿõ êàê USAToday, æóðíàëàõ Information Security, Basel ine, Computer-
world, Secure Computing è MIT Technologist. Ôîñòåð èìååò ó÷åíóþ ñòåïåíü
áàêàëàâðà, îáëàäàåò ñåðòèôèêàòîì MBA, à òàêæå ìíîãèìè äðóãèìè òåõíè÷å-
ñêèìè è óïðàâëåí÷åñêèìè ñåðòèôèêàòàìè. Îí ñëóøàë êóðñû èëè ïðîâîäèë íà-
ó÷íûå èññëåäîâàíèÿ â òàêèõ ó÷åáíûõ çàâåäåíèÿõ, êàê Éåëüñêàÿ øêîëà áèçíå-
ñà, Ãàðâàðäñêèé óíèâåðñèòåò è óíèâåðñèòåò øòàòà Ìýðèëåíä, à â íàñòîÿùåå
âðåìÿ çàíèìàåòñÿ èññëåäîâàòåëüñêîé ðàáîòîé â Øêîëå áèçíåñà â Âàðòîíå
(Wharton), øòàò Ïåíñèëüâàíèÿ.
Ôîñòåð ÷àñòî ïóáëèêóåòñÿ â ðàçëè÷íûõ êîììåð÷åñêèõ è îáðàçîâàòåëüíûõ
èçäàíèÿõ. Îí àâòîð, ñîàâòîð èëè ðåäàêòîð ìíîãèõ îáúåìíûõ ïóáëèêàöèé,
â ÷àñòíîñòè: Snort 2.1 Intrusion Detection (Syngress Publishing, ISBN: 1-931836-
04-3), Hacking Exposed (÷åòâåðòîå èçäàíèå), Anti-Hacker Toolkit (âòîðîå èçäà-
Прочие соавторы, редакторы и авторы кода 27

Ðàññ Ìèëëåð (Russ


Russ Miller
Miller) ðàáîòàåò ñòàðøèì êîíñóëüòàíòîì â êîìïàíèè
Verisign, Inc. Îí âûïîëíèë àíàëèç ìíîãèõ Web-ïðèëîæåíèé è ïðîèçâåë òåñòè-

Прочие соавторы, редакторы ðîâàíèå ñèñòåìû íà âîçìîæíîñòü âòîðæåíèÿ äëÿ íåñêîëüêèõ êîìïàíèè èç
ñïèñêà Fortune 100, â òîì ÷èñëå äëÿ êðóïíåéøèõ ôèíàíñîâûõ èíñòèòóòîâ.
Ðàññ ñïåöèàëèçèðóåòñÿ â îñíîâíîì íà èññëåäîâàíèÿõ â îáëàñòè áåçîïàñíîñòè
и авторы кода â öåëîì è ïðèêëàäíîãî óðîâíÿ â ÷àñòíîñòè, ïðîåêòèðîâàíèè ñåòåé, ñîöèàëü-
íîé èíæåíåðèè è â ðàçðàáîòêå áåçîïàñíûõ ïðîãðàìì íà òàêèõ ÿçûêàõ, êàê C,
Íèëüñ Õåéíåí (Niels
Niels Heinen
Heinen) ðàáîòàåò íàó÷íûì ñîòðóäíèêîì â îáëàñòè áåçî- Java è Lisp.
ïàñíîñòè â îäíîé åâðîïåéñêîé ôèðìå. Îí çàíèìàëñÿ èññëåäîâàíèÿìè â îáëà-
ñòè òåõíèêè ïîèñêà è ýêñïëóàòàöèè óÿçâèìîñòåé, îñîáî ñïåöèàëèçèðóåòñÿ íà Áëåéê Óîòòñ (Blake
Blake Watts
Watts) ðàáîòàåò ñòàðøèì èíæåíåðîì â êîìïàíèè
íàïèñàíèè ïîçèöèîííî-íåçàâèñèìîãî êîäà íà ÿçûêå àññåìáëåðà, ïðåäíàçíà- McAfee Foundstone, à ðàíåå çàíèìàëñÿ èññëåäîâàíèÿìè â ðàçëè÷íûõ êîìïàíè-
÷åííîãî äëÿ èçìåíåíèÿ ïîòîêà âûïîëíåíèÿ ïðîãðàììû. Åãî èíòåðåñóþò ÿõ, â òîì ÷èñëå Bindview, Guardent (ïðèîáðåòåíà Verisign) è PenSafe (ïðèîáðå-
ãëàâíûì îáðàçîì ñèñòåìû íà áàçå ïðîöåññîðîâ Intel, íî èìååòñÿ òàêæå îïûò òåíà NetIQ). Îí ñïåöèàëèçèðóåòñÿ íà âíóòðåííåì óñòðîéñòâå è àíàëèçå óÿçâè-
ðàáîòû ñ ïðîöåññîðàìè MIPS, HPPA è îñîáåííî PIC. Íèëüñ ïîëó÷àåò óäî- ìîñòåé Windows è îïóáëèêîâàë ðÿä ðàáîò ïî âîïðîñàì áåçîïàñíîñòè â ýòîé
âîëüñòâèå îò ñîçäàíèÿ ïîëèìîðôíûõ «ýêñïëîéòîâ», ñêàíåðîâ äëÿ àíàëèçà îïåðàöèîííîé ñèñòåìå.
áåñïðîâîäíûõ ñåòåé è äàæå èíñòðóìåíòîâ äëÿ ñíÿòèÿ öèôðîâûõ îòïå÷àòêîâ
ÎÑ. Ó íåãî èìååòñÿ òàêæå ïîñòîÿííàÿ ðàáîòà, ñâÿçàííàÿ ñ óãëóáëåííûì àíà- Âèíñåíò Ëþ (Vincent
Vincent Liu
Liu) – ñïåöèàëèñò ïî áåçîïàñíîñòè â îäíîé èç êîì-
ëèçîì ïðîãðàìì, îòíîñÿùèõñÿ ê áåçîïàñíîñòè. ïàíèé, âõîäÿùèõ â ñïèñîê Fortune 100. Ðàíåå îí çàíèìàë äîëæíîñòü êîíñóëü-
òàíòà â öåíòðå îáåñïå÷åíèÿ áåçîïàñíîñòè êîìïàíèè Ernst & Young, à òàêæå
Ìàðøàëë Áåääîó (Marshall
Marshall Beddoe
Beddoe) – íàó÷íûé ñîòðóäíèê â êîìïàíèè ðàáîòàë â Íàöèîíàëüíîì àãåíòñòâå ïî áåçîïàñíîñòè. Îí ñïåöèàëèçèðóåòñÿ íà
McAfee (ðàíåå â ôèðìå Foundstone). Îí âûïîëíèë ìíîãî ðàáîò â îáëàñòè òåñòèðîâàíèè âîçìîæíîñòè âòîðæåíèÿ, àíàëèçå áåçîïàñíîñòè Web-ïðèëîæå-
ïàññèâíîãî àíàëèçà òîïîëîãèè ñåòåé, óäàëåííîãî îáíàðóæåíèÿ ñèñòåì, ðàáî- íèé è ðàçðàáîòêå «ýêñïëîéòîâ». Âèíñåíò ïðèíèìàë ó÷àñòèå â èññëåäîâàíèÿõ
òàþùèõ â ðåæèìå ïðîïóñêàíèÿ (promiscuous mode), ñíÿòèÿ öèôðîâûõ îòïå- ïî áåçîïàñíîñòè, ôèíàíñèðóåìûõ àãåíòñòâîì DARPA, è âíåñ ñâîé âêëàä
÷àòêîâ ÎÑ, âíóòðåííåãî óñòðîéñòâà îïåðàöèîííîé ñèñòåìû FreeBSD è íîâûõ â ïðîåêò Metasploit. Âèíñåíò ïîëó÷èë ó÷åíóþ ñòåïåíü ïî èíôîðìàòèêå è âû-
ìåòîäîâ ïîèñêà è ýêñïëóàòàöèè óÿçâèìîñòåé. Ìàðøàëë âûñòóïàë íà òàêèõ êîí- ÷èñëèòåëüíîé òåõíèêå â óíèâåðñèòåòå øòàòà Ïåíñèëüâàíèÿ.
ôåðåíöèÿõ ïî áåçîïàñíîñòè êàê Black Hat Briefings, Defcon è Toorcon.

Òîíè Áåòòèíè (TonyTony Bettini


Bettini) âîçãëàâëÿåò îòäåë ÍÈÎÊÐ â êîìïàíèè
McAfee, ðàíåå ðàáîòàë â êîìïàíèÿõ, çàíèìàþùèõñÿ áåçîïàñíîñòüþ, â òîì
÷èñëå Foundstone, Guardent è Bindview. Îí ñïåöèàëèçèðóåòñÿ íà áåçîïàñíîñòè
è ïîèñêå óÿçâèìîñòåé â Windows, ïðîãðàììèðóåò íà àññåìáëåðå, C è äðóãèõ
ÿçûêàõ. Òîíè îáíàðóæèë íåñêîëüêî óÿçâèìîñòåé â ïðîãðàììàõ PGP, ISS
Scanner, Microsoft Windows XP è Winamp.

×åä Êåðòèñ (Chad


Chad Curtis
Curtis) – íåçàâèñèìûé êîíñóëüòàíò, ïðîæèâàþùèé
â Þæíîé Êàëèôîðíèè. ×åä áûë íàó÷íûì ñîòðóäíèêîì â êîìïàíèè Found-
stone, ãäå âîçãëàâëÿë ãðóïïó ïî îáíàðóæåíèþ óãðîç. Îí îáëàäàåò áîëüøèì
îïûòîì â ñîçäàíèè ñåòåâîãî êîäà äëÿ ïëàòôîðìû Win32, íàïèñàíèè ñöåíàðè-
åâ, ýêñïëóàòèðóþùèõ èçâåñòíûå óÿçâèìîñòè è ðàçðàáîòêå èíòåðôåéñîâ.
Îäíî âðåìÿ ×åä ðàáîòàë ñåòåâûì àäìèíèñòðàòîðîì â ñåòè öåíòðîâ îáó÷åíèÿ
ðàáîòå ñ êîìïüþòåðàìè Computer America Training Centers.
Предисловие
Об авторе предисловия
Наступит ли «судный день»?
Ñòþàðò Ìàêêëþð (Stuart
Stuart McClure
McClure) – îáëàäàòåëü ñåðòèôèêàòîâ CISSP, CNE,
CCSE. Îí ðàáîòàåò ñòàðøèì âèöå-ïðåçèäåíòîì ïîäðàçäåëåíèÿ ïî ðàçðàáîòêå Ñî âðåìåí ïîÿâëåíèÿ ïåðâûõ êîìïüþòåðîâ èíäóñòðèÿ áåçîïàñíîñòè ïðîøëà
ïðîãðàìì äëÿ óïðàâëåíèÿ ðèñêàìè â êîìïàíèè McAfee, Inc., ãäå îòâå÷àåò çà íåìàëûé ïóòü. Âèðóñû, ÷åðâè è çëîíàìåðåííûå ïðîãðàììû òåõ äàâíî ìèíóâ-
âûðàáîòêó ñòðàòåãèè è ìàðêåòèíã äëÿ ñåìåéñòâà ïðîãðàììíûõ ïðîäóêòîâ øèõ äíåé íè÷òî ïî ñðàâíåíèþ ñ ñîâðåìåííûìè óãðîçàìè. È â ïðîöåññå ðàç-
âèòèÿ èíäóñòðèÿ îêàçàëàñü ó êðèòè÷åñêîé ÷åðòû. Ñòàíåò ëè ïîñòîÿííî ðàñòó-
McAfee Foundstone ïî óïðàâëåíèþ è ñíèæåíèþ ðèñêîâ. Ýòè ïðîäóêòû ïîçâî-
ùàÿ ñëîæíîñòü (à íàì ïðèõîäèòñÿ âñå áîëüøå óñëîæíÿòü íàøè ñðåäñòâà)
ëÿþò êîìïàíèÿì åæåãîäíî ýêîíîìèòü ìèëëèîíû äîëëàðîâ è ÷åëîâåêî÷àñîâ
óãðîçîé äëÿ ñîâðåìåííîãî îáùåñòâà, êóëüòóðû è ðûíêîâ?
çà ñ÷åò ïðîòèâîñòîÿíèÿ õàêåðñêèì àòàêàì, âèðóñàì, ÷åðâÿì è ïðî÷èì çëîíà-
Îáðàòèìñÿ ê ôàêòàì. Åñëè ñðàâíèòü, ñêîëüêî âðåìåíè òðåáîâàëîñü íà ïðå-
ìåðåííûì ïðîãðàììàì. Äî ýòîãî Ñòþàðò áûë îñíîâàòåëåì, ïðåçèäåíòîì è
âðàùåíèå îáíàðóæåííîé óÿçâèìîñòè â ãîòîâîãî ÷åðâÿ â 1999 ãîäó è ñåãîäíÿ,
ãëàâíûì òåõíîëîãîì â êîìïàíèè Foundstone, Inc., ïðèîáðåòåííîé McAfee
òî îêàæåòñÿ, ÷òî ñàìîðàñïðîñòðàíÿþùèéñÿ ÷åðâü òåïåðü èçãîòàâëèâàåòñÿ
â îêòÿáðå 2004 ãîäà.
â 20 ðàç áûñòðåå: çà ÷åòûðíàäöàòü äíåé â 2004 ãîäó ïðîòèâ 280 äíåé â 1999.
Ñòþàðò øèðîêî èçâåñòåí ñâîèìè îáøèðíûì è ãëóáîêèìè ïîçíàíèÿìè
Òàêèõ ÷åðâåé ëåãêî ñîçäàòü, äëÿ ýòîãî íå íóæíî ïî÷òè íèêàêèõ çíàíèé,
â îáëàñòè èíôîðìàöèîííîé áåçîïàñíîñòè è ñ÷èòàåòñÿ îäíèì èç âåäóùèõ àâ-
à çàïóñêàþò èõ áåç âñÿêîãî çàçðåíèÿ ñîâåñòè. È, ñòàëî áûòü, áîëüøåå ÷èñëî
òîðèòåòîâ â ýòîé ñôåðå. Îí ìíîãî ïóáëèêóåòñÿ è îáëàäàåò 15-ëåòíèì îïûòîì
õàêåðîâ îðãàíèçóåò áîëüøåå ÷èñëî àòàê çà ìåíüøåå âðåìÿ.
òåõíè÷åñêîãî è àäìèíèñòðàòèâíîãî ðóêîâîäñòâà.  Foundstone îí îñóùåñòâ- Âïåðâûå ìû ïîçíàêîìèëèñü ñ ýòèìè íîâûìè, áîëåå èçîùðåííûìè èçäå-
ëÿë âûðàáîòêó ñòðàòåãèè ðàçâèòèÿ, à òàêæå íåñ îòâåòñòâåííîñòü çà âåñü öèêë ëèÿìè â êîíöå 90-õ ãîäîâ íà ïðèìåðå ÷åðâÿ «sadmind». Îí íà÷àë ñ àòàêè íà
ðàçðàáîòêè, ïîääåðæêè è ðåàëèçàöèè. Îáëàäàÿ íåñîìíåííûìè ëèäåðñêèìè ñëóæáó RPC â îïåðàöèîííîé ñèñòåìå Solaris, êîòîðàÿ íàçûâàëàñü sadmind.
êà÷åñòâàìè, Ñòþàðò äîáèëñÿ åæåãîäíîãî 100-ïðîöåíòíîãî ðîñòà äîõîäîâ Ñêîìïðîìåòèðîâàâ ñèñòåìó ïîä óïðàâëåíèåì Sun Solaris, ÷åðâü çàòåì ïåðå-
ñ ìîìåíòà îñíîâàíèÿ êîìïàíèè â 1999 ãîäó. áðàëñÿ íà ìàøèíû ïîä óïðàâëåíèåì Windows, ïðåâðàòèâ è èõ â äîáû÷ó õàêå-
Äî ñîçäàíèÿ êîìïàíèè Foundstone Ñòþàðò çàíèìàë ðàçëè÷íûå ðóêîâîäÿùèå ðà. Ìû âèäåëè è ÷åðâåé, ñïîñîáíûõ îäíîâðåìåííî àòàêîâàòü ðàçëè÷íûå ñåð-
äîëæíîñòè â èíäóñòðèè èíôîðìàöèîííûõ òåõíîëîãèé, â òîì ÷èñëå â ãðóïïå ìî- âèñû. Ñòàëêèâàëèñü ìû è ñ ÷åðâÿìè, ìåíÿþùèìè ñâîå îáëè÷üå, ÷òî äåëàëî
íèòîðèíãà íàöèîíàëüíîé áåçîïàñíîñòè â êîìïàíèè Ernst & Young, äâà ãîäà çàäà÷ó èõ îáíàðóæåíèÿ è çàùèòû îò íèõ íåèìîâåðíî òðóäíîé. Èìåííî òà-
ïðîðàáîòàë àíàëèòèêîì ïðîìûøëåííîñòè â öåíòðå òåñòèðîâàíèÿ InfoWorld, êèå ñìåøàííûå óãðîçû îæèäàþò íàñ â áóäóùåì, íî íå â âèäå îòäåëüíûõ ÷åð-
ïÿòü ëåò áûë äèðåêòîðîì ïî èíôîðìàöèîííûì òåõíîëîãèÿì â ïðàâèòåëü- âåé. Çàâòðàøíèå ÷åðâè áóäóò ñî÷åòàòü â ñåáå âñå âûøåïåðå÷èñëåííûå îñî-
ñòâå øòàòà Êàëèôîðíèÿ, äâà ãîäà ÿâëÿëñÿ âëàäåëüöåì êîíñàëòèíãîâîé ôèðìû áåííîñòè (ìíîãîïëàòôîðìåííîñòü, ïîëèôîðìíîñòü è ìíîãîâåêòîðíîñòü) â
â òîé æå îáëàñòè è äâà ãîäà ðàáîòàë â óíèâåðñèòåòå øòàòà Êîëîðàäî. ñòðåìëåíèè ñîçäàòü «÷åðâÿ ñóäíîãî äíÿ», îò êîòîðîãî íå áóäåò çàùèòû.
Ñòþàðò ïîëó÷èë ó÷åíóþ ñòåïåíü áàêàëàâðà ïñèõîëîãèè è ôèëîñîôèè ñ óïî- À êàêîãî ðîäà âðåä ìîãóò íàíåñòè òàêèå ÷åðâè? Îíè ìîãóò âîçäåéñòâîâàòü
ðîì íà ïðèëîæåíèÿ ê èíôîðìàòèêå â óíèâåðñèòåòå øòàòà Êîëîðàäî, Áîóëäåð. íà âñå, ÷òî óãîäíî. Çíà÷èòåëüíàÿ äîëÿ íàøèõ ðûíêîâ, èíôðàñòðóêòóðû è áàí-
Ïîçæå îí ïîëó÷èë ìíîãî÷èñëåííûå ñåðòèôèêàòû, â òîì ÷èñëå ISC2 CISSP, êîâ êîìïüþòåðèçîâàíà è ñâÿçàíà â åäèíóþ ñåòü. Ïîäóìàéòå, ÷òî ñëó÷èòñÿ,
Novell CNE è Check Point CCSE. åñëè âû íå ñìîæåòå â òå÷åíèå ìåñÿöà äîáðàòüñÿ äî ñâîèõ äåíåã â áàíêå èëè
áðîêåðñêîé êîíòîðå? Èëè, ïåðåñåêàÿ æåëåçíîäîðîæíûé ïóòü èëè ïåðåêðåñòîê,
íå áóäåòå óâåðåíû, ÷òî âîäèòåëè ìàøèí, ïîäúåçæàþùèõ ñ äðóãîé ñòîðîíû,
âèäÿò íå òîò æå ñâåò, ÷òî è âû. Ïîëàãàåòå, òàêîå áûâàåò òîëüêî â ôàíòàñòè-
÷åñêèõ ðîìàíàõ? Íå áóäüòå òàê óâåðåíû.
Âîçüìåì, ê ïðèìåðó, íåäàâíåãî ÷åðâÿ Banker.J. Âî âðåìÿ èñïîëíåíèÿ îí
çàðàæàåò ñèñòåìó ïðèìåðíî òàê æå, êàê è îïèñàííûå âûøå ÷åðâè, íî ñ îä-
30 Предисловие. Наступит ли судный день?

íèì ñóùåñòâåííûì îòëè÷èåì: ýòî ïåðâûé èç ñåðèè ÷åðâåé, â êîòîðûõ ïðèìå-


íåíà òåõíèêà ïîäëîãà (phishing). Ïðè òàêîé àòàêå õàêåð ïûòàåòñÿ ïîõèòèòü
ó÷åòíîå èìÿ è ïàðîëü ê áàíêîâñêîìó ñ÷åòó, ïåðåàäðåñóÿ âàñ íà Web-ñàéò, ñî-
Глава 1
çäàííûé àòàêóþùèì. À çàòåì îí âîñïîëüçóåòñÿ ïîëó÷åííûìè äàííûìè, ÷òî-
áû çàéòè â áàíê îò âàøåãî èìåíè è âûïèñàòü ñåáå ñàìîìó ÷åê. Îäíàêî ÷åðâü
íå ïåðåàäðåñóåò ïîëüçîâàòåëÿ íà äðóãîé ñàéò, à ïðîñòî âûâîäèò èäåíòè÷íóþ
Web-ñòðàíèöó íà çàðàæåííîé ñèñòåìå, çàñòàâëÿÿ åãî ïîâåðèòü, áóäòî îí ïî-
ïàë íà ñàéò ñâîåãî áàíêà.
Написание
Òàê êòî æå ýòè ëþäè è ïî÷åìó îíè çàíèìàþòñÿ òàêèìè âåùàìè? Ìíîãèå
èç íèõ íå ñëèøêîì óìíû, èìè äâèæåò æåëàíèå ïîòåøèòü ñâîå ß è èñïûòàòü
÷óâñòâî ïðåâîñõîäñòâà. Äðóãèõ ïðèâëåêàþò äåíüãè, îíè âîâëå÷åíû â îðãàíè-
безопасных программ
çîâàííóþ ïðåñòóïíîñòü. Íî êàêèå áû ïðè÷èíû íè ñòîÿëè çà àòàêîé ïóòåì
ïîäëîãà, âû äîëæíû ïîíèìàòü ñóòü ïðîáëåìû è áûòü ãîòîâûì ê âñòðå÷å
ñ íåé. Óÿçâèìûå ìåñòà åñòü â ëþáîì ïðîäóêòå èëè ïðîöåññå è, åñëè íå îáðà-
ùàòü íà íèõ âíèìàíèå è ìèíèìèçèðîâàòü âîçìîæíûé óùåðá, òî õàêåðû áó-
äóò ýêñïëóàòèðîâàòü èõ áåñêîíå÷íî. Íå ñóùåñòâóåò íè ñåðåáðÿíîé ïóëè, íè
âîëøåáíîãî ïîðîøêà, êîòîðûé èçáàâèë áû âàñ îò ïðîáëåìû. Íåò êàêîãî-òî
îäíîãî ïðîäóêòà, óñëóãè èëè ó÷åáíîãî êóðñà, êîòîðûé äàñò âàì âñå èíñòðó- Описание данной главы:
ìåíòû, íåîáõîäèìûå äëÿ ïðîòèâîñòîÿíèÿ óãðîçå.  Введение
Êàê ñîëäàòó íà ïîëå áîÿ, âàì ïðèãîäèòñÿ âñå, äî ÷åãî âû ìîæåòå äîáðàòü-  С/С++
ñÿ. Ñ÷èòàéòå ýòó êíèãó ñâîåé àìóíèöèåé, åå äîëæåí ïðî÷èòàòü âñÿêèé ñîëäàò  Java
âîéñê áåçîïàñíîñòè, íå æåëàþùèé ñòàòü î÷åðåäíîé æåðòâîé. Ïðî÷òèòå åå  C#
ñòðàíèöó çà ñòðàíèöåé, óñâîéòå ìàòåðèàë è âîñïîëüçóéòåñü ïîëó÷åííûìè çíà-  Perl
íèÿìè ñåáå âî áëàãî. Íå äàéòå ýòîé çàìå÷àòåëüíîé ðàáîòå ïðîñêîëüçíóòü  Python
ìåæ âàøèìè «àêàäåìè÷åñêèìè ïàëüöàìè».
Áåçîïàñíîé ðàáîòû âàì.  Резюме
Ñòþàðò Ìàêêëþð  Обзор изложенного материала
Ñòàðøèé âèöå-ïðåçèäåíò ïîäðàçäåëåíèÿ  Часто задаваемые вопросы
ïî ðàçðàáîòêå ïðîãðàìì äëÿ óïðàâëåíèÿ ðèñêàìè
McAfee, Inc.
32 Глава 1. Написание безопасных программ С/С++ 33

íîñòü è îáúåì êîäà, íåîáõîäèìîãî äëÿ ðåøåíèÿ êîíêðåòíîé çàäà÷è. Áåçóñ-


Введение ëîâíî, ÿçûêè ñöåíàðèåâ ñòàëè ìå÷òîé ëåíèâîãî ïðîãðàììèñòà.
Ïî÷èòàåìûì ïðåäêîì âñåõ èíòåðïðåòèðóåìûõ ÿçûêîâ ÿâëÿåòñÿ ÿçûê
Èñòîðèÿ ÿçûêîâ ïðîãðàììèðîâàíèÿ êîðîòêà, íî äèíàìè÷íà. Åùå íå òàê óïðàâëåíèÿ çàäàíèÿìè (JCL – job control language).  ñèñòåìå OS/360 ýòîò
äàâíî ïåðåäîâûì ñ÷èòàëñÿ ÿçûê àññåìáëåðà. Íî ñ òåõ ïîð ïðîãðàììèðîâà- ÿçûê èñïîëüçîâàëñÿ äëÿ îðãàíèçàöèè äàííûõ, ïîñòóïàþùèõ ñ ïåðôîêàðò,
íèå ïðîøëî äëèííûé ïóòü, íà êîòîðîì îáîãàòèëîñü íîâûìè èäåÿìè è òåõíî- â ïðèãîäíûå äëÿ ðàáîòû íàáîðû ñèìâîëîâ. Åñëè ïðèíÿòü âî âíèìàíèå âîç-
ëîãèÿìè: îò îáúåêòîâ äî èíñòðóìåíòîâ âèçóàëüíîãî ïðîãðàììèðîâàíèÿ. Ñå- ìîæíîñòè ÿçûêà è åãî ïðèìèòèâíóþ ïðèðîäó, òî íàêëàäíûå ðàñõîäû áûëè
ãîäíÿ ñóùåñòâóåò òðè îñíîâíûõ ïàðàäèãìû ïðîãðàììèðîâàíèÿ: ïðîöåäóðíàÿ ïðîñòî ãèãàíòñêèìè. Ïåðâûì ïîëó÷èâøèì øèðîêîå ðàñïðîñòðàíåíèå ÿçû-
(íàïðèìåð, C è Pascal), ôóíêöèîíàëüíàÿ (Lisp è ML) è îáúåêòíî-îðèåíòèðî- êîì ñöåíàðèåâ ñòàë ÿçûê èíòåðïðåòàòîðà êîìàíä sh â ñèñòåìå UNIX. Ïåðâîíà-
âàííàÿ (Java, C++ è Smalltalk). Ëîãè÷åñêîå èëè äåêëàðàòèâíîå ïðîãðàììèðî- ÷àëüíî îí ïðåäíàçíà÷àëñÿ äëÿ àäìèíèñòðàòîðîâ è ïîçâîëÿë áûñòðî ñîçäà-
âàíèå (íàïðèìåð, Prolog) îñòàåòñÿ óäåëîì àêàäåìè÷åñêèõ èññëåäîâàíèé. âàòü ñöåíàðèè äëÿ óïðàâëåíèÿ ñåòüþ è ñèñòåìîé â öåëîì.
Êàæäàÿ ïàðàäèãìà çíàìåíóåò ñîáñòâåííûé ïîäõîä ê ðåøåíèþ çàäà÷. Ïðî- Ïî ìåðå òîãî êàê ïðîèçâîäèòåëüíîñòü è ôóíêöèîíàëüíîñòü ïëàòôîðìû
öåäóðíóþ ïðîãðàììó ìîæíî ðàññìàòðèâàòü êàê ïîñëåäîâàòåëüíîñòü èíñò- ðîñëà áåçóìíûìè òåìïàìè, ÷èñëî èíòåðïðåòèðóåìûõ ÿçûêîâ ïðåâûñèëî
ðóêöèé, êîòîðûå íà êàæäîì øàãå ìîäèôèôèöèðóþò äàííûå, ðàçìåùåííûå ÷èñëî ïîëíîìàñøòàáíûõ êîìïèëèðóåìûõ ÿçûêîâ ïðîãðàììèðîâàíèÿ. Ñöå-
â îïðåäåëåííûõ ÿ÷åéêàõ ïàìÿòè. Òàêèå ïðîãðàììû ñîäåðæàò êîíñòðóêöèè íàðèè ïðåâðàòèëèñü â âåñüìà ðàçâèòóþ òåõíîëîãèþ, ñâèäåòåëüñòâîì ÷åìó ìî-
äëÿ ïîâòîðåíèÿ, íàïðèìåð, öèêëû è ïðîöåäóðû. Ôóíêöèîíàëüíóþ ïðîãðàììó ãóò ñëóæèòü øèðîêèå âîçìîæíîñòè, çàëîæåííûå â òàêèå ÿçûêè, êàê PHP, Py-
ìîæíî ïðåäñòàâëÿòü ñåáå êàê íàáîð ôóíêöèé íàä çàäàííûìè èñõîäíûìè thon, Perl è Javascri pt. Ñîâðåìåííûå ÿçûêè ñöåíàðèåâ óæå ñîäåðæàò îáúåêò-
äàííûìè. Â èñòèííî ôóíêöèîíàëüíûõ ïðîãðàììàõ íåò ïðèñâàèâàíèé ïåðå- íî-îðèåíòèðîâàííûå ñðåäñòâà, ñîçäàíèå êëàññîâ, óïðàâëåíèå ïàìÿòüþ,
ìåííûì; äëÿ ïîëó÷åíèÿ òðåáóåìîãî ðåçóëüòàòà äîñòàòî÷íî îäíèõ ëèøü ñïèñ- ñîçäàíèå ñîêåòîâ, ðåêóðñèþ, äèíàìè÷åñêèå ìàññèâû è ðåãóëÿðíûå âûðàæå-
êîâ è ôóíêöèé. Îáúåêòíî-îðèåíòèðîâàííûå ïðîãðàììû îðãàíèçîâàíû íèÿ. Åñòü äàæå èíòåðïðåòèðóåìûå ÿçûêè, ïîçâîëÿþùèå ðàçðàáàòûâàòü
â êëàññû. Ýêçåìïëÿðû êëàññîâ, èìåíóåìûå îáúåêòàìè, ñîäåðæàò äàííûå è ìå- ãðàôè÷åñêèå èíòåðôåéñû, íàïðèìåð, ïîïóëÿðíûé ÿçûê TCL/Tk.
òîäû, âûïîëíÿþùèå òå èëè èíûå äåéñòâèÿ íàä ýòèìè äàííûìè. Îáúåêòû Â ýòîé ãëàâå âû ïîçíàêîìèòåñü êàê ñ óíèêàëüíûìè, òàê è ñ îáùèìè äëÿ
âçàèìîäåéñòâóþò, ïîñûëàÿ äðóã äðóãó ñîîáùåíèÿ, â êîòîðûõ ñîäåðæàòñÿ çà- ðàçíûõ ÿçûêîâ ñðåäñòâàìè è óçíàåòå î íåêîòîðûõ ïðèåìàõ, ïðèìåíÿåìûõ
ïðîñû íà âûïîëíåíèå îïðåäåëåííûõ äåéñòâèé. ïðîôåññèîíàëàìè.
Ïîíèìàòü îñîáåííîñòè ÿçûêîâ ïðîãðàììèðîâàíèÿ íåîáõîäèìî êàê ïðè-
êëàäíûì ïðîãðàììèñòàì, òàê è ñïåöèàëèñòàì ïî áåçîïàñíîñòè, çàíÿòûì
òåñòèðîâàíèåì ïðèëîæåíèé. Ó êàæäîãî ÿçûêà åñòü ñïåöèôè÷åñêèå õàðàêòå-
ðèñòèêè, êîòîðûå íóæíî ó÷èòûâàòü ïðè ïîïûòêå âçëîìà ïðîãðàììû. Íà-
C/C++
ïðèìåð, ïðîãðàììèñòû, ïðèâûêøèå ïèñàòü «ýêñïëîéòû», îñíîâàííûå íà ïå- ßçûê ïðîãðàììèðîâàíèÿ C ñîçäàë Äåííèñ Ðè÷è èç êîìïàíèè Bell Labs â 1972 ãî-
ðåïîëíåíèè áóôåðà â ïðîãðàììàõ íà ÿçûêå C, ìîãóò âïàñòü â ðàñòåðÿííîñòü, äó. Ñ òåõ ïîð C ñòàë îäíèì èç îñíîâíûõ ÿçûêîâ ïðîôåññèîíàëüíûõ ïðîãðàììè-
êîãäà äëÿ àóäèòà áóäåò ïðåäñòàâëåíî ïðèëîæåíèå, íàïèñàííîå íà Java. Ïðî÷è- ñòîâ è ãëàâíûì ÿçûêîì â îïåðàöèîííîé ñèñòåìå UNIX.  1980 ãîäó Áüÿðí Ñòðà-
òàâ ýòó ãëàâó, âû ïîëó÷èòå îáùåå ïðåäñòàâëåíèå î òàêîãî ðîäà àñïåêòàõ áåçî- óñòðóï èç òîé æå êîìïàíèè Bell Labs ïðèñòóïèë ê âêëþ÷åíèþ â C îáúåêòíî-
ïàñíîñòè, ñâÿçàííûõ ñ íèìè ðèñêàõ è î òîì, êàêèå äåôåêòû âîçìîæíû â ïðî- îðèåíòèðîâàííûõ ìåõàíèçìîâ, â ÷àñòíîñòè, èíêàïñóëÿöèè è íàñëåäîâàíèÿ.
ãðàììàõ íà ÿçûêàõ C, C++, Java è C#. Òàê â 1983 ãîäó ïîÿâèëñÿ ÿçûê «C with Classes», êîòîðûé ïîçäíåå ïîëó÷èë íà-
Íà çàðå ðàñïðîñòðàíåíèÿ îïåðàöèîííîé ñèñòåìû UNIX â êîíöå 60-õ è çâàíèå C++. Èìåÿ ñõîæèé ñ C ñèíòàêñèñ è îáëàäàÿ ïðåèìóùåñòâàìè îáúåêòíîé
â 70-õ ãîäàõ íà àâàíñöåíó âûøëè èíòåðïðåòèðóåìûå ÿçûêè, ïðèçâàííûå ñî- îðèåíòèðîâàííîñòè, ÿçûê C++ áûñòðî ïðèîáðåë øèðîêóþ ïîïóëÿðíîñòü.
êðàòèòü âðåìÿ ðàçðàáîòêè íåáîëüøèõ çàäà÷. Îíè ïîçâîëÿëè ýíòóçèàñòàì ïðî- ßçûêè C è C++ òàê øèðîêî ðàñïðîñòðàíåíû áëàãîäàðÿ ñâîåé âûðàçèòåëü-
ãðàììèðîâàíèÿ ñîçäàâàòü ñöåíàðèè, òî åñòü íàáîðû èíòåðïðåòèðóåìûõ íîé ìîùè, à òàêæå ïîòîìó, ÷òî èìåííî èõ ïðåäïî÷èòàþò ïðåïîäàâàòü â óíè-
èíñòðóêöèé, êîòîðûå êîìïüþòåð ìîã âûïîëíèòü. Òàêèå óòîìèòåëüíûå ïðî- âåðñèòåòàõ. Õîòÿ íîâûå ÿçûêè, ê ïðèìåðó, C# è Java, ïîñòåïåííî íàáèðàþò
áëåìû êàê óïðàâëåíèå ïàìÿòüþ è ðàáîòà ñ íèçêîóðîâíåâûìè ñèñòåìíûìè ïîïóëÿðíîñòü, íî ïðîãðàììèñòû, óìåþùèå ïèñàòü íà C è C++, áóäóò âîñòðå-
êîìàíäàìè, òåïåðü âûïîëíÿëèñü «çà êóëèñàìè», ÷òî ïîçâîëèëî ñíèçèòü ñëîæ- áîâàíû åùå ìíîãî ëåò.
34 Глава 1. Написание безопасных программ С/С++ 35

Характеристики языка âîçìîæíîñòÿìè. Îñîáåííî õîðîøî ÿçûê C ïîäõîäèò äëÿ ðàáîòû â ñèñòåìå
UNIX, à òàêæå â òåõ ñëó÷àÿõ, êîãäà íóæíî âûïîëíèòü áîëüøîé îáúåì âû÷èñ-
Ïîñêîëüêó âûñîêîóðîâíåâûå ÿçûêè C è C++ ÿâëÿþòñÿ êîìïèëèðóåìûìè, òî ëåíèé èëè ðåøèòü ñëîæíóþ çàäà÷ó áûñòðî è ýôôåêòèâíî.
íàïèñàííûé íà íèõ òåêñò íå ïîíÿòåí ïðîöåññîðó. Ñïåöèàëüíàÿ ïðîãðàììà-
êîìïèëÿòîð òðàíñëèðóåò ýòîò òåêñò â ìàøèííûé êîä, êîòîðûé ïðîöåññîð ìî- ßçûê C++
æåò èñïîëíèòü.  îòëè÷èå îò èíòåðïðåòèðóåìûõ ÿçûêîâ, ê ÷èñëó êîòîðûõ
îòíîñèòñÿ Java, íå ñóùåñòâóåò íèêàêîãî áàéò-êîäà èëè ïðîìåæóòî÷íîãî ÿçû- ßçûê C++ ÿâëÿåòñÿ ðàñøèðåíèåì C. Ñèíòàêñèñ è íàáîð îïåðàòîðîâ ñõîæè
êà. Ïðîãðàììû, íàïèñàííûå íà C èëè C++, òðàíñëèðóþòñÿ íåïîñðåäñòâåííî ñ òåì, ÷òî åñòü â C, íî ïðè ýòîì äîáàâëåíû ÷åðòû, õàðàêòåðíûå äëÿ îáúåêòíî-
â êîìàíäû, äîñòóïíûå ïðîöåññîðó. Ó òàêîãî ïîäõîäà åñòü íåäîñòàòîê – çàâè- îðèåíòèðîâàííîãî ïðîãðàììèðîâàíèÿ, à èìåííî:
ñèìîñòü îò ïëàòôîðìû. Êîä äîëæåí áûòü ñêîìïèëèðîâàí èìåííî äëÿ òîé ñè-  Èíêàïñóëÿöèÿ
Èíêàïñóëÿöèÿ. Çà ñ÷åò èñïîëüçîâàíèÿ êëàññîâ îáúåêòíî-îðèåíòèðî-
ñòåìû, íà êîòîðîé áóäåò èñïîëíÿòüñÿ. âàííûé êîä èìååò î÷åíü õîðîøóþ îðãàíèçàöèþ è îáëàäàåò âûñîêîé
ìîäóëüíîñòüþ. Äàííûå è ìåòîäû äëÿ âûïîëíåíèÿ îïåðàöèé íàä íèìè
ßçûê C èíêàïñóëèðîâàíû â ñòðóêòóðó êëàññà;
ßçûê C çíàìåíèò ñâîåé óíèâåðñàëüíîñòüþ, ñî÷åòàåìîé ñ ïðîñòîòîé. ×èñëî  Íàñëåäîâàíèå
Íàñëåäîâàíèå. Îáúåêòíî-îðèåíòèðîâàííàÿ îðãàíèçàöèÿ è èíêàïñóëÿ-
çàðåçåðâèðîâàííûõ ñëîâ â íåì íåâåëèêî, íî ôóíêöèîíàëüíîñòü òåì íå ìåíåå öèÿ ïîçâîëÿþò áåç òðóäà ðåàëèçîâàòü ïîâòîðíîå èñïîëüçîâàíèå èëè
âåñüìà âûñîêà. Íåáîëüøîå ÷èñëî çàðåçåðâèðîâàííûõ ñëîâ íå ìåøàåò ïðî- «íàñëåäîâàíèå» ðàíåå íàïèñàííîãî êîäà. Íàñëåäîâàíèå ýêîíîìèò âðå-
ãðàììèñòó âûðàçèòü òî, ÷òî îí õî÷åò. Ê óñëóãàì ïðîãðàììèñòîâ íà C èìåþòñÿ ìÿ, òàê êàê ïðîãðàììèñòó íå íóæíî çàíîâî êîäèðîâàòü óæå èìåþùó-
ðàçíîîáðàçíûå îïåðàòîðû è âîçìîæíîñòü ñîçäàâàòü ñîáñòâåííûå òèïû äàí- þñÿ ôóíêöèîíàëüíîñòü;
íûõ. Ïðîñòîòà ÿçûêà ïîçâîëÿåò íàó÷èòüñÿ åãî îñíîâàì ëåãêî è áûñòðî.  Ñîêðûòèå äàííûõ
äàííûõ. Îáúåêòû, òî åñòü ýêçåìïëÿðû êëàññà ìîãóò ñîäåð-
Ìîùü ÿçûêà C ïðîèñõîäèò îò îòñóòñòâèÿ â íåì îãðàíè÷åíèé; ïðîãðàììèñò æàòü äàííûå, êîòîðûå íå ìîãóò áûòü èçìåíåíû èíà÷å êàê ñ ïîìîùüþ
ìîæåò ïîëó÷àòü äîñòóï ê äàííûì è ìàíèïóëèðîâàòü èìè íà óðîâíå áèòîâ. ìåòîäîâ ñàìîãî ýòîãî êëàññà. Ïðîãðàììèñò íà C++ ìîæåò ñêðûòü äàí-
Øèðîêî ðàñïðîñòðàíåíî òàêæå èñïîëüçîâàíèå óêàçàòåëåé, òî åñòü ïðÿìûõ íûå, íàçíà÷èâ èì àòðèáóò «private» (çàêðûòûé);
ññûëîê íà ÿ÷åéêè ïàìÿòè.  áîëåå ïîçäíèõ ÿçûêàõ, íàïðèìåð, â Java ýòà âîç-  Àáñòðàêòíûå òèïû äàííûõ
äàííûõ. Ïðîãðàììèñò ìîæåò îïðåäåëèòü êëàññ,
ìîæíîñòü óäàëåíà. C – ýòî ïðîöåäóðíûé ÿçûê. Íàïèñàííàÿ íà íåì ïðîãðàììà êîòîðûé ìîæíî ïðåäñòàâëÿòü ñåáå êàê îáîáùåíèå ñòðóêòóðû (struct),
ñîñòîèò èç ôóíêöèé, ïðåäñòàâëÿþùèõ ñîáîé àâòîíîìíûå êîíñòðóêöèè äëÿ èìåþùåéñÿ â ÿçûêå C. Êëàññ îïèñûâàåò îïðåäåëåííûé ïðîãðàììèñòîì
ðåøåíèÿ îòäåëüíûõ çàäà÷. Ìîäóëüíîñòü ïîçâîëÿåò èñïîëüçîâàòü êîä ïîâòîð- òèï äàííûõ âìåñòå ñ îïåðàöèÿìè, ïðèìåíèìûìè ê îáúåêòàì ýòîãî
íî. Ãðóïïû ôóíêöèé ìîæíî îáúåäèíèòü â áèáëèîòåêè, äîïóñêàþùèå èì- òèïà.
ïîðò â äðóãèå ïðîãðàììû, ÷òî çàìåòíî ñîêðàùàåò âðåìÿ ðàçðàáîòêè.  îòëè÷èå îò Java, ÿçûê C++ íå ÿâëÿåòñÿ ïîëíîñòüþ îáúåêòíî-îðèåíòèðî-
C òàêæå î÷åíü ýôôåêòèâíûé ÿçûê. Íåêîòîðûå àëãîðèòìû âîçìîæíî ðåà-
âàííûì. Íà íåì ìîæíî ïèñàòü ïðîãðàììû â ñòèëå C, íå ïîëüçóÿñü îáúåêòíî-
ëèçîâàòü ìàøèííî-çàâèñèìûì ñïîñîáîì, âîñïîëüçîâàâøèñü îñîáåííîñòÿìè
îðèåíòèðîâàííûìè ðàñøèðåíèÿìè.
àðõèòåêòóðû ìèêðîïðîöåññîðà. Ïðîãðàììà íà C òðàíñëèðóåòñÿ íåïîñðåä-
ñòâåííî â ìàøèííûé êîä, ïîýòîìó èñïîëíÿåòñÿ áûñòðåå ïðîãðàììû íà «èí-
òåðïðåòèðóåìîì» ÿçûêå òèïà Java. Òàêîå áûñòðîäåéñòâèå îêàçûâàåòñÿ ñó-
Áåçîïàñíîñòü
ùåñòâåííûì äëÿ ìíîãèõ ïðèëîæåíèé, îñîáåííî ðàáîòàþùèõ â ðåàëüíîì ßçûêè C è C++ ðàçðàáàòûâàëèñü äî ñòðåìèòåëüíîãî íàñòóïëåíèÿ Èíòåðíåòà,
ìàñøòàáå âðåìåíè, íî ó íåãî åñòü è îáðàòíàÿ ñòîðîíà: êîä, íàïèñàííûé íà C, ïîýòîìó ïåðâîî÷åðåäíîå âíèìàíèå áåçîïàñíîñòè íå óäåëÿëîñü. Òèïè÷íîé
íå ÿâëÿåòñÿ ïëàòôîðìåííî-íåçàâèñèìûì. Ïðè ïåðåíîñå íà íîâóþ ïëàòôîð- óÿçâèìîñòüþ äëÿ ïðîãðàìì, íàïèñàííûõ íà ýòèõ ÿçûêàõ, ÿâëÿåòñÿ ïåðåïîëíå-
ìó ÷àñòè ïðîãðàììû èíîãäà ïðèõîäèòñÿ ïåðåïèñûâàòü. Èç-çà äîïîëíèòåëü- íèå áóôåðà. Îá ýòîé ïðîáëåìå ìíîãèå óçíàëè èç ñòàòüè Ýëèàñà Ëåâè (El ias
íûõ óñèëèé íå âñåãäà ñóùåñòâóåò âåðñèÿ êîíêðåòíîé C-ïðîãðàììû äëÿ íîâîé Levy) (îïóáëèêîâàííîé ïîä ïñåâäîíèìîì «Aleph One») «Smashing the Stack for
îïåðàöèîííîé ñèñòåìû èëè íàáîðà ìèêðîñõåì. Fun and Profit» (Ìàíèïóëÿöèè ñî ñòåêîì äëÿ çàáàâû è ïîëüçû). Ñ ïîìîùüþ
Òåì íå ìåíåå, ÿçûê C î÷åíü ïîëþáèëñÿ ïðîãðàììèñòàì. Ïðîãðàììû íà îïèñàííîé òàì òåõíèêè àòàêóþùèé ìîæåò îáíàðóæèòü ó÷àñòîê ïðîãðàììû,
íåì ìîãóò âûãëÿäåòü ïðîñòî è ýëåãàíòíî, îáëàäàÿ â òî æå âðåìÿ áîëüøèìè â êîòîðîì çíà÷åíèå ñ÷èòûâàåòñÿ â îáëàñòü ôèêñèðîâàííîãî ðàçìåðà, à çàòåì
36 Глава 1. Написание безопасных программ С/С++ 37

ïåðåäàòü ïðîãðàììå áîëåå äëèííîå çíà÷åíèå, âûçâàâ òåì ñàìûì ïåðåïîëíå- áåç àðãóìåíòîâ (î ÷åì ãîâîðèò êëþ÷åâîå ñëîâî void), âîçâðàùàþùåé öåëîå
íèå ñòåêà èëè «êó÷è», è êàê ñëåäñòâèå ïîëó÷èòü äîñòóï ê çàùèùåííîé îáëà- ÷èñëî. Ïðåäëîæåíèå printf â ñòðîêå 3 ïå÷àòàåò ñòðîêó íà òàê íàçûâàåìûé ñòàí-
ñòè ïàìÿòè. äàðòíûé âûâîä. Êîíñòðóêöèÿ «%s» ãîâîðèò î òîì, ÷òî áóäåò íàïå÷àòàíà ïåðå-
 ÿçûêàõ C è C++ íåò ìåõàíèçìà àâòîìàòè÷åñêîãî êîíòðîëÿ âûõîäà çà ãðà- ìåííàÿ ñòðîêîâîãî òèïà, à íàäïèñü «Hello, world!» – ýòî è åñòü âûâîäèìàÿ ñòðî-
íèöû, ÷òî è äåëàåò èõ óÿçâèìûìè äëÿ àòàê ìåòîäîì ïåðåïîëíåíèÿ ñòåêà. Îò- êà. Î òèïàõ è ôóíêöèÿõ ìû áóäåì åùå ïîäðîáíî ãîâîðèòü íèæå â ýòîé ãëàâå.
âåòñòâåííîñòü çà ðåàëèçàöèþ òàêîãî êîíòðîëÿ äëÿ êàæäîé ïåðåìåííîé, ñ÷è-
òûâàåìîé èç âíåøíåãî èñòî÷íèêà, âîçëàãàåòñÿ íà ïðîãðàììèñòà.  ÿçûêàõ C#
è Java ðèñêà ïåðåïîëíåíèÿ áóôåðà íåò, òàê êàê êîíòðîëü âûõîäà çà ãðàíèöû
Типы данных
ïðîèçâîäèòñÿ àâòîìàòè÷åñêè. Òèïû äàííûõ ñëóæàò â ÿçûêàõ ïðîãðàììèðîâàíèÿ äëÿ îïðåäåëåíèÿ ïåðåìåí-
 Ñ++ âêëþ÷åíû ñðåäñòâà äëÿ ñîêðûòèÿ äàííûõ. Âíóòðåííèå ìåòîäû è äàí- íûõ äî èõ èíèöèàëèçàöèè. Òèï îïðåäåëÿåò, êàê ïåðåìåííàÿ áóäåò ðàçìåùåíà
íûå êëàññà ìîæíî îáúÿâèòü çàêðûòûìè, òàê ÷òî îíè áóäóò äîñòóïíû òîëüêî â ïàìÿòè è êàêèå äàííûå îíà ìîæåò ñîäåðæàòü. Èíòåðåñíî îòìåòèòü, ÷òî,
âíóòðè ýòîãî êëàññà è áîëüøå íèãäå. Ïîñêîëüêó C – ýòî ÷èñòî ïðîöåäóðíûé õîòÿ òèïû äàííûõ ÷àñòî ïðèìåíÿþòñÿ äëÿ îïèñàíèÿ ðàçìåðà ïåðåìåííîé,
ÿçûê, òî ìåõàíèçìû ñîêðûòèÿ äàííûõ â íåì îòñóòñòâóþò, ïîýòîìó çëîíàìå- â ñòàíäàðòå ÿçûêà íå îïðåäåëåíû òî÷íûå ðàçìåðû êàæäîãî òèïà. Ïîýòîìó
ðåííûé ïîëüçîâàòåëü ìîæåò ïîëó÷èòü äîñòóï ê âíóòðåííèì ñòðóêòóðàì ïðî- ïðîãðàììèñò äîëæåí õîðîøî ïðåäñòàâëÿòü ñåáå ïëàòôîðìó, äëÿ êîòîðîé îí
ãðàììû íåïðåäóñìîòðåííûì ñïîñîáîì. ïèøåò êîä. Ãîâîðÿò, ÷òî ïåðåìåííàÿ ÿâëÿåòñÿ ýêçåìïëÿðîì (instance) íåêîòî-
Àòàêóÿ ïðîãðàììó, íàïèñàííóþ íà C èëè C++, ïðîòèâíèê ìîæåò òàêæå ðîãî òèïà äàííûõ. Â ÿçûêàõ C è C++ èìåþòñÿ ñëåäóþùèå ñòàíäàðòíûå òèïû
ïîëó÷èòü äîñòóï ê êðèòè÷åñêè âàæíûì îáëàñòÿì ïàìÿòè. Äåëî â òîì, ÷òî äàííûõ:
â îáîèõ ÿçûêàõ àêòèâíî ïðèìåíÿþòñÿ óêàçàòåëè, ïîçâîëÿþùèå îáðàòèòüñÿ  Int
Int. Òèï int ñëóæèò äëÿ ïðåäñòàâëåíèÿ öåëûõ ÷èñåë.  áîëüøèíñòâå ñèñ-
ê ïðîèçâîëüíîìó àäðåñó â ïàìÿòè.  Java è C# âìåñòî ýòîãî èñïîëüçóþòñÿ òåì äëÿ õðàíåíèÿ öåëîãî ÷èñëà âûäåëÿåòñÿ 4 áàéòà;
ññûëî÷íûå ïåðåìåííûå. Êðîìå òîãî, â Java ðåàëèçîâàíà ìîäåëü «ïåñî÷íèöû»  Float
Float. Òèïîì float ïðåäñòàâëÿþò ÷èñëà ñ ïëàâàþùåé òî÷êîé.  áîëüøèí-
(sandbox), â ñîîòâåòñòâèè ñ êîòîðîé ïðîãðàììû, ðàáîòàþùèå âíóòðè «ïåñî÷- ñòâå ñèñòåì ïîä íèõ îòâîäèòñÿ 4 áàéòà;
íèöû», íå ìîãóò ÷èòàòü èëè ìîäèôèöèðîâàòü âíåøíèå äàííûå. Òàêîé êîí-  Double
Double. Òèï double ñëóæèò äëÿ ïðåäñòàâëåíèÿ ÷èñåë ñ ïëàâàþùåé òî÷-
öåïöèè â ÿçûêàõ C è C++ íåò. êîé äâîéíîé òî÷íîñòè. Êàê ïðàâèëî, íà ÏÊ ïåðåìåííûå òàêîãî òèïà çà-
íèìàþò 8 áàéòîâ;
Пример «Здравствуй, мир!»  Char
Char. Òèï char ñëóæèò äëÿ ïðåäñòàâëåíèÿ ñèìâîëîâ. Â áîëüøèíñòâå ñèñ-
òåì äëÿ êàæäîãî ñèìâîëà âûäåëÿåòñÿ 1 áàéò.
Ïðîãðàììó «Çäðàâñòâóé, ìèð!» (Hello, world!) ÷àñòî ïðèâîäÿò â ïðèìåð, êàê
ïðîñòåéøóþ èç âîçìîæíûõ ïðîãðàìì íà äàííîì ÿçûêå. Íà÷èíàþùèå ïðî- Ñóùåñòâóþò òàêæå ìîäèôèêàòîðû, èçìåíÿþùèå ðàçìåð è èíòåðïðåòàöèþ
ãðàììèñòû íà ýòîì ïðèìåðå îñâàèâàþò áàçîâóþ ñòðóêòóðó ÿçûêà, ó÷àòñÿ îïèñàííûõ âûøå òèïîâ. Ê íèì îòíîñÿòñÿ short, long, signed è unsigned. Çíàêî-
ïîëüçîâàòüñÿ êîìïèëÿòîðîì è çàïóñêàòü ïðîãðàììó íà âûïîëíåíèå. Íèæå âûå (signed) òèïû ìîãóò ïðåäñòàâëÿòü êàê ïîëîæèòåëüíûå, òàê è îòðèöà-
ïðèâåäåí òåêñò òàêîé ïðîãðàììû íà ÿçûêå C. òåëüíûå çíà÷åíèÿ. Áåççíàêîâûå (unsigned) òèïû ïîçâîëÿþò ïðåäñòàâèòü
òîëüêî íåîòðèöàòåëüíûå çíà÷åíèÿ. Ïî óìîë÷àíèþ âñå ÷èñëîâûå òèïû çíà-
Пример 1.1. Здравствуй, мир! êîâûå. Íà ðèñ. 1.1 ïðèâåäåíà êëàññèôèêàöèÿ òèïîâ äàííûõ â ÿçûêàõ C/C++.
1 #include <stdio.h> ßçûêè C/C++ ïîçâîëÿþò ïðîãðàììèñòó îïðåäåëèòü ñîáñòâåííûå òèïû äàí-
2 int main( void ) { íûõ ñ ïîìîùüþ êëþ÷åâîãî ñëîâà typedef. Îíî ÷àñòî ïðèìåíÿåòñÿ, ÷òîáû ñäåëàòü
3 printf("%s", "Hello, world!"); ïðîãðàììó ïîíÿòíåå. Òàê, ñëåäóþùèå íèæå ïðèìåðû ýêâèâàëåíòíû, íî èñïîëü-
4 return 0;
5 }
çîâàíèå typedef áîëåå íàãëÿäíî ïîêàçûâàåò, ÷òî õîòåë ñêàçàòü ïðîãðàììèñò.

 ýòîì ïðèìåðå èìïîðòèðóåòñÿ ñòàíäàðòíàÿ áèáëèîòåêà ââîäà/âûâîäà. Пример 1.2. Конструкция typedef
Áåç typedef
 íåå âêëþ÷åíû ôóíêöèè, ÷àñòî èñïîëüçóåìûå â èíòåðàêòèâíûõ ïðîãðàì- int weight( void ){
ìàõ, íàïðèìåð, «printf». Äàííàÿ ïðîãðàììà ñîñòîèò âñåãî èç îäíîé ôóíêöèè int johnweight;
38 Глава 1. Написание безопасных программ С/С++ 39

 Óêàçàòåëè
Óêàçàòåëè. Óêàçàòåëü – ýòî ïåðåìåííàÿ, ññûëàþùàÿñÿ íà äðóãóþ ïåðå-
double ìåííóþ;
 Ñòðóêòóðû
Ñòðóêòóðû. Ñòðóêòóðà (struct) – ýòî çàïèñü, ñîäåðæàùàÿ äàííûå ðàç-
Типы с плавающей íûõ òèïîâ;
точкой  Îáúåäèíåíèÿ
Îáúåäèíåíèÿ. Îáúåäèíåíèå (union) ñîäåðæèò òîëüêî îäíî çíà÷åíèå,
íî â ðàçíûå ìîìåíòû èñïîëíåíèÿ ïðîãðàììû ó íåãî ìîãóò áûòü ðàç-
float íûå òèïû. Êàêîé èìåííî òèï õðàíèòñÿ â äàííûé ìîìåíò, îïðåäåëÿåò
Предопределенные ïîëå ñåëåêòîðà;
типы  Ïåðå÷èñëåíèÿ
Ïåðå÷èñëåíèÿ. Ïåðå÷èñëåíèå (enum) ïîçâîëÿåò îïðåäåëèòü ïåðåìåí-
char íóþ, ñïîñîáíóþ ïðèíèìàòü çíà÷åíèÿ èç íåáîëüøîãî ìíîæåñòâà.
Äëÿ ñîçäàíèÿ ñëîæíûõ òèïîâ äàííûõ, ñîñòîÿùèõ èç íåñêîëüêèõ ýëåìåíòîâ,
Целочисленные ïðèìåíÿåòñÿ êëþ÷åâîå ñëîâî struct. ×àñòî â ñòðóêòóðàõ óïîòðåáëÿþòñÿ òèïû,
типы ðàíåå îïðåäåëåííûå ñ ïîìîùüþ ñëîâà typedef. Â ïðèìåðå 1.3 ïðîäåìîíñòðè-
ðîâàíà ñòðóêòóðà äàííûõ.
int

Рис. 1.1. Классификация типов данных в языках C/C++


Пример 1.3. Структура struct
1 struct person{
2 String name; /* òèï String äîëæåí áûòü ãäå-òî îïðåäåëåí */
johnweight = 150; 3 Height h; /* òèï Height äîëæåí áûòü ãäå-òî îïðåäåëåí */
return johnweight; 4 Weight w; /* òèï Weight äîëæåí áûòü ãäå-òî îïðåäåëåí */
} 5 }

Ñ typedef
int weight( void ){
Ñòðóêòóðà person ïîçâîëÿåò ïðîãðàììèñòó ëîãè÷åñêè ñãðóïïèðîâàòü èí-
typedef int weight; /* âåñ â ôóíòàõ */ ôîðìàöèþ î ôèçè÷åñêîì ëèöå, à çàòåì ëåãêî ïîëó÷èòü ê íåé äîñòóï. Òàê, äëÿ
weight johnweight = 150; ñëîæåíèÿ âåñà Äæîíà è Òîìà íàäî íàïèñàòü:
return johnweight;
} int combinedweight = John.w + Tom.w;

Èç ýòèõ ïðèìåðîâ âèäíî, ÷òî èñïîëüçîâàíèå typedef ïðîÿñíÿåò ñìûñë ïðî-


ãðàììû è ïîçâîëÿåò ñâÿçàòü ñ òèïîì äàííûõ íåêîòîðûå äîïîëíèòåëüíûå õà- Ущерб и защита
ðàêòåðèñòèêè. Êîììåíòàðèé ê ñòðîêå 7 ãîâîðèò î òîì, ÷òî âñå ïåðåìåííûå
òèïà weight áóäóò õðàíèòü çíà÷åíèÿ âåñà â ôóíòàõ. Ãëÿäÿ íà ñòðîêó 8 ìû âèäèì, Создание дерева атак
÷òî ïåðåìåííàÿ johnweight – ýòî, âåðîÿòíåå âñåãî, âåñ. Â ïðèìåðå áåç ïðèìå- Очень важно объективно оценивать факторы, угрожающие новой вы
íåíèÿ typedef ìîæíî ëèøü ñêàçàòü, ÷òî johnweight – ýòî öåëîå ÷èñëî. Ïî числительной системе. Дерево атак – это модель, помогающая разра
ìåðå óâåëè÷åíèÿ ðàçìåðà ïðîãðàììû ïðåèìóùåñòâà typedef ñòàíîâÿòñÿ áîëåå ботчику описать имеющиеся риски. Чтобы построить дерево атак,
î÷åâèäíûìè.  ïðåäûäóùåì ïðèìåðå îáà ìåòîäà ïðèâîäÿò ê ÿñíîìó êîäó, íî, взгляните на систему с точки зрения противника. В корневом узле
åñëè ïðîãðàììà ñîñòîèò èç íåñêîëüêèõ ñîòåí ñòðîê, òî îáúÿâëåíèå ïåðåìåí- расположите цель противника. Узлампотомкам сопоставьте методы,
íîé êàê èìåþùåé òèï weight ìîæåò ìíîãîå ñêàçàòü î åå ïðèðîäå. с помощью которых противник может попытаться достичь своей цели.
 ÿçûêå C èìåþòñÿ ñëåäóþùèå êîíñòðóêöèè äëÿ îðãàíèçàöèè ñòðóêòóð Вообще, потомки каждого узла должны содержать методы, с помо
äàííûõ: щью которых можно достичь цели или реализовать метод в узлероди
теле.
 Ìàññèâû
Ìàññèâû. Ìàññèâ – ýòî èíäåêñèðîâàííàÿ ïîñëåäîâàòåëüíîñòü äàííûõ
îäíîãî òèïà; Продолжение ⇒
40 Глава 1. Написание безопасных программ С/С++ 41

Построив дерево атак, припишите каждому узлу некоторую вероят


Пример 1.6. Цикл «do...while»
do{
ность. Поднимаясь снизу вверх, от «листьев» к «корню», можно дать [áëîê ïðåäëîæåíèé];
вероятностную оценку безопасности системы в целом. } while( óñëîâèå );

 öèêëå do...while ïðîâåðÿåìîå óñëîâèå íàõîäèòñÿ â êîíöå è ïðîâåðÿåòñÿ


ïîñëå âûïîëíåíèÿ áëîêà ïðåäëîæåíèé. Åñëè îíî èñòèííî, òî áëîê ïðåäëî-
æåíèé âûïîëíÿåòñÿ åùå ðàç, â ïðîòèâíîì ñëó÷àå ïðîèñõîäèò âûõîä èç öèêëà.
Öèêë do...while ïîõîæ íà öèêë while ñ îäíèì îòëè÷èåì: áëîê ïðåäëîæåíèé
Поток управления áóäåò âûïîëíåí õîòÿ áû îäèí ðàç. Öèêëû ýòîãî âèäà âñòðå÷àþòñÿ ðåæå, ÷åì for
 ÿçûêàõ C è C++ äëÿ óïðàâëåíèÿ ïîòîêîì âûïîëíåíèÿ ïðîãðàììû ïðèìåíÿ- è while.
þòñÿ öèêëû.  ïðîãðàììàõ ÷àñòî âñòðå÷àþòñÿ ó÷àñòêè, êîòîðûå íàäî ïîâ- Ñëåäóåò îòìåòèòü, ÷òî â áîëüøèíñòâå ñëó÷àåâ âñå òðè öèêëè÷åñêèõ êîíñò-
òîðèòü ëèáî çàðàíåå èçâåñòíîå ÷èñëî ðàç, ëèáî äî òåõ ïîð, ïîêà íå áóäåò ðóêöèè ôóíêöèîíàëüíî ýêâèâàëåíòíû, è íà ïðàêòèêå ïðèìåíÿåòñÿ òà èç íèõ,
âûïîëíåíî íåêîòîðîå óñëîâèå. Öèêëû êàê ðàç è ïðåäíàçíà÷åíû äëÿ ðåøå- êîòîðàÿ ëó÷øå ñîîòâåòñòâóåò êîíêðåòíîé çàäà÷å. Êîãäà âûáðàííûé âèä öèêëà
íèÿ ïîäîáíîãî ðîäà çàäà÷. Èìååòñÿ òðè îñíîâíûõ âèäà öèêëîâ: for, while è òî÷íî ñîîòâåòñòâóåò õîäó ìûñëè ïðîãðàììèñòà, âåðîÿòíîñòü îøèáêè (îñî-
do...while. áåííî âñëåäñòâèå îäíîé ëèøíåé èëè íåäîñòàþùåé èòåðàöèè) ñíèæàåòñÿ.

Пример 1.4. Цикл «for» Пример 1.7. Эквивалентность циклов – выполнение пяти итераций
1 for( íà÷àëüíîå_âûðàæåíèå; ïðîâåðÿåìîå_óñëîâèå; îïåðàöèÿ ){
2 [áëîê ïðåäëîæåíèé]; Öèêë for
3 } for( i = 0 ; i < 5 ; i++ ){
áëîê_ïðåäëîæåíèé;
}
Èç âñåõ öèêëîâ ÷àùå âñåãî èñïîëüçóåòñÿ for.  íà÷àëå âûïîëíåíèÿ öèêëà
ïðîãðàììà âû÷èñëÿåò íà÷àëüíîå âûðàæåíèå è ïðîâåðÿåò ñëåäóþùåå çà íèì Öèêë while
óñëîâèå. Åñëè óñëîâèå èñòèííî, âûïîëíÿåòñÿ òåëî öèêëà («áëîê ïðåäëîæå- int i = 0;
íèé»). Â êîíöå öèêëà ïðîèçâîäèòñÿ îïåðàöèÿ, óêàçàííàÿ íà òðåòüåì ìåñòå while( i < 5 ){
áëîê_ïðåäëîæåíèé;
â çàãîëîâêå, ïîñëå ÷åãî ñíîâà ïðîâåðÿåòñÿ óñëîâèå. Öèêë ïðîäîëæàåòñÿ, ïîêà i++;
óñëîâèå íå ñòàíåò ëîæíûì. }
Îñîáåííî õîðîøî öèêë for ïîäõîäèò äëÿ âûïîëíåíèÿ èòåðàöèé. Åñëè íóæ-
íî âûïîëíèòü áëîê ïðåäëîæåíèé ïÿòü ðàç, òî ìîæíî íàïèñàòü òàêîé ïðî- Öèêë do...while
int i = 0;
ñòîé öèêë: do {
áëîê_ïðåäëîæåíèé;
for( i = 0 ; i < 5 ; i++ ){ i++;
[áëîê ïðåäëîæåíèé]; } while( i < 5 )
}

 êàæäîì èç ýòèõ ïðèìåðîâ áëîê ïðåäëîæåíèé âûïîëíÿåòñÿ ïÿòü ðàç. Êîí-


Пример 1.5. Цикл «while» ñòðóêöèè ðàçíûå, íî ðåçóëüòàò îäèí è òîò æå. Ïîýòîìó ìû è ãîâîðèì, ÷òî âñå
while( óñëîâèå ){
[áëîê ïðåäëîæåíèé]; âèäû öèêëîâ ôóíêöèîíàëüíî ýêâèâàëåíòíû.
}

Ïðè âûïîëíåíèè öèêëà while ïðîâåðÿåòñÿ óñëîâèå, ñòîÿùåå â íà÷àëå öèêëà.


Функции
Åñëè îíî èñòèííî, âûïîëíåíèå öèêëà ïðîäîëæàåòñÿ, èíà÷å ïðåêðàùàåòñÿ. Ìîæíî ñêàçàòü, ÷òî ôóíêöèÿ – ýòî ìèíèàòþðíàÿ ïðîãðàììà. Èíîãäà ïðî-
Öèêë ïîâòîðÿåòñÿ, ïîêà óñëîâèå íå ñòàíåò ëîæíûì. ãðàììèñòó íóæíî ïîëó÷èòü íà âõîäå îïðåäåëåííûå äàííûå, ïðîèçâåñòè íàä
42 Глава 1. Написание безопасных программ С/С++ 43

íèìè íåêîòîðóþ îïåðàöèþ è âåðíóòü ðåçóëüòàò â òðåáóåìîì ôîðìàòå. Ïîíÿ-  Maneuverabil ity (ìàíåâðåííîñòü);
òèå ôóíêöèè áûëî ïðèäóìàíî äëÿ òàêèõ ïîâòîðÿþùèõñÿ îïåðàöèé. Ôóíê-  Position (ïîëîæåíèå).
öèÿ – ýòî àâòîíîìíàÿ ÷àñòü ïðîãðàììû, êîòîðóþ ìîæíî âûçâàòü äëÿ âû- Ñ åãî ïîìîùüþ ïðîãðàììèñò ìîæåò ñìîäåëèðîâàòü ïîëåò ñàìîëåòà ïðè çà-
ïîëíåíèÿ îïåðàöèè íàä äàííûìè. Ôóíêöèÿ ïðèíèìàåò íåêîòîðîå ÷èñëî àð- äàííûõ óñëîâèÿõ. Äëÿ ìîäèôèêàöèè õàðàêòåðèñòèê îáúåêòà ìîæíî íàïèñàòü
ãóìåíòîâ è âîçâðàùàåò çíà÷åíèå.
íåñêîëüêî ôóíêöèé äîñòóïà (accessor):
Íèæå ïðèâåäåí ïðèìåð ôóíêöèè, êîòîðàÿ ïîëó÷àåò íà âõîäå öåëîå ÷èñëî è
âîçâðàùàåò åãî ôàêòîðèàë. SetWeight( int )
SetSpeed( int )
Пример 1.8. Функция Factorial SetManeuverability( int )
int Factorial( int num ){ SetPosition( int )
for( i = (num – 1) ; i > 0 ; i-- ){ MovePosition( int )
num *= i; /* ñîêðàùåííàÿ çàïèñü äëÿ num = num * i */
} Êîä òàêîãî êëàññà plane ìîã áû âûãëÿäåòü ñëåäóþùèì îáðàçîì:
return num;
}
Пример 1.9. Класс plane
 ïåðâîé ñòðîêå Factorial – ýòî èìÿ ôóíêöèè. Åìó ïðåäøåñòâóåò êëþ÷åâîå 1 public class plane{
2 int Weight;
ñëîâî int, ãîâîðÿùåå î òîì, ÷òî ôóíêöèÿ âîçâðàùàåò öåëîå çíà÷åíèå. ×àñòü
3 int Speed;
( int num ) îçíà÷àåò, ÷òî ôóíêöèÿ ïðèíèìàåò â êà÷åñòâå àðãóìåíòà îäíî öå- 4 int Maneuverability;
ëîå ÷èñëî, êîòîðîå áóäåò îáîçíà÷àòüñÿ num. Ïðåäëîæåíèå return ãîâîðèò 5 Location Position; /* òèï Location äîëæåí áûòü ãäå-òî îïðåäåëåí
î òîì, êàêîå èìåííî çíà÷åíèå ôóíêöèÿ âîçâðàùàåò. 6 è ïðåäñòàâëÿòü ïðîñòðàíñòâåííûå êîîðäèíàòû (x,y,z) */
7 plane( int W, int S, int M, Location P ){
8 Weight = W;
Классы (только C++) 9 Speed = S;
10 Maneuverability = M;
Îáúåêòíî-îðèåíòèðîâàííûå ïðîãðàììû îðãàíèçîâàíû â âèäå íàáîðà êëàñ- 11 Position = P;
ñîâ. Êëàññ – ýòî äèñêðåòíàÿ åäèíèöà ïðîãðàììû, îáëàäàþùàÿ îïðåäåëåííû- 12 }
ìè õàðàêòåðèñòèêàìè. Â ÿçûêå C êëàññîâ íåò, òàê êàê ýòî ïðîöåäóðíûé, à íå 13
îáúåêòíî-îðèåíòèðîâàííûé ÿçûê. 14 void SetWeight( plane current, int W ){
Êëàññ ãðóïïèðóåò äàííûå è ôóíêöèè íåêîòîðûõ òèïîâ. Êëàññ ìîæåò ñîäåð- 15 ñurrent.Weight = W;
æàòü êîíñòðóêòîð, êîòîðûé îïðåäåëÿåò, êàê ñîçäàåòñÿ ýêçåìïëÿð êëàññà èëè 16 }
17
îáúåêò. Êëàññ âêëþ÷àåò ôóíêöèè, âûïîëíÿþùèå îïåðàöèè íàä ýêçåìïëÿðà-
18 /* Ìåòîäû SetSpeed, SetManeuverability, SetPosition,
ìè ýòîãî êëàññà. MovePosition òîæå äîëæíû áûòü îïðåäåëåíû */
Ïðåäïîëîæèì, íàïðèìåð, ÷òî ïðîãðàììèñò ðàáîòàåò íàä ñèìóëÿòîðîì ïî- 19 }
ëåòîâ äëÿ êîìïàíèè – ïðîèçâîäèòåëÿ ñàìîëåòîâ. Ðåçóëüòàòû ýòîé ðàáîòû ïî-
ìîãóò êîìïàíèè ïðèíÿòü âàæíûå ïðîåêòíûå ðåøåíèÿ. Â òàêîé ñèòóàöèè Ýòîò êîä ñëóæèò äëÿ èíèöèàëèçàöèè îáúåêòà. Ïðè âûçîâå ìåòîäà plane çà-
îáúåêòíî-îðèåíòèðîâàííîå ïðîãðàììèðîâàíèå – èäåàëüíûé èíñòðóìåíò. äàþòñÿ âñå õàðàêòåðèñòèêè, êîòîðûìè äîëæåí îáëàäàòü ñàìîëåò: âåñ, ñêî-
Ìîæíî ñîçäàòü êëàññ plane, èíêàïñóëèðóþùèé âñå õàðàêòåðèñòèêè ñàìîëåòà ðîñòü, ìàíåâðåííîñòü è ïîëîæåíèå. Íà ïðèìåðå ìåòîäà SetWeight ïðîäåìîíñò-
è ôóíêöèè äëÿ ìîäåëèðîâàíèÿ åãî ïåðåìåùåíèé. Ìîæíî òàêæå ñîçäàòü íå- ðèðîâàíî, êàê ìîæíî âêëþ÷èòü â êëàññ îïåðàöèþ íàä îïèñûâàåìûì èì
ñêîëüêî îáúåêòîâ êëàññà plane, êàæäûé èç êîòîðûõ áóäåò ñîäåðæàòü ñâîè ñîá- îáúåêòîì.
ñòâåííûå äàííûå. Ñèìóëÿòîð ìîæåò ñîçäàòü íåñêîëüêî ýêçåìïëÿðîâ êëàññà plane è âûïîëíèòü
Êëàññ ìîæåò ñîäåðæàòü íåñêîëüêî ïåðåìåííûõ, ê ïðèìåðó: «ïðîáíûå ïîëåòû» äëÿ îöåíêè âëèÿíèÿ ðàçëè÷íûõ õàðàêòåðèñòèê. Íàïðèìåð,
 Weight (âåñ); ñàìîëåò plane1 ìîæåò âåñèòü 5000 ôóíòîâ, ëåòàòü ñî ñêîðîñòüþ 500 ìèëü/÷àñ è
 Speed (ñêîðîñòü); îáëàäàòü ìàíåâðåííîñòüþ 10, òîãäà êàê äëÿ ñàìîëåòà plane2 ìîæíî çàäàòü
44 Глава 1. Написание безопасных программ С/С++ 45

òàêèå ïàðàìåòðû: âåñ 6000 ôóíòîâ, ñêîðîñòü 600 ìèëü/÷àñ, ìàíåâðåííîñòü 8.


 ÿçûêå C++ ýêçåìïëÿðû êëàññà ñîçäàþòñÿ ïî÷òè òàê æå, êàê îáû÷íûå ïå-
ðåìåííûå. Ñêàæåì, îáúåêò plane1 ìîæíî ñîçäàòü ñ ïîìîùüþ òàêèõ ïðåäëî-
æåíèé:

Location p; Ñëåäóþùàÿ ïðîãðàììà ñíà÷àëà âû÷èñëÿåò êîýôôèöèåíòû, à çàòåì çíà÷åíèå


p = ( 3, 4, 5 ); g(t). Íî âìåñòî òîãî ÷òîáû íåïîñðåäñòâåííî âîñïðîèçâîäèòü ïîêàçàííûå
plane plane1 = plane(5.000, 500, 10, p );
âûøå óðàâíåíèÿ, ìû ïîéäåì ïî áîëåå êîðîòêîìó ïóòè, ñâÿçàííîìó ñ ïðè-
áëèçèòåëüíûì âû÷èñëåíèåì ïëîùàäè ïîä êðèâîé. Èçó÷èòå òåêñò ïðîãðàììû
Íàñëåäîâàíèå ïîçâîëÿåò ïðîãðàììèñòàì ñîçäàâàòü èåðàðõèè êëàññîâ.
è ïîäóìàéòå, êàê òàêîé ïîäõîä ìîæíî ïðèìåíèòü äëÿ ðàçëîæåíèÿ ôóíêöèè
Êëàññû îðãàíèçóþòñÿ â äðåâîâèäíûå ñòðóêòóðû, â êîòîðûõ ó êàæäîãî êëàññà
â ðÿä Ôóðüå.
åñòü «ðîäèòåëè» è, âîçìîæíî, «ïîòîìêè». Êëàññ «íàñëåäóåò», òî åñòü ìîæåò
ïîëüçîâàòüñÿ ôóíêöèÿìè ëþáîãî èç ñâîèõ ðîäèòåëåé, íàçûâàåìûõ òàêæå åãî
ñóïåðêëàññàìè. Íàïðèìåð, åñëè êëàññ plane ÿâëÿåòñÿ ïîäêëàññîì êëàññà vehicle, Вопрос
òî îáúåêò êëàññà plane èìååò äîñòóï êî âñåì ôóíêöèÿì, êîòîðûå ìîæíî âû-
Как оценить площадь под кривой с помощью прямоугольников?
ïîëíÿòü íàä îáúåêòîì êëàññà vehicle.
Ó êëàññîâ åñòü ìíîãî ïðåèìóùåñòâ, íåäîñòàþùèõ äðóãèì èìåþùèìñÿ
â ýòîì ÿçûêå ïðîãðàììèðîâàíèÿ òèïàì. Îíè ïðåäîñòàâëÿþò ýôôåêòèâíîå
Листинг 1.1. Разложение в ряд Фурье
ñðåäñòâî äëÿ îðãàíèçàöèè ïðîãðàììû â âèäå íàáîðà ìîäóëåé, êîòîðûì ìîæ- 1 #include <stdio.h>
íî íàñëåäîâàòü. Ìîæíî òàêæå ñîçäàâàòü àáñòðàêòíûå êëàññû, âûñòóïàþùèå 2 #include <math.h>
â ðîëè èíòåðôåéñîâ. Èíòåðôåéñ îïðåäåëÿåò, íî íå ðåàëèçóåò íåêîòîðóþ 3
ôóíêöèîíàëüíîñòü, îñòàâëÿÿ ýòó çàäà÷ó ñâîèì ïîäêëàññàì. Äàííûå êëàññà 4 void main( void );
5 double geta( double );
ìîæíî îáúÿâëÿòü çàêðûòûìè, ãàðàíòèðóÿ òåì ñàìûì, ÷òî äîñòóï ê âíóòðåí- 6 double getb( double );
íåìó ñîñòîÿíèþ êëàññà âîçìîæåí ëèøü ñ ïîìîùüþ ñïåöèàëüíî ïðåäíàçíà- 7 double getsee( void );
÷åííûõ äëÿ ýòîãî ôóíêöèé. 8 double g( double );
9
10 /*ãëîáàëüíûå ïåðåìåííûå */
Пример: ряды Фурье 11 double width = 0.0001;
12 double rightorleft=0; /* Èíèöèàëèçèðóåì íóëåì, ÷òîáû íà÷àòü
Ïðè ïåðåäà÷å äàííûõ ïî êàíàëàì ñ îãðàíè÷åííîé ïðîïóñêíîé ñïîñîáíîñòüþ ñóììèðîâàíèå ïëîùàäåé ïðÿìîóãîëüíèêîâ ñëåâà *.
íåâîçìîæíî â òî÷íîñòè ïåðåäàòü è ïðèíÿòü äâîè÷íûå äàííûå. Èñõîäíûå 13 /* ß ïîìåñòèë ýòî äëÿ òîãî, ÷òîáû ïîçæå ïðîâåðèòü òî÷íîñòü A è B */
äâîè÷íûå äàííûå êîäèðóþòñÿ ñ ïîìîùüþ ðàçëè÷íûõ óðîâíåé íàïðÿæåíèÿ è 14 int numterms=10; /* Ñêîëüêî êîýôôèöèåíòîâ âû÷èñëèòü è
íàïå÷àòàòü */
ðåêîíñòðóèðóþòñÿ íà ïðèåìíîì êîíöå. Åñëè óðîâåíü íàïðÿæåíèÿ ñïîñîáåí
15 double T=1; /* Çàäàòü ïåðèîä è ÷àñòîòó */
ïðèíèìàòü íåñêîëüêî ðàçëè÷íûõ çíà÷åíèé, òî ìîæíî ïåðåäàòü áîëüøå èí- 16 double f=1;
ôîðìàöèè, ÷åì ïðîñòî «0» è «1». Äëÿ àïïðîêñèìàöèè ôóíêöèé ïðèìåíÿåòñÿ 17
ðàçëîæåíèå â ðÿä Ôóðüå. Æàí-Áàòèñò Ôóðüå â íà÷àëå äåâÿòíàäöàòîãî âåêà 18 void main( void ){
äîêàçàë, ÷òî ïî÷òè ëþáóþ ïåðèîäè÷åñêóþ ôóíêöèþ ìîæíî ïðåäñòàâèòü 19 double a [ numterms + 1 ], b[ numterms + 1 ], c, ctoo , n;
20 int i, j;
â âèäå áåñêîíå÷íîé ñóììû ñèíóñîâ è êîñèíóñîâ, òî÷íåå: 21 printf( "\n" );
22 c = getsee( );
23
Ñ ïîìîùüþ èíòåãðèðîâàíèÿ (îñòàâëÿåì ýòî ÷èòàòåëþ â êà÷åñòâå óïðàæíå- 24 for ( n=1 ; n <= numterms ; n++ ){
íèÿ) ìîæíî ïîëó÷èòü ôîðìóëû äëÿ âû÷èñëåíèÿ êîýôôèöèåíòîâ a, b è c: 25 /* Èãíîðèðóåì íóëåâîé ýëåìåíò ìàññèâà, òàê ÷òî a[1] ïðåäñòàâëÿåò a1 */
46 Глава 1. Написание безопасных программ С/С++ 47
26 i = n; /* Íóæíî çàäàòü i, òàê êàê èíäåêñ ìàññèâà íå ìîæåò 72 total += width * ( g( i ) * cos( 6.28 * n * f * i ) );
áûòü çíà÷åíèåì òèïà double */ 73 total *= 2/T;
27 a[ i ] = geta( n ); 74 return total;
28 } 75 }
29 76
30 for ( n=1 ; n <= numterms ; n++ ){ 77 double getsee( void ){
31 i = n; 78 double i, total=0;
32 b[ i ] = getb( n ); 79 double end;
33 } 80
34 rightorleft=width; 81 if ( rightorleft==0 ) end = T – width; /* Íóæíî äëÿ òîãî, ÷òîáû íå
35 /* Èñïîëüçóåòñÿ äëÿ âû÷èñëåíèÿ ïëîùàäè ïî ïðàâîé ñòîðîíå */ ïîñ÷èòàòü ëèøíèé ïðÿìîóãîëüíèê */
36 82 else end = T;
37 ctoo = getsee( ); 83
38 84 for ( i=rightorleft ; i <= end ; i+=width )
39 for ( i=1 ; i<=numterms ; i++ ){ /* Ïå÷àòàåì òàáëèöó ðåçóëüòàòîâ */ 85 total += width * g( i );
40 printf( "%s%d%s" , "a", i, " is: " ); 86 total *= 2/T;
41 printf( "%lf", a[ i ] ); 87 return total;
42 printf( "%s%d%s" , " b" , i , " is: " ); 88 }
43 printf( "%lf\n" , b[ i ] ); 89
44 } 90 double g( double t ){
45 91 return sqrt( 1 / ( 1 + t ) );
46 printf( "\n%s%lf\n" , "c is " , c );
92 }
47 printf( "%s%lf\n\n" , "ctoo is " , ctoo );
48
49 } Íåò íóæäû íåïîñðåäñòâåííî âåñòè âû÷èñëåíèÿ ïî ôîðìóëàì èç êóðñà ìà-
50 òåìàòè÷åñêîãî àíàëèçà.  äàííîì ïðèìåðå äëÿ ïðèáëèæåííîãî âû÷èñëåíèÿ
51 double geta( double n ){ ïëîùàäè ïîä êðèâîé ïðèìåíÿåòñÿ àïïðîêñèìàöèÿ ýòîé îáëàñòè ïðÿìîóãîëü-
52 double i, total=0;
íèêàìè. Ïðè ýòîì îöåíêà ïîëó÷èòñÿ áîëüøå èëè ìåíüøå èñòèííîãî çíà÷å-
53 double end;
54 íèÿ. Åñëè âû÷èñëÿòü ôóíêöèþ g(t), ïîëüçóÿñü ëåâîé ãðàíèöåé ïðÿìîóãîëüíè-
55 if ( rightorleft==0 ) end = T – width; /* Íóæíî äëÿ òîãî, ÷òîáû íå êà, òî îöåíêà îêàæåòñÿ çàâûøåííîé, òàê êàê êàæäûé ïðÿìîóãîëüíèê áóäåò
ïîñ÷èòàòü ëèøíèé ïðÿìîóãîëüíèê */ âûñòóïàòü çà ïðåäåëû îáëàñòè, îãðàíè÷åííîé êðèâîé. Íàïðîòèâ, åñëè ïîëüçî-
56 else end = T; âàòüñÿ ïðàâîé ãðàíèöåé, òî ïîëó÷èì çàíèæåííóþ îöåíêó.
57
Ïîïûòàéòåñü ïðîñëåäèòü, êàê âûïîëíÿåòñÿ ïðîãðàììà. Â ôóíêöèè main
58 for ( i=rightorleft ; i <= end ; i+=width )
59 total += width * ( g( i ) * sin( 6.28 * n * f * i ) ); èíèöèàëèçèðóþòñÿ ïåðåìåííûå, âûçûâàþòñÿ ôóíêöèè äëÿ âûïîëíåíèÿ ðàç-
60 total *= 2/T; ëè÷íûõ ïîäçàäà÷, âîçíèêàþùèõ ïðè ðàçëîæåíèè â ðÿä Ôóðüå, è ïå÷àòàþòñÿ
61 return total; ðåçóëüòàòû. Ìû äîáàâèëè êîììåíòàðèè, ÷òîáû ëåã÷å áûëî ïîíÿòü ïðîãðàì-
62 } ìó. Â ñòðîêàõ 1 è 2 èìïîðòèðóþòñÿ áèáëèîòåêè ñòàíäàðòíîãî ââîäà/âûâîäà è
63
64 double getb( double n ){
ìàòåìàòè÷åñêèõ ôóíêöèé.  ñòðîêàõ ñ 3 ïî 7 îáúÿâëÿþòñÿ èñïîëüçóåìûå
65 double i, total=0; â ïðîãðàììå ôóíêöèè. Â ñòðîêàõ 8–14 îáúÿâëåíû ãëîáàëüíûå ïåðåìåííûå.
66 double end; Îñòàâøàÿñÿ ÷àñòü ïðîãðàììà ïîñâÿùåíà âû÷èñëåíèþ ÷ëåíîâ ðÿäà Ôóðüå. Ïå-
67 ðåìåííàÿ numterms îïðåäåëÿåò, ñêîëüêî ÷ëåíîâ âû÷èñëÿòü, òî åñòü òî÷íîñòü
68 if ( rightorleft==0 ) end = T – width; /* Íóæíî äëÿ òîãî, ÷òîáû íå
àïïðîêñèìàöèè. ×åì áîëüøå ÷èñëî ÷ëåíîâ, òåì áîëüøå èñïîëüçóåòñÿ ïðÿìî-
ïîñ÷èòàòü ëèøíèé ïðÿìîóãîëüíèê */
69 else end = T; óãîëüíèêîâ è, ñîîòâåòñòâåííî, áîëåå òî÷íî àïïðîêñèìèðóåòñÿ èñõîäíàÿ êðè-
70 âàÿ.  ñòðîêàõ 20–28 ãåíåðèðóþòñÿ ìàññèâû, ñîäåðæàùèå çíà÷åíèÿ êîýôôè-
71 for ( i=rightorleft ; i <= end ; i+=width ) öèåíòîâ a è b äëÿ êàæäîãî ÷ëåíà ðÿäà.  ñòðîêàõ 40–72 âû÷èñëÿþòñÿ ïëîùàäè
48 Глава 1. Написание безопасных программ Язык Java 49

ïðÿìîóãîëüíèêîâ. Âçãëÿíóâ íà ôîðìóëû äëÿ êîýôôèöèåíòîâ ðÿäà Ôóðüå, ëåã- Характеристики языка
êî ïîíÿòü, ÷òî ïðîãðàììà âû÷èñëÿåò èõ îöåíêè äëÿ ïîñëåäóþùåãî ïîëó÷å-
íèÿ çíà÷åíèÿ ôóíêöèè g(t).  êà÷åñòâå óïðàæíåíèÿ ïîäóìàéòå, êàê ýòè îöåí- Java – ýòî ñîâðåìåííûé ïëàòôîðìåííî-íåçàâèñèìûé îáúåêòíî-îðèåíòèðî-
êè ìîæíî ïðèìåíèòü ê ïåðåäà÷å äàííûõ ïî êàíàëàì ñ îãðàíè÷åííîé ïðî- âàííûé ÿçûê ïðîãðàììèðîâàíèÿ. Íîâåéøèå âîçìîæíîñòè ñî÷åòàþòñÿ â íåì
ïóñêíîé ñïîñîáíîñòüþ. ñ ñèíòàêñèñîì, ïîõîæèì íà C/C++, ïîýòîìó îïûòíûì ïðîãðàììèñòàì íå-
òðóäíî âûó÷èòü ýòîò íîâûé ÿçûê.

Îáúåêòíî-îðèåíòèðîâàííûå âîçìîæíîñòè
Язык Java Java – îáúåêòíî-îðèåíòèðîâàííûé ÿçûê ïðîãðàììèðîâàíèÿ, ÷òî îçíà÷àåò
Java – ýòî ñîâðåìåííûé îáúåêòíî-îðèåíòèðîâàííûé ÿçûê. Åãî ñèíòàêñèñ, ñõî- íàëè÷èå ñëåäóþùèõ äîñòîèíñòâ:
æèé ñ ïðèíÿòûì â ÿçûêàõ C è C++, ñî÷åòàåòñÿ ñ íåçàâèñèìîñòüþ îò ïëàòôîðìû  Èíêàïñóëÿöèÿ
Èíêàïñóëÿöèÿ. Çà ñ÷åò èñïîëüçîâàíèÿ êëàññîâ îáúåêòíî-îðèåíòèðî-
è àâòîìàòè÷åñêîé ñáîðêîé «ìóñîðà». ßçûê áûë ðàçðàáîòàí â 1990-õ ãîäàõ, íî è âàííûé êîä èìååò î÷åíü õîðîøóþ îðãàíèçàöèþ è îáëàäàåò âûñîêîé
â íàñòîÿùåå âðåìÿ åñòü öåëûé ðÿä ïðîäóêòîâ îñíîâàííûõ íà íåì: Java-àïëå- ìîäóëüíîñòüþ. Äàííûå è ìåòîäû äëÿ âûïîëíåíèÿ îïåðàöèé íàä íèìè
òû, òåõíîëîãèÿ Enterprise JavaBeans, ñåðâëåòû, Jini è ìíîãèå äðóãèå. Âñå îñ- èíêàïñóëèðîâàíû â ñòðóêòóðó êëàññà;
íîâíûå Web-áðàóçåðû ïîääåðæèâàþò ÿçûê Java, äåëàÿ åãî ïðåèìóùåñòâà  Íàñëåäîâàíèå
Íàñëåäîâàíèå. Îáúåêòíî-îðèåíòèðîâàííàÿ îðãàíèçàöèÿ è èíêàïñóëÿ-
äîñòóïíûìè äëÿ ìèëëèîíîâ ïîëüçîâàòåëåé Èíòåðíåò. öèÿ ïîçâîëÿþò áåç òðóäà ðåàëèçîâàòü ïîâòîðíîå èñïîëüçîâàíèå èëè
ßçûê Java ñîçäàë â 1991 ãîäó Äæåéìñ Ãîñëèíã (James Gosl ing) èç êîìïàíèè «íàñëåäîâàíèå» ðàíåå íàïèñàííîãî êîäà. Íàñëåäîâàíèå ýêîíîìèò âðå-
Sun Microsystems. Ãîñëèíã âõîäèë â êîìàíäó «Green Team», ñîñòîÿùóþ èç ìÿ, òàê êàê ïðîãðàììèñòó íå íóæíî çàíîâî êîäèðîâàòü óæå èìåþùóþ-
13 ÷åëîâåê, ïåðåä êîòîðûìè áûëà ïîñòàâëåíà çàäà÷à ñïðîãíîçèðîâàòü è ðàçðà- ñÿ ôóíêöèîíàëüíîñòü;
áîòàòü ñðåäñòâà äëÿ êîìïüþòåðíûõ òåõíîëîãèé ñëåäóþùåãî ïîêîëåíèÿ. Â ðå-  Ñîêðûòèå äàííûõ
äàííûõ. Îáúåêòû, òî åñòü ýêçåìïëÿðû êëàññà ìîãóò ñîäåð-
çóëüòàòå áûëî ñîçäàíî óñòðîéñòâî ñ ñåíñîðíûì ýêðàííûì è äèñòàíöèîí- æàòü äàííûå, êîòîðûå íå ìîãóò áûòü èçìåíåíû èíà÷å êàê ñ ïîìîùüþ
ìåòîäîâ ñàìîãî ýòîãî êëàññà. Ïðîãðàììèñò ìîæåò ñêðûòü äàííûå, íà-
íûì óïðàâëåíèåì (åãî íàçâàëè *7 èëè StarSeven), çàïðîãðàìèðîâàííîå èñ-
çíà÷èâ èì àòðèáóò «private» (çàêðûòûé);
êëþ÷èòåëüíî íà íîâîì ÿçûêå Java.
 Àáñòðàêòíûå òèïû äàííûõ
äàííûõ. Ïðîãðàììèñò ìîæåò îïðåäåëèòü êëàññ, êî-
Õîòÿ óñòðîéñòâî *7 ïîñòèãëà êîììåð÷åñêàÿ íåóäà÷à, êîìïàíèÿ Sun Micro-
òîðûé ìîæíî ïðåäñòàâëÿòü ñåáå êàê îáîáùåíèå ñòðóêòóðû (struct), èìå-
systems óâèäåëà ïîòåíöèàëüíóþ ïëàòôîðìó äëÿ ïðèìåíåíèÿ ïîëîæåííîé þùåéñÿ â ÿçûêå C. Êëàññ îïèñûâàåò îïðåäåëåííûé ïðîãðàììèñòîì òèï
â åãî îñíîâó òåõíîëîãèè Java – Èíòåðíåò. Â 1993 ãîäó áûë âûïóùåí Web-áðàó- äàííûõ âìåñòå ñ îïåðàöèÿìè, ïðèìåíèìûìè ê îáúåêòàì ýòîãî òèïà.
çåð Mosaic, ïðåäîñòàâëÿþùèé ïðîñòîé èíòåðôåéñ äëÿ ïðîñìîòðà Web-ñàéòîâ.
Õîòÿ ïî ñåòè Èíòåðíåò ìîæíî áûëî ïåðåäàâàòü ìóëüòèìåäèéíûå ôàéëû, Ïëàòôîðìåííàÿ íåçàâèñèìîñòü
áðàóçåðû ñîñðåäîòî÷èëèñü íà ïðåäñòàâëåíèè âèçóàëüíîãî êîíòåíòà ñ ïîìî-
×àñòî ãîâîðÿò, ÷òî Java-ïðîãðàììû íå çàâèñÿò îò ïëàòôîðìû, òàê êàê Java –
ùüþ ñòàòè÷åñêèõ ôàéëîâ íà ÿçûêå ðàçìåòêè ãèïåðòåêñòà (HTML).  1994 ãîäó èíòåðïðåòèðóåìûé, à íå êîìïèëèðóåìûé ÿçûê. Èíûìè ñëîâàìè, êîìïèëÿòîð
êîìïàíèÿ Sun Microsystems âûïóñòèëà íîâûé áðàóçåð HotJava, ñïîñîáíûé ãåíåðèðóåò «áàéò-êîä», à íå ìàøèííûé êîä, êàê â ñëó÷àå ñ ÿçûêîì C èëè C++.
îòîáðàæàòü äèíàìè÷åñêèé, àíèìèðîâàííûé êîíòåíò. Ýòîò áàéò-êîä ìîæíî çàòåì èíòåðïðåòèðîâàòü íà ñàìûõ ðàçíûõ ïëàòôîðìàõ.
×òîáû äîáèòüñÿ êàê ìîæíî áîëåå øèðîêîãî ðàñïðîñòðàíåíèÿ ñâîèõ Ñëåäóåò, îäíàêî, îòìåòèòü, ÷òî ñêîðîñòü âûïîëíåíèÿ èíòåðïðåòèðóåìîãî
òåõíîëîãèé, Sun Microsystems â 1995 ãîäó îòêðûëà èñõîäíûå òåêñòû Java. Êî êîäà ìíîãîêðàòíî íèæå ñêîðîñòè âûïîëíåíèÿ êîäà, îòòðàíñëèðîâàííîãî
âñåìó ïðî÷åìó, ïðèñòàëüíîå âíèìàíèå ê èñõîäíîìó êîäó ñî ñòîðîíû ñî- â ìàøèííûå êîìàíäû.
îáùåñòâà ðàçðàáîò÷èêîâ ïîìîãëî èñïðàâèòü îñòàâøèåñÿ â íåì îøèáêè. Íà
âûñòàâêå Sun World â 1995 ãîäó ðóêîâîäèòåëè Sun Microsystems è îäèí èç Ìíîãîïîòî÷íîñòü
îñíîâàòåëåé êîìïàíèè Netscape Ìàðê Àíäðååñåí (Marc Andreesen) îáúÿâè- Java ïîääåðæèâàåò ìíîãîïîòî÷íîñòü, òî åñòü ïðîãðàììà ìîæåò îäíîâðåìåí-
ëè, ÷òî òåõíîëîãèÿ Java áóäåò âêëþ÷åíà â áðàóçåð Netscape Navigator. Òàê íî âûïîëíÿòü íåñêîëüêî çàäàíèé. Òàêóþ ôóíêöèîíàëüíîñòü îáåñïå÷èâàåò
Java âîøëà â íàø ìèð. êëàññ Thread, âõîäÿùèé â ñîñòàâ ïàêåòà java.lang.
50 Глава 1. Написание безопасных программ Язык Java 51

Áåçîïàñíîñòü ïîëüçîâàòüñÿ êîìïèëÿòîðîì è çàïóñêàòü ïðîãðàììó íà âûïîëíåíèå. Íèæå


Õîòÿ «áåçîïàñíûé ÿçûê ïðîãðàììèðîâàíèÿ» åùå íå ïðèäóìàí, â Java èìåþò- ïðèâåäåí òåêñò òàêîé ïðîãðàììû íà ÿçûêå Java.
ñÿ ñðåäñòâà, îòñóòñòâóþùèå â áîëåå ñòàðûõ ÿçûêàõ C è C++. Ñàìîå ãëàâíîå –
ýòî òî, ÷òî â Java ðåàëèçîâàí õèòðîóìíûé ìåõàíèçì óïðàâëåíèÿ ïàìÿòüþ è Пример 1.10. Здравствуй, мир!
class helloWorld{
êîíòðîëü âûõîäà çà ãðàíèöû ìàññèâîâ. Ïðîâåñòè àòàêó ïóòåì ïåðåïîëíåíèÿ public static void main( String [] Args ) {
áóôåðà íà ïðîãðàììó, íàïèñàííóþ íà Java, íåâîçìîæíî, òàê ÷òî óñòðàíåíà System.out.println( "Hello, world!" );
îäíà èç ñàìûõ ðàñïðîñòðàíåííûõ óãðîç. Êðîìå òîãî, Java çàùèùàåò è îò áîëåå }
}
òîíêèõ àòàê, íàïðèìåð, ïóòåì ïðåîáðàçîâàíèÿ öåëûõ ÷èñåë â óêàçàòåëè äëÿ
ïîëó÷åíèÿ íåñàíêöèîíèðîâàííîãî äîñòóïà ê çàêðûòûì ÷àñòÿì ïðîãðàììû Êëàññ helloWorld ñîäåðæèò åäèíñòâåííûé ìåòîä main, êîòîðûé ïî óìîë÷à-
èëè îïåðàöèîííîé ñèñòåìû. íèþ ïðèíèìàåò ìàññèâ àðãóìåíòîâ òèïà String. Ýòîò ìåòîä îòêðûòûé (public),
 Java òàêæå íàøëà ïðèìåíåíèÿ èäåÿ «ïåñî÷íèöû» , êîòîðàÿ íàëàãàåò îã- òî åñòü ê íåìó åñòü äîñòóï èçâíå êëàññà helloWorld. Îí íå âîçâðàùàåò çíà÷å-
ðàíè÷åíèÿ íà äåéñòâèÿ, êîòîðûå ìîæåò âûïîëíÿòü ðàáîòàþùàÿ âíóòðè íåå íèÿ, î ÷åì ãîâîðèò êëþ÷åâîå ñëîâî void. Ìåòîä println ÿâëÿåòñÿ ÷ëåíîì êëàññà
ïðîãðàììà. Ïàìÿòü è äðóãèå ðåñóðñû, íàõîäÿùèåñÿ âíå «ïåñî÷íèöû», çà- System.out. Îí ïå÷àòàåò ñòðîêó «Hello, world!» íà ñòàíäàðòíûé âûâîä. (Î òèïàõ
ùèùåíû îò ïîòåíöèàëüíî âðåäîíîñíîãî Java-êîäà. Ìîäåëü ïåñî÷íèöû ðå- äàííûõ è ìåòîäàõ ìû åùå ñêàæåì íèæå â ýòîé ãëàâå.)
àëèçîâàíà ñ ïîìîùüþ äâóõ îñíîâíûõ ìåòîäîâ: ïðîâåðêè áàéò-êîäîâ è âåðè-
ôèêàöèè âî âðåìÿ âûïîëíåíèÿ. Âåðèôèêàöèÿ áàéò-êîäà ïðîèñõîäèò íà ýòà-
ïå çàãðóçêè êëàññà, â ðåçóëüòàòå ãàðàíòèðóåòñÿ îòñóòñòâèå îïðåäåëåííûõ Типы данных
îøèáîê. Íàïðèìåð, íà ýòîì óðîâíå ïðîèçâîäèòñÿ êîíòðîëü òèïîâ è ïðåäîò- Òèïû äàííûõ ñëóæàò â ÿçûêàõ ïðîãðàììèðîâàíèÿ äëÿ îïðåäåëåíèÿ ïåðåìåí-
âðàùàþòñÿ íåçàêîííûå îïåðàöèè, ñêàæåì, îòïðàâêà ñîîáùåíèÿ ïðèìèòèâ- íûõ äî èõ èíèöèàëèçàöèè. Òèï îïðåäåëÿåò êàê ïåðåìåííàÿ áóäåò ðàçìåùåíà
íîìó òèïó. â ïàìÿòè è êàêèå äàííûå îíà ìîæåò ñîäåðæàòü. Ãîâîðÿò, ÷òî ïåðåìåííàÿ ÿâ-
ëÿåòñÿ ýêçåìïëÿðîì íåêîòîðîãî òèïà äàííûõ.
Äîïîëíèòåëüíûå âîçìîæíîñòè Â ÿçûêå Java åñòü äâå ðàçíîâèäíîñòè òèïîâ äàííûõ: ïðèìèòèâíûå è ññû-
ëî÷íûå. Ê ïðèìèòèâíûì îòíîñÿòñÿ ñëåäóþùèå òèïû:
 ÿçûêå Java åñòü ìíîãî ðàçâèòûõ ñðåäñòâ, íå âõîäÿùèõ íè â îäíó èç âûøå-
óïîìÿíóòûõ êàòåãîðèé. Òàê, Java ïîääåðæèâàåò «äèíàìè÷åñêóþ çàãðóçêó»  Byte
Byte. Òèïîì byte ïðåäñòàâëÿåòñÿ öåëîå ÷èñëî, çàíèìàþùåå 1 áàéò ïàìÿòè;
êëàññîâ. Ôóíêöèîíàëüíîñòü (â âèäå êëàññà) çàãðóæàåòñÿ òîëüêî êîãäà â íåé  Short
Short. Òèï short ñëóæèò äëÿ ïðåäñòàâëåíèÿ öåëûõ ÷èñåë, çàíèìàþùèõ
âîçíèêàåò ïîòðåáíîñòü, ÷òî ýêîíîìèò ñåòåâûå ðåñóðñû, óìåíüøàåò ðàçìåð 2 áàéòà ïàìÿòè;
ïðîãðàììû è óâåëè÷èâàåò åå áûñòðîäåéñòâèå. Äèíàìè÷åñêàÿ çàãðóçêà ðåàëè-  Int
Int. Òèï int ñëóæèò äëÿ ïðåäñòàâëåíèÿ öåëûõ ÷èñåë, çàíèìàþùèõ 4 áàé-
çîâàíà è â òàêèõ ÿçûêàõ êàê Lisp (à â êîíöå 1980-õ ãîäîâ îíà áûëà äîáàâëåíà è òà ïàìÿòè;
â C), íî Java îñîáåííî õîðîøî ïðèñïîñîáëåí äëÿ çàãðóçêè íåîáõîäèìûõ  Long
Long. Òèï long ñëóæèò äëÿ ïðåäñòàâëåíèÿ öåëûõ ÷èñåë, çàíèìàþùèõ
êëàññîâ èç ñåòè. Çà òàêóþ çàãðóçêó îòâå÷àåò êëàññ ClassLoader. 8 áàéòîâ ïàìÿòè;
Êàê è Lisp, ML è ìíîãèå äðóãèå ÿçûêè, Java ïîääåðæèâàåò àâòîìàòè÷åñêóþ  Float
Float. Òèïîì float ïðåäñòàâëÿþò ÷èñëà ñ ïëàâàþùåé òî÷êîé, ïîä êîòî-
«ñáîðêó ìóñîðà». Ïðîãðàììèñòó íåò íóæäû ÿâíî îñâîáîæäàòü íåèñïîëüçóå- ðûå îòâîäèòñÿ 4 áàéòà;
ìóþ áîëåå ïàìÿòü. Òåì ñàìûì ïðåäîòâðàùàþòñÿ óòå÷êè ïàìÿòè è, íàîáîðîò,  Double
Double. Òèï double ñëóæèò äëÿ ïðåäñòàâëåíèÿ ÷èñåë ñ ïëàâàþùåé òî÷-
ñëó÷àéíîå îñâîáîæäåíèå åùå èñïîëüçóåìîé ïàìÿòè. êîé äâîéíîé òî÷íîñòè. Äëÿ íèõ îòâîäèòñÿ 8 áàéòîâ;
 Char
Char. Òèï char ñëóæèò äëÿ ïðåäñòàâëåíèÿ ñèìâîëîâ. Â ÿçûêå Java ñèìâîë
õðàíèòñÿ â êîäèðîâêå Unicode è çàíèìàåò 16 áèòîâ;
Пример «Здравствуй, мир!»  Boolean
Boolean. Òèïîì boolean ìîæíî ïðåäñòàâèòü îäíî èç äâóõ çíà÷åíèé:
Ïðîãðàììó «Çäðàâñòâóé, ìèð!» (Hello, world!) ÷àñòî ïðèâîäÿò â ïðèìåð, êàê true èëè false.
ïðîñòåéøóþ èç âîçìîæíûõ ïðîãðàìì íà äàííîì ÿçûêå. Íà÷èíàþùèå ïðî-  ïëàòôîðìåííî-çàâèñèìûõ ÿçûêàõ, ê êîòîðûì îòíîñèòñÿ, â ÷àñòíîñòè, C,
ãðàììèñòû íà ýòîì ïðèìåðå îñâàèâàþò áàçîâóþ ñòðóêòóðó ÿçûêà, ó÷àòñÿ çà÷àñòóþ íå îïðåäåëåí òî÷íûé îáúåì ïàìÿòè, îòâîäèìîé ïîä õðàíåíèå äàí-
52 Глава 1. Написание безопасных программ Язык Java 53

íûõ ðàçíûõ òèïîâ. Íàïðîòèâ, â Java ðàçìåð è ôîðìàò âñåõ òèïîâ äàííûõ ñïå- Ñðåäè âñåõ öèêëîâ for èñïîëüçóåòñÿ ÷àùå âñåãî.  íà÷àëå âûïîëíåíèÿ öèêëà
öèôèöèðîâàíû â ñàìîì ÿçûêå. Ïðîãðàììèñòàì íå íàäî äóìàòü î ñèñòåìíûõ ïðîãðàììà âû÷èñëÿåò íà÷àëüíîå âûðàæåíèå è ïðîâåðÿåò ñëåäóþùåå çà íèì
îñîáåííîñòÿõ. óñëîâèå. Åñëè óñëîâèå èñòèííî, âûïîëíÿåòñÿ òåëî öèêëà («áëîê ïðåäëîæå-
 Java èìåþòñÿ òàêæå ññûëî÷íûå òèïû. Ïåðåìåííûå òàêîãî òèïà íå ñîäåð- íèé»).  êîíöå öèêëà ïðîèçâîäèòñÿ îïåðàöèÿ, óêàçàííàÿ òðåòüåé â çàãîëîâêå,
æàò çíà÷åíèÿ, à óêàçûâàþò íà êàêîé-òî àäðåñ â ïàìÿòè. Ìàññèâû, îáúåêòû è ïîñëå ÷åãî ñíîâà ïðîâåðÿåòñÿ óñëîâèå. Öèêë ïðîäîëæàåòñÿ, ïîêà óñëîâèå íå
èíòåðôåéñû – âñå ýòî äàííûå ññûëî÷íûõ òèïîâ. Íà ðèñ 1.2 ïðèâåäåíà êëàñ- ñòàíåò ëîæíûì.
ñèôèêàöèÿ òèïîâ â ÿçûêå Java. Îñîáåííî õîðîøî öèêë for ïîäõîäèò äëÿ âûïîëíåíèÿ èòåðàöèé. Åñëè íóæ-
íî âûïîëíèòü áëîê ïðåäëîæåíèé ïÿòü ðàç, òî ìîæíî íàïèñàòü òàêîé ïðî-
object ñòîé öèêë:

for( i = 0 ; i < 5 ; i++ ){


Ссылочные array [áëîê ïðåäëîæåíèé];
типы }

string Пример 1.12. Цикл «while»


Предопре) while( óñëîâèå ){
деленные [áëîê ïðåäëîæåíèé];
}
типы
bool
double Ïðè âûïîëíåíèè öèêëà while ïðîâåðÿåòñÿ óñëîâèå, ñòîÿùåå â íà÷àëå öèêëà.
Типы
Примитив) Åñëè îíî èñòèííî, âûïîëíåíèå öèêëà ïðîäîëæàåòñÿ, èíà÷å ïðåêðàùàåòñÿ.
с плавающей
ные типы Öèêë ïîâòîðÿåòñÿ, ïîêà óñëîâèå íå ñòàíåò ëîæíûì.
точкой
float
Число) Пример 1.13. Цикл «do...while»
вые типы byte do{
char [áëîê ïðåäëîæåíèé];
Целочислен) int } while( óñëîâèå );
ные типы long
short  öèêëå do...while ïðîâåðÿåìîå óñëîâèå íàõîäèòñÿ â êîíöå è ïðîâåðÿåòñÿ ïîñ-
ëå âûïîëíåíèÿ áëîêà ïðåäëîæåíèé. Åñëè îíî èñòèííî, òî áëîê ïðåäëîæåíèé
Рис. 1.2. Классификация типов данных в языке Java âûïîëíÿåòñÿ åùå ðàç, â ïðîòèâíîì ñëó÷àå ïðîèñõîäèò âûõîä èç öèêëà. Öèêë
do...while ïîõîæ íà öèêë while ñ îäíèì îòëè÷èåì: áëîê ïðåäëîæåíèé áóäåò âû-
ïîëíåí õîòÿ áû îäèí ðàç. Öèêëû ýòîãî âèäà âñòðå÷àþòñÿ ðåæå, ÷åì for è while.
Поток управления Ñëåäóåò îòìåòèòü, ÷òî â áîëüøèíñòâå ñëó÷àåâ âñå òðè öèêëè÷åñêèõ êîíñò-
 ÿçûêå Java äëÿ óïðàâëåíèÿ ïîòîêîì âûïîëíåíèÿ ïðîãðàììû ïðèìåíÿþòñÿ ðóêöèè ôóíêöèîíàëüíî ýêâèâàëåíòíû.
öèêëû.  ïðîãðàììàõ ÷àñòî âñòðå÷àþòñÿ ó÷àñòêè, êîòîðûå íàäî ïîâòîðèòü
ëèáî çàðàíåå èçâåñòíîå ÷èñëî ðàç, ëèáî äî òåõ ïîð, ïîêà íå áóäåò âûïîëíå- Пример 1.14. Эквивалентность циклов – выполнение пяти итераций
íî íåêîòîðîå óñëîâèå. Öèêëû êàê ðàç è ïðåäíàçíà÷åíû äëÿ ðåøåíèÿ ïîäîá- Öèêë for
for( i = 0 ; i < 5 ; i++ ){
íîãî ðîäà çàäà÷. Èìååòñÿ òðè îñíîâíûõ âèäà öèêëîâ: for, while è do...while. áëîê_ïðåäëîæåíèé;
}
Пример 1.11. Цикл «for»
for( íà÷àëüíîå_âûðàæåíèå; ïðîâåðÿåìîå_óñëîâèå; îïåðàöèÿ ){ Öèêë while
[áëîê ïðåäëîæåíèé]; int i = 0;
} while( i < 5 ){
54 Глава 1. Написание безопасных программ Язык Java 55
áëîê_ïðåäëîæåíèé; ìè õàðàêòåðèñòèêàìè. Êëàññ ãðóïïèðóåò äàííûå è ìåòîäû íåêîòîðûõ òèïîâ.
i++;
} Êëàññ ìîæåò ñîäåðæàòü êîíñòðóêòîðû, êîòîðûå îïðåäåëÿþò, êàê ñîçäàåòñÿ
ýêçåìïëÿð êëàññà èëè îáúåêò.  êëàññ âêëþ÷àþòñÿ ìåòîäû, âûïîëíÿþùèå
Öèêë do...while îïåðàöèè íàä ýêçåìïëÿðàìè ýòîãî êëàññà.
int i = 0; Ïðåäïîëîæèì, ê ïðèìåðó, ÷òî ïðîãðàììèñò ðàáîòàåò íàä ñèìóëÿòîðîì
do {
áëîê_ïðåäëîæåíèé;
ïîëåòîâ äëÿ êîìïàíèè, ïðîèçâîäèòåëÿ ñàìîëåòîâ. Ðåçóëüòàòû ýòîé ðàáîòû
i++; ïîìîãóò êîìïàíèè ïðèíÿòü âàæíûå ïðîåêòíûå ðåøåíèÿ. Â òàêîé ñèòóàöèè
} while( i < 5 ) îáúåêòíî-îðèåíòèðîâàííîå ïðîãðàììèðîâàíèå – èäåàëüíûé èíñòðóìåíò.
Ìîæíî ñîçäàòü êëàññ plane, èíêàïñóëèðóþùèé âñå õàðàêòåðèñòèêè ñàìîëåòà
 êàæäîì èç ýòèõ ïðèìåðîâ áëîê ïðåäëîæåíèé âûïîëíÿåòñÿ ïÿòü ðàç. Êîí- è ìåòîäû äëÿ ìîäåëèðîâàíèÿ åãî ïåðåìåùåíèé. Ìîæíî òàêæå ñîçäàòü íå-
ñòðóêöèè ðàçíûå, íî èõ ðåçóëüòàò îäèí è òîò æå. Ïîýòîìó ìû è ãîâîðèì, ÷òî ñêîëüêî îáúåêòîâ êëàññà plane, êàæäûé èç êîòîðûõ áóäåò ñîäåðæàòü ñâîè ñîá-
âñå âèäû öèêëîâ ôóíêöèîíàëüíî ýêâèâàëåíòíû. ñòâåííûå äàííûå.
Êëàññ ìîæåò ñîäåðæàòü íåñêîëüêî ïåðåìåííûõ, ê ïðèìåðó:
Методы  Weight (âåñ);
Ìîæíî ñêàçàòü, ÷òî ìåòîä (â äðóãèõ ÿçûêàõ åãî àíàëîãîì ñëóæèò ôóíêöèÿ) –  Speed (ñêîðîñòü);
ýòî ìèíèàòþðíàÿ ïðîãðàììà. Èíîãäà ïðîãðàììèñòó íóæíî ïîëó÷èòü íà âõî-  Maneuverabil ity (ìàíåâðåííîñòü);
äå îïðåäåëåííûå äàííûå, ïðîèçâåñòè íàä íèìè íåêîòîðóþ îïåðàöèþ è âåð-  Position (ïîëîæåíèå).
íóòü ðåçóëüòàò â òðåáóåìîì ôîðìàòå. Ïîíÿòèå ìåòîäà áûëî ïðèäóìàíî êàê Ñ åãî ïîìîùüþ ïðîãðàììèñò ìîæåò ñìîäåëèðîâàòü ïîëåò ñàìîëåòà ïðè çà-
ðàç äëÿ òàêèõ ïîâòîðÿþùèõñÿ îïåðàöèé. Ìåòîä – ýòî àâòîíîìíàÿ ÷àñòü ïðî- äàííûõ óñëîâèÿõ. Äëÿ ìîäèôèêàöèè õàðàêòåðèñòèê îáúåêòà ìîæíî íàïèñàòü
ãðàììû, êîòîðóþ ìîæíî âûçâàòü äëÿ âûïîëíåíèÿ îïåðàöèè íàä äàííûìè. íåñêîëüêî ìåòîäîâ äîñòóïà:
Ìåòîä ïðèíèìàåò íåêîòîðîå ÷èñëî àðãóìåíòîâ è âîçâðàùàåò çíà÷åíèå.
Íèæå ïðèâåäåí ïðèìåð ìåòîäà, êîòîðûé ïîëó÷àåò íà âõîäå öåëîå ÷èñëî è SetWeight( int )
SetSpeed( int )
âîçâðàùàåò åãî ôàêòîðèàë. SetManeuverability( int )
SetPosition( int )
Пример 1.15. Метод Factorial MovePosition( int )
int Factorial( int num ){
for( i = (num – 1) ; i > 0 ; i— ){ Êîä òàêîãî êëàññà plane ìîã áû âûãëÿäåòü ñëåäóþùèì îáðàçîì:
num *= i; /* ñîêðàùåííàÿ çàïèñü äëÿ num = num * i */
}
return num; Пример 1.16. Класс plane
} 1 public class plane{
2 int Weight;
 ïåðâîé ñòðîêå Factorial – ýòî èìÿ ìåòîäà. Åìó ïðåäøåñòâóåò êëþ÷åâîå 3 int Speed;
ñëîâî int, ãîâîðÿùåå î òîì, ÷òî ìåòîä âîçâðàùàåò öåëîå çíà÷åíèå. ×àñòü 4 int Maneuverability;
5 Location Position; /* òèï Location äîëæåí áûòü ãäå-òî îïðåäåëåí
( int num ) îçíà÷àåò, ÷òî ìåòîä ïðèíèìàåò â êà÷åñòâå àðãóìåíòà îäíî öåëîå 6 è ïðåäñòàâëÿòü ïðîñòðàíñòâåííûå êîîðäèíàòû (x,y,z) */
÷èñëî, êîòîðîå áóäåò îáîçíà÷àòüñÿ num. Ïðåäëîæåíèå return ãîâîðèò î òîì, 7 plane( int W, int S, int M, Location P ){
êàêîå èìåííî çíà÷åíèå ìåòîä âîçâðàùàåò. 8 Weight = W;
9 Speed = S;
10 Maneuverability = M;
Классы 11 Position = P;
12 }
Îáúåêòíî-îðèåíòèðîâàííûå ïðîãðàììû îðãàíèçîâàíû â âèäå íàáîðà êëàñ- 13
ñîâ. Êëàññ – ýòî äèñêðåòíàÿ åäèíèöà ïðîãðàììû, îáëàäàþùàÿ îïðåäåëåííû- 14 SetWeight( plane current, int W ){
56 Глава 1. Написание безопасных программ Язык Java 57
15 ñurrent.Weight = W;
16 }
Получение заголовков HTTP
17 Ïðè íàïèñàíèè ïðîãðàìì äëÿ ðàáîòû ñ ñåòüþ è îáåñïå÷åíèÿ áåçîïàñíîñòè íå
18 /* Ìåòîäû SetSpeed, SetManeuverability, SetPosition,
çàáûâàéòå î ñðåäñòâàõ, óæå èìåþùèõñÿ â òîì èëè èíîì ÿçûêå. Â ïðèìåðå
MovePosition òîæå äîëæíû áûòü îïðåäåëåíû */
19 } 1.17 ïðèâåäåíà ïðîãðàììà, êîòîðàÿ ïîëó÷àåò çàãîëîâêè, ïðèñëàííûå â îòâåòå
íà çàïðîñ ïî ïðîòîêîëó HTTP (Hypertext Transfer Protocol) ê çàäàííîìó URL.
Ýòîò êîä ñëóæèò äëÿ èíèöèàëèçàöèè îáúåêòà êëàññà plane. Ïðè âûçîâå ìå-
òîäà plane çàäàþòñÿ âñå õàðàêòåðèñòèêè, êîòîðûìè äîëæåí îáëàäàòü ñàìî-
Пример 1.17. Получение заголовков HTTP
1 import java.net.URL;
ëåò: âåñ, ñêîðîñòü, ìàíåâðåííîñòü è ïîëîæåíèå. Íà ïðèìåðå ìåòîäà SetWeight 2 import java.net.URLConnection;
ïîêàçàíî, êàê ìîæíî âêëþ÷èòü â êëàññ îïåðàöèþ íàä îïèñûâàåìûì èì 3 import java.io.*;
îáúåêòîì. 4 import java.util.*;
Ñèìóëÿòîð ìîæåò ñîçäàòü íåñêîëüêî ýêçåìïëÿðîâ êëàññà plane è âûïîëíèòü 5
6 public class HTTPGET{
«ïðîáíûå ïîëåòû» äëÿ îöåíêè âëèÿíèÿ ðàçëè÷íûõ õàðàêòåðèñòèê. Íàïðèìåð, 7 public static void main (String [] Args){
ñàìîëåò plane1 ìîæåò âåñèòü 5000 ôóíòîâ, ëåòàòü ñî ñêîðîñòüþ 500 ìèëü/÷àñ 8 try{
è îáëàäàòü ìàíåâðåííîñòüþ 10, òîãäà êàê äëÿ ñàìîëåòà plane2 ìîæíî çàäàòü 9 FileWriter file = new FileWriter( "OutFile" );
ñëåäóþùèå ïàðàìåòðû: âåñ 6000 ôóíòîâ, ñêîðîñòü 600 ìèëü/÷àñ, ìàíåâðåí- 10 PrintWriter OutputFile = new PrintWriter( file );
11
íîñòü 8.  ÿçûêå Java ýêçåìïëÿðû êëàññà ñîçäàþòñÿ ñ ïîìîùüþ êëþ÷åâîãî 12 URL url = new URL( "http://www.google.com" );
ñëîâà new. Ñêàæåì, îáúåêò plane1 ìîæíî ñîçäàòü ñ ïîìîùüþ òàêèõ ïðåäëî- 13 URLConnection urlConnection = url.openConnection();
æåíèé: 14 InputStream IS = urlConnection.getInputStream();
15
plane plane1; 16 IS.close();
Location p; 17 OutputFile.print( IS );
p = new Location( 3, 4, 5 ); 18 } catch (Exception e) { System.out.println("Error"); }
plane1 = new plane(5.000, 500, 10, p ); 19 }
20 }
Íàñëåäîâàíèå ïîçâîëÿåò ïðîãðàììèñòàì ñîçäàâàòü èåðàðõèè êëàññîâ.
Êëàññû îðãàíèçóþòñÿ â äðåâîâèäíûå ñòðóêòóðû, â êîòîðûõ ó êàæäîãî êëàññà Ýòà ïðîãðàììà äåìîíñòðèðóåò, êàê íà ÿçûêå Java ìîæíî îòïðàâèòü HTTP-
åñòü «ðîäèòåëè» è, âîçìîæíî, «ïîòîìêè». Êëàññ «íàñëåäóåò», òî åñòü ìîæåò çàïðîñ òèïà GET è âûâåñòè ïîëó÷åííûé ðåçóëüòàò â ôàéë. Òî è äðóãîå ÷àñòî
ïîëüçîâàòüñÿ ôóíêöèÿìè ëþáîãî èç ñâîèõ ðîäèòåëåé, íàçûâàåìûõ òàêæå åãî áûâàåò íóæíî ïðè ðåàëèçàöèè ñåòåâûõ èíñòðóìåíòîâ. Ïîñðåäñòâîì ñòðîê
ñóïåðêëàññàìè. Íàïðèìåð, åñëè êëàññ plane ÿâëÿåòñÿ ïîäêëàññîì êëàññà vehicle, 1–4 èìïîðòèðóþòñÿ áèáëèîòåêè, íåîáõîäèìûå äëÿ óñòàíîâëåíèÿ ñîåäèíåíèÿ
ñ çàäàííûì URL è äëÿ ââîäà/âûâîäà. Â ñòðîêàõ 9 è 10 èíèöèàëèçèðóåòñÿ îáúåêò
òî îáúåêò êëàññà plane èìååò äîñòóï êî âñåì ìåòîäàì, êîòîðûå ìîæíî âû-
êëàññà FileWriter è çàäàåòñÿ âûõîäíîé ôàéë äëÿ íåãî, çàòåì ñîçäàåòñÿ îáúåêò
ïîëíÿòü íàä îáúåêòîì êëàññà vehicle.
PrintWriter, êîòîðûé áóäåò îñóùåñòâëÿòü âûâîä â ýòîò ôàéë (ñòðîêà 17).
Ó êëàññîâ åñòü ìíîãî ïðåèìóùåñòâ, íåäîñòàþùèõ äðóãèì èìåþùèìñÿ
Äëÿ ñîçäàíèÿ ñîåäèíåíèÿ ñ ïîìîùüþ êëàññà java.net.URLConnection íóæíî
â ÿçûêå òèïàì. Îíè ïðåäîñòàâëÿþò ýôôåêòèâíîå ñðåäñòâî äëÿ îðãàíèçà-
âûïîëíèòü íåñêîëüêî øàãîâ. Ñíà÷àëà ìåòîäîì openConnection() ñîçäàåòñÿ
öèè ïðîãðàììû â âèäå íàáîðà ìîäóëåé, êîòîðûì ìîæíî íàñëåäîâàòü. Ìîæ- îáúåêò, ïðåäñòàâëÿþùèé ñîåäèíåíèå. Äàëåå äëÿ íåãî ìîãóò áûòü çàäàíû ðàç-
íî òàêæå ñîçäàâàòü àáñòðàêòíûå êëàññû, âûñòóïàþùèå â ðîëè èíòåðôåé- ëè÷íûå ïàðàìåòðû, ïîñëå ÷åãî ñîåäèíåíèå îòêðûâàåòñÿ ìåòîäîì connect().
ñîâ. Èíòåðôåéñ îïðåäåëÿåò, íî íå ðåàëèçóåò íåêîòîðóþ ôóíêöèîíàëüíîñòü, Ïîñëå òîãî êàê ñîåäèíåíèå óñòàíîâëåíî, äàííûå èç íåãî ñ÷èòûâàþòñÿ â îáúåêò
îñòàâëÿÿ ýòó çàäà÷ó ñâîèì ïîäêëàññàì. Äàííûå êëàññà ìîæíî îáúÿâëÿòü IS êëàññà InputStream. Â ñòðîêå 16 ïîòîê çàêðûâàåòñÿ, è â ñòðîêå 17 åãî ñîäåð-
çàêðûòûìè, ãàðàíòèðóÿ òåì ñàìûì, ÷òî äîñòóï ê âíóòðåííåìó ñîñòîÿíèþ æèìîå âûâîäèòñÿ â ôàéë.
êëàññà âîçìîæåí ëèøü ñ ïîìîùüþ ñïåöèàëüíî ïðåäóñìîòðåííûõ äëÿ ýòîãî Åñëè â ïðîöåññå âûïîëíåíèÿ âîçìîæíî âîçíèêíîâåíèå èñêëþ÷åíèé, â Java
ìåòîäîâ. ïðèìåíÿþòñÿ îïåðàòîðíûå ñêîáêè try è catch (ñòðîêè 8 è 18), â êîòîðûõ çàêëþ-
58 Глава 1. Написание безопасных программ Язык C# 59

÷åí ïîòåíöèàëüíî îïàñíûé êîä.  ñòðîêå catch óêàçûâàåòñÿ òèï è èìÿ îæèäà-
любым инструментом для перекодировки из кода ASCII в 16ричную
åìîãî èñêëþ÷åíèÿ, à çàòåì äåéñòâèÿ, êîòîðûå ñëåäóåò ïðåäïðèíÿòü ïðè åãî
форму (такая программа есть, скажем, на сайте http://d21c.com//
âîçíèêíîâåíèè.
sookietex/ASCII2HEX.html).
Äëÿ ðàáîòû íà óðîâíå ñîêåòîâ â Java èìåþòñÿ äîïîëíèòåëüíûå êëàññû, íà-
ïðèìåð:
Как предотвратить
Защититься от такой атаки на вашем форуме несложно. Напишите
java.net.socket
java.net.serversocket фильтрующий сценарий, который проверяет, что в любой опублико
java.net.datagramsocket ванной пользователем ссылке после имени домена имеется символ
java.net.multicastsocket
«/». Тогда приведенная выше ссылка после фильтрации приобретет
такой вид:
Çàìåòèì, âïðî÷åì, ÷òî íè îäèí èç íèõ íå äàåò äîñòóïà ê ïðîñòûì (raw)
http://www.google.com/
ñîêåòàì. Åñëè ýòî íåîáõîäèìî, ïðèäåòñÿ îáðàòèòüñÿ ê ÿçûêàì C, C++ èëè C#.
story=%40%77%77%77%2E%79%61%68%6F%6F%2E%63%6F%6D
Теперь попытка перейти по этой ссылке приведет к ошибке, так что
атака не состоялась. Отметим, что некоторые современные браузе
Примечание ры уже содержат защиту от подобной уловки. К примеру, Firefox пре
Посетителей Webсайтов часто обманом вынуждают сообщить пре дупреждает пользователя об опасности.
ступникам секретные данные, например, номер кредитной карты
или социального страхования. Хакер может провести такую атаку,
скопировав внешний облик чужого сайта на своем сервере, так что
посетитель по ошибке примет его за настоящий сайт. Один из про
Язык C#
стейших способов реализовать эту уловку заключается в том, чтобы Â äåêàáðå 2001 ãîäà êîìïàíèÿ Microsoft âûïóñòèëà â îáðàùåíèå ÿçûê C#. Îí
разместить на публичном форуме ссылку, которая на первый взгляд ñïðîåêòèðîâàí Àíäåðñîì Õåéëüñáåðãîì (Anders Hejlsberg) è ïðåäíàçíà÷åí
выглядит вполне обычно, но ведет совершенно не туда, куда кажется ïðåæäå âñåãî äëÿ íàïèñàíèÿ êîìïîíåíòîâ Web-ñåðâèñîâ íà ïëàòôîðìå .NET.
на первый взгляд. Например, добропорядочный пользователь при Çà ïðåäøåñòâóþùåå äåñÿòèëåòèå ÿçûê Java ïðèîáðåë øèðîêóþ ïîïóëÿðíîñòü
глашает посетителей форума прочитать новость по такому адресу: áëàãîäàðÿ ñâîåé ïåðåíîñèìîñòè, ïðîñòîòå è ìîùíîé áèáëèîòåêå êëàññîâ.
http://www.google.com/?news=story1.html Õîòÿ î ïðè÷èíàõ, ïî êîòîðûì Microsoft ðåøèëà çàíÿòüñÿ ðàçðàáîòêîé C#, âå-
Хакер же может разместить похожую ссылку, которая переадресует äóòñÿ îæåñòî÷åííûå ñïîðû, ìîæíî ñ÷èòàòü ýòî îòâåòîì íà ïîïóëÿðíîñòü
посетителя совсем в другое место: Java. Îæèäàåòñÿ ÷òî ïî ìåðå ðàñïðîñòðàíåíèÿ ïëàòôîðìû .NET Framework
http://www.google.com ìíîãèå ïðîãðàììèñòû, ðàáîòàþùèå íà C++ è Visual Basic, ïåðåéäóò íà C#.
story=%40%77%77%77%2E%79%61%68%6F%6F%2E%63%6F%6D Õîòÿ ÿçûê C# è ðàçðàáîòàí êîìïàíèåé Microsoft, îí íå ÿâëÿåòñÿ åå ñîá-
Можете ли вы сказать, куда попадете, щелкнув по такой ссылке? ñòâåííîñòüþ. Çà ñòàíäàðòèçàöèþ C# îòâå÷àåò Åâðîïåéñêàÿ àññîöèàöèÿ èçãî-
Оказывается, на http://www.yahoo.com. Переадресация обеспечива òîâèòåëåé êîìïüþòåðîâ (European Computer Manufacturers Association). Ýòîò
ется символами, указанными в конце URL. Эти символы представле ôàêò â êàêîé-òî ìåðå ñíèìàåò îïàñåíèÿ, ÷òî Microsoft ìîæåò ââåñòè îãðàíè-
ны в 16ричной кодировке и соответствуют строке ÷åíèÿ íà èñïîëüçîâàíèå ÿçûêà â ÷óæèõ ïðîäóêòàõ.
@www.yahoo.com
Обман основан на ранней схеме аутентификации через Web, когда
пользователь получал доступ к сайту, задав URL в формате http:// Основания для перехода на C#
user@site. В этом случае Webбраузер пытался обратиться к сайту, Åñëè âåðèòü çàÿâëåíèÿì Microsoft, .NET ñòàíåò ïëàòôîðìîé äëÿ ðàçðàáîòêè
указанному после символа @. Чтобы быстро создать зловредные Web-ñåðâèñîâ, íà êîòîðîé ñìîãóò âçàèìîäåéñòâîâàòü êîìïîíåíòû, íàïèñàí-
ссылки в указанном формате, хакеру достаточно воспользоваться íûå íà ðàçíûõ ÿçûêàõ. Õîòÿ .NET ïîääåðæèâàåò ìíîãî ÿçûêîâ, íî îñíîâíûì
60 Глава 1. Написание безопасных программ Язык C# 61

äëÿ íåå ÿâëÿåòñÿ C#. Ðàçðàáîò÷èêè, ïðèâûêøèå ïðîãðàììèðîâàòü â ñðåäå Vi-  Ñîêðûòèå äàííûõ
äàííûõ. Îáúåêòû, òî åñòü ýêçåìïëÿðû êëàññà ìîãóò ñîäåð-
sual Studio, îáíàðóæàò, ÷òî ïåðåõîä îò Visual C++ ê Visual C#.NET íåñëîæåí. æàòü äàííûå, êîòîðûå íå ìîãóò áûòü èçìåíåíû èíà÷å êàê ñ ïîìîùüþ
C# ñòàíåò ÿçûêîì ïî óìîë÷àíèþ äëÿ ðàçðàáîòêè ïðîãðàìì äëÿ Windows. ìåòîäîâ ñàìîãî ýòîãî êëàññà. Ïðîãðàììèñò ìîæåò ñêðûòü äàííûå, íà-
Äà, àðõèòåêòóðíî-íåéòðàëüíûé ÿçûê Java ìîæåò ðàáîòàòü òàêæå è â Windows, çíà÷èâ èì àòðèáóò «private» (çàêðûòûé);
íî â C# âñòðîåíû ìíîãèå âîçìîæíîñòè, ñïåöèôè÷íûå èìåííî äëÿ ýòîé ÎÑ.  Àáñòðàêòíûå òèïû äàííûõ
äàííûõ. Ïðîãðàììèñò ìîæåò îïðåäåëèòü êëàññ,
Íàïðèìåð, ñ ïîìîùüþ C# ëåãêî îáðàùàòüñÿ ê òàêèì îñîáåííîñòÿì Windows, êîòîðûé ìîæíî ïðåäñòàâëÿòü ñåáå êàê îáîáùåíèå ñòðóêòóðû (struct),
êàê ãðàôè÷åñêèé èíòåðôåéñ ïîëüçîâàòåëÿ è ñåòåâûå ñëóæáû. Ïðîãðàììû, èìåþùåéñÿ â ÿçûêå C. Êëàññ îïèñûâàåò îïðåäåëåííûé ïðîãðàììèñòîì
íàïèñàííûå íà C++, ñðàâíèòåëüíî ëåãêî ïåðåíîñÿòñÿ íà C#, òîãäà êàê ïåðå- òèï äàííûõ âìåñòå ñ îïåðàöèÿìè, ïðèìåíèìûìè ê îáúåêòàì ýòîãî òèïà.
ïèñûâàíèå èõ íà Java òðåáóåò çíà÷èòåëüíûõ óñèëèé.
Ïðè ðàçðàáîòêå Web-ñåðâèñîâ âûáîð ñîâðåìåííîãî ÿçûêà îñîáåííî âà- Ïðî÷èå âîçìîæíîñòè
æåí. Java è C# îáåñïå÷èâàþò íåçàâèñèìîñòü îò ïëàòôîðìû, ïðåäîñòàâëÿþò ßçûê C# ïðåäëàãàåò òàêæå ñëåäóþùèå âîçìîæíîñòè:
âñå ïðåèìóùåñòâà îáúåêòíî-îðèåíòèðîâàííîãî ïðîãðàììèðîâàíèÿ è ñîêðà-
ùàþò âðåìÿ ðàçðàáîòêè çà ñ÷åò òàêèõ ìåõàíèçìîâ êàê àâòîìàòè÷åñêîå óïðàâ-  Àâòîìàòè÷åñêóþ ñáîðêó ìóñîðà ñ ïîìîùüþ ìåõàíèçìîâ, âñòðîåííûõ
ëåíèå ïàìÿòüþ. Êðîìå òîãî, C# ëåãêî îñâàèâàåòñÿ ïðîãðàììèñòàìè, ÷òî â ñðåäó èñïîëíåíèÿ .NET;
óìåíüøàåò ðàñõîäû íà îáó÷åíèå. Áëàãîäàðÿ íàëè÷èþ ìíîãèõ äîñòîèíñòâ è  Êëàññû â C# ìîãóò ñíàáæàòüñÿ ìåòàäàííûìè, õðàíÿùèìèñÿ â âèäå àò-
ëèøü íåìíîãèõ íåäîñòàòêîâ, áîëüøîå ÷èñëî êîìïàíèé ñ÷èòàþò C# ýêîíîìè- ðèáóòîâ. ×ëåíû êëàññà ìîãóò áûòü îáúÿâëåíû êàê publ ic, protected,
÷åñêè îïðàâäàííûì âûáîðîì. internal, protected internal èëè private â çàâèñèìîñòè îò òîãî, êàêóþ ñâî-
áîäó äîñòóïà ê íèì æåëàòåëüíî ïðåäîñòàâèòü;
 Â C# ëåãêî ðåàëèçóåòñÿ óïðàâëåíèå âåðñèÿìè. Ïðîãðàììèñò ìîæåò õðà-
Характеристики языка íèòü ðàçëè÷íûå âåðñèè îòêîìïèëèðîâàííûõ ôàéëîâ â ðàçíûõ ïðî-
C# – ýòî ñîâðåìåííûé ïëàòôîðìåííî-íåçàâèñèìûé (ïî êðàéíåé ìåðå, òåîðå- ñòðàíñòâàõ èìåí. Ýòî ìîæåò ñóùåñòâåííî ñîêðàòèòü âðåìÿ ðàçðàáîòêè
òè÷åñêè) îáúåêòíî-îðèåíòèðîâàííûé ÿçûê ïðîãðàììèðîâàíèÿ. Íîâåéøèå êðóïíûõ ïðîåêòîâ;
âîçìîæíîñòè ñî÷åòàþòñÿ â íåì ñ ñèíòàêñèñîì, ïîõîæèì íà C/C++, ïîýòîìó   C# óïðîùåí ìåõàíèçì îáõîäà êîëëåêöèé (ñòðóêòóð, ïîäîáíûõ ìàññè-
îïûòíûì ïðîãðàììèñòàì äîñòàòî÷íî ïðîñòî âûó÷èòü íîâûé ÿçûê. C# îòëè- âàì) çà ñ÷åò èñïîëüçîâàíèÿ âñòðîåííûõ èòåðàòîðîâ. Êîíñòðóêöèÿ
÷àåòñÿ îò Java, â ÷àñòíîñòè, òåì, ÷òî íàëàãàåò ìåíüøå îãðàíè÷åíèé è â ýòîì foreach ïîçâîëÿåò ïåðåáðàòü âñå ýëåìåíòû êîëëåêöèè;
îòíîøåíèè áîëüøå íàïîìèíàåò C++. Êàê è C++, C# ïîääåðæèâàåò ïðÿìóþ   C# ââåäåíî ïîíÿòèå äåëåãàòà. Ìîæíî ñ÷èòàòü ýòî íåêèì àíàëîãîì
êîìïèëÿöèþ â ìàøèííûé êîä, èìååò ïðåïðîöåññîð è ñòðóêòóðû. óêàçàòåëÿ íà ìåòîä. Äåëåãàò ñîäåðæèò èíôîðìàöèþ î òîì, êàê âûçû-
âàòü ìåòîä îáúåêòà. Äåëåãàòû øèðîêî ïðèìåíÿþòñÿ â C# äëÿ ðåàëèçà-
Îáúåêòíî-îðèåíòèðîâàííûå âîçìîæíîñòè öèè îáðàáîò÷èêîâ ñîáûòèé.
C# – îáúåêòíî-îðèåíòèðîâàííûé ÿçûê ïðîãðàììèðîâàíèÿ, ÷òî îçíà÷àåò íà-
ëè÷èå ñëåäóþùèõ äîñòîèíñòâ:
Áåçîïàñíîñòü
Ìîäåëü áåçîïàñíîñòè â C# ñïðîåêòèðîâàíà ñ ó÷åòîì ñðåäû èñïîëíåíèÿ .NET è
 Èíêàïñóëÿöèÿ
Èíêàïñóëÿöèÿ. Çà ñ÷åò èñïîëüçîâàíèÿ êëàññîâ îáúåêòíî-îðèåíòèðî-
ïðåäîñòàâëÿåò ñëåäóþùèå âîçìîæíîñòè:
âàííûé êîä èìååò î÷åíü õîðîøóþ îðãàíèçàöèþ è îáëàäàåò âûñîêîé
ìîäóëüíîñòüþ. Äàííûå è ìåòîäû äëÿ âûïîëíåíèÿ îïåðàöèé íàä íèìè  Ïîëíîìî÷èÿ (permissions).  ïðîñòðàíñòâå èìåí System.Security.Per-
èíêàïñóëèðîâàíû â ñòðóêòóðó êëàññà; missions ñîñðåäîòî÷åíà âñÿ ôóíêöèîíàëüíîñòü, îòíîñÿùàÿñÿ ê ïîëíî-
 Íàñëåäîâàíèå
Íàñëåäîâàíèå. Îáúåêòíî-îðèåíòèðîâàííàÿ îðãàíèçàöèÿ è èíêàïñóëÿ- ìî÷èÿì êîäà. Ïðîãðàììà ìîæåò îïðåäåëÿòü ïîëíîìî÷èÿ è çàïðàøè-
öèÿ ïîçâîëÿþò áåç òðóäà ðåàëèçîâàòü ïîâòîðíîå èñïîëüçîâàíèå èëè âàòü èõ ó âûçûâàþùåé ïðîãðàììû. Ñóùåñòâóåò òðè òèïà ïîëíîìî÷èé:
«íàñëåäîâàíèå» ðàíåå íàïèñàííîãî êîäà. Íàñëåäîâàíèå ýêîíîìèò âðå- íà èñïîëíåíèå êîäà, ïðîâåðêè èäåíòè÷íîñòè è ðîëåâûå;
ìÿ, òàê êàê ïðîãðàììèñòó íå íóæíî çàíîâî êîäèðîâàòü óæå èìåþùóþ-  Ïîëèòèêè áåçîïàñíîñòè
áåçîïàñíîñòè. Àäìèíèñòðàòîð ìîæåò ñîçäàòü ïîëèòèêó áå-
ñÿ ôóíêöèîíàëüíîñòü; çîïàñíîñòè, íàëàãàþùóþ îãðàíè÷åíèÿ íà òå îïåðàöèè, êîòîðûå ìîæåò
62 Глава 1. Написание безопасных программ Язык C# 63

âûïîëíÿòü ïðîãðàììà. Çà ñîáëþäåíèåì ýòèõ îãðàíè÷åíèé ñëåäèò îáùå- ïàñíûé). Îáúåêòû, íà êîòîðûå ññûëàþòñÿ óêàçàòåëè, íå ïîäâåðãàþòñÿ ñáîðêå
ÿçûêîâàÿ ñðåäà èñïîëíåíèÿ .NET (CLR – Common Language Runtime); ìóñîðà.  C# èìåþòñÿ ñëåäóþùèå çíà÷àùèå òèïû:
 Ïðèíöèïàëû
Ïðèíöèïàëû. Ïðèíöèïàë âûïîëíÿåò äåéñòâèÿ îò èìåíè ïîëüçîâàòåëÿ.  Byte
Byte. Òèïîì byte ïðåäñòàâëÿåòñÿ öåëîå ÷èñëî, çàíèìàþùåå 1 áàéò ïàìÿòè;
Ñèñòåìà àóòåíòèôèöèðóåò ïðèíöèïàëà ñ ïîìîùüþ âåðèòåëüíûõ ãðà-  Sbyte
Sbyte. Òèïîì sbyte ïðåäñòàâëÿåòñÿ öåëîå ÷èñëî ñî çíàêîì, çàíèìàþùåå
ìîò, ïðåäîñòàâëÿåìûõ åãî àãåíòîì. Ñðåäà èñïîëíåíèÿ .NET ãàðàíòèðó-
1 áàéò ïàìÿòè;
åò, ÷òî ïðîãðàììà ñìîæåò óñïåøíî çàâåðøèòü ëèøü òå äåéñòâèÿ, êîòî-
 Short
Short. Òèï short ñëóæèò äëÿ ïðåäñòàâëåíèÿ öåëûõ ÷èñåë ñî çíàêîì, çàíè-
ðûå åé ðàçðåøåíû.
ìàþùèõ 2 áàéòà ïàìÿòè;
 Áåçîïàñíîñòü ïî îòíîøåíèþ ê òèïàì
òèïàì. C# ãàðàíòèðóåò, ÷òî ïðîãðàì-
 Ushort
Ushort. Òèï ushort ñëóæèò äëÿ ïðåäñòàâëåíèÿ áåççíàêîâûõ öåëûõ ÷èñåë
ìà ñìîæåò ïîëó÷èòü äîñòóï òîëüêî ê îòêðûòîé äëÿ íåå ïàìÿòè.
ñî çíàêîì, çàíèìàþùèõ 2 áàéòà ïàìÿòè;
 Int
Int. Òèï int ñëóæèò äëÿ ïðåäñòàâëåíèÿ öåëûõ ÷èñåë ñî çíàêîì, çàíèìàþ-
Пример «Здравствуй, мир!» на языке C# ùèõ 4 áàéòà ïàìÿòè;
Ïðîãðàììó «Çäðàâñòâóé, ìèð!» (Hello, world!) ÷àñòî ïðèâîäÿò â ïðèìåð, êàê  Uint
Uint. Òèï uint ñëóæèò äëÿ ïðåäñòàâëåíèÿ áåççíàêîâûõ öåëûõ ÷èñåë, çà-
ïðîñòåéøóþ èç âîçìîæíûõ ïðîãðàìì íà äàííîì ÿçûêå. Íà÷èíàþùèå ïðî- íèìàþùèõ 4 áàéòà ïàìÿòè;
ãðàììèñòû íà ýòîì ïðèìåðå îñâàèâàþò áàçîâóþ ñòðóêòóðó ÿçûêà, ó÷àòñÿ  Long
Long. Òèï long ñëóæèò äëÿ ïðåäñòàâëåíèÿ öåëûõ ÷èñåë ñî çíàêîì, çàíè-
ïîëüçîâàòüñÿ êîìïèëÿòîðîì è çàïóñêàòü ïðîãðàììó íà âûïîëíåíèå. Íèæå ìàþùèõ 8 áàéòîâ ïàìÿòè;
ïðèâåäåí òåêñò òàêîé ïðîãðàììû íà ÿçûêå C#.  Ulong
Ulong. Òèï ulong ñëóæèò äëÿ ïðåäñòàâëåíèÿ áåççíàêîâûõ öåëûõ ÷èñåë,
çàíèìàþùèõ 8 áàéòîâ ïàìÿòè;
Пример 1.18. Здравствуй, мир!  Float
Float. Òèïîì float ïðåäñòàâëÿþò ÷èñëà ñ ïëàâàþùåé òî÷êîé, ïîä êîòî-
using System; ðûå îòâîäèòñÿ 4 áàéòà;
class HelloWorld{  Double
Double. Òèï double ñëóæèò äëÿ ïðåäñòàâëåíèÿ ÷èñåë ñ ïëàâàþùåé òî÷-
public static void Main() {
Console.WriteLine("Hello, world!"); êîé äâîéíîé òî÷íîñòè. Äëÿ íèõ îòâîäèòñÿ 8 áàéòîâ;
}  Object
Object. Ýòî áàçîâûé òèï, íå èìåþùèé îòäåëüíîãî ïðåäñòàâëåíèÿ;
}
 Decimal
Decimal. Ýòî ÷èñëîâîé òèï, ïðèìåíÿåìûé äëÿ ôèíàíñîâûõ ðàñ÷åòîâ.
Ïîä íåãî îòâîäèòñÿ 8 áàéòîâ, çíà÷åíèÿ ýòîãî òèïà äîëæíû ñîïðîâîæ-
Ýòà ïðîãðàììà î÷åíü íàïîìèíàåò ñîñòàâëåííóþ íà ÿçûêå Java. Êëàññ Hello-
äàòüñÿ ñóôôèêñîì «M»;
World ñîäåðæèò åäèíñòâåííûé ìåòîä Main, êîòîðîìó íå ïåðåäàþòñÿ íèêàêèå
 String
String. Òèïîì string ïðåäñòàâëÿåòñÿ ïîñëåäîâàòåëüíîñòü ñèìâîëîâ â êî-
àðãóìåíòû. Ýòîò ìåòîä îòêðûòûé (public), òî åñòü ê íåìó ìîæíî îáðàùàòüñÿ
äèðîâêå Unicode. Ðàçìåð ñòðîê íå ôèêñèðîâàí;
èçâíå êëàññà HelloWorld. Îí íå âîçâðàùàåò çíà÷åíèÿ, î ÷åì ãîâîðèò êëþ÷å-
 Char
Char. Òèï char ñëóæèò äëÿ ïðåäñòàâëåíèÿ ñèìâîëîâ. Â ÿçûêå C# ñèìâîë
âîå ñëîâî void.  C# ìåòîä WriteLine ÿâëÿåòñÿ ÷ëåíîì êëàññà Console. Îí ïå÷à-
õðàíèòñÿ â êîäèðîâêå Unicode è çàíèìàåò 16 áèòîâ;
òàåò ñòðîêó «Hello, world!» íà ñòàíäàðòíûé âûâîä.
 Boolean
Boolean. Òèïîì boolean ìîæíî ïðåäñòàâèòü îäíî èç äâóõ çíà÷åíèé:
true èëè false. Îí çàíèìàåò 1 áàéò.
Типы данных  ïëàòôîðìåííî-çàâèñèìûõ ÿçûêàõ, ê êîòîðûì îòíîñèòñÿ, â ÷àñòíîñòè, C,
Òèïû äàííûõ ñëóæàò â ÿçûêàõ ïðîãðàììèðîâàíèÿ äëÿ îïðåäåëåíèÿ ïåðåìåí- òî÷íûé îáúåì ïàìÿòè, îòâîäèìîé ïîä õðàíåíèå äàííûõ ðàçíûõ òèïîâ, ÷àñòî
íûõ äî èõ èíèöèàëèçàöèè. Òèï îïðåäåëÿåò, êàê ïåðåìåííàÿ áóäåò ðàçìåùåíà íå îïðåäåëåí. Íàïðîòèâ, â C# è â J#, êàê è â Java ðàçìåð è ôîðìàò âñåõ òèïîâ
â ïàìÿòè è êàêèå äàííûå îíà ìîæåò ñîäåðæàòü. Ãîâîðÿò, ÷òî ïåðåìåííàÿ äàííûõ ñïåöèôèöèðîâàíû â ñàìîì ÿçûêå. Ïðîãðàììèñòàì íå íàäî äóìàòü
ÿâëÿåòñÿ ýêçåìïëÿðîì íåêîòîðîãî òèïà äàííûõ. Â ÿçûêå C# åñòü äâå ðàçíî- î ñèñòåìíûõ îñîáåííîñòÿõ.
âèäíîñòè òèïîâ äàííûõ: çíà÷àùèå è ññûëî÷íûå.  îòëè÷èå îò Java, â C# íåò  C# èìåþòñÿ òàêæå ññûëî÷íûå òèïû. Ïåðåìåííûå òàêîãî òèïà íå ñîäåð-
ïðèìèòèâíûõ òèïîâ, íàïðèìåð, int.  C# âñå äàííûå ÿâëÿþòñÿ îáúåêòàìè. æàò çíà÷åíèÿ, à óêàçûâàþò íà êàêîé-òî àäðåñ â ïàìÿòè. Ìàññèâû, îáúåêòû è
 C# òàêæå ðàçðåøåí ïðÿìîé äîñòóï ê ïàìÿòè ñ ïîìîùüþ óêàçàòåëåé, íî èíòåðôåéñû – âñå ýòî äàííûå ññûëî÷íûõ òèïîâ. Íà ðèñ 1.3 ïðèâåäåíà êëàññè-
òîëüêî âíóòðè ó÷àñòêîâ êîäà, ïîìå÷åííûõ êëþ÷åâûì ñëîâîì unsafe (íåáåçî- ôèêàöèÿ òèïîâ â ÿçûêå C#.
64 Глава 1. Написание безопасных программ Язык C# 65

Èç âñåõ öèêëîâ for èñïîëüçóåòñÿ ÷àùå âñåãî.  íà÷àëå âûïîëíåíèÿ öèêëà


object
ïðîãðàììà âû÷èñëÿåò íà÷àëüíîå âûðàæåíèå è ïðîâåðÿåò ñëåäóþùåå çà íèì
óñëîâèå. Åñëè óñëîâèå èñòèííî, âûïîëíÿåòñÿ òåëî öèêëà («áëîê ïðåäëîæå-
Ссылоч)
íèé»). Â êîíöå öèêëà ïðîèçâîäèòñÿ îïåðàöèÿ, óêàçàííàÿ íà òðåòüåé â çàãîëîâ-
Предопределенные типы

ные типы
êå, ïîñëå ÷åãî ñíîâà ïðîâåðÿåòñÿ óñëîâèå. Öèêë ïðîäîëæàåòñÿ, ïîêà óñëîâèå
string íå ñòàíåò ëîæíûì.
Îñîáåííî õîðîøî öèêë for ïîäõîäèò äëÿ âûïîëíåíèÿ èòåðàöèé. Åñëè íóæ-
íî âûïîëíèòü áëîê ïðåäëîæåíèé ïÿòü ðàç, òî ìîæíî íàïèñàòü òàêîé ïðî-
Перечис) decimal
ñòîé öèêë:
лимые
типы for( i = 0 ; i < 5 ; i++ ){
Знача) [áëîê ïðåäëîæåíèé];
bool double }
щие типы Типы
Струк) с плавающей
Простые точкой
Пример 1.20. Цикл «while»
турные float
типы while( óñëîâèå ){
типы Чис)
[áëîê ïðåäëîæåíèé];
}
ловые byte
типы char Ïðè âûïîëíåíèè öèêëà while ïðîâåðÿåòñÿ óñëîâèå, ñòîÿùåå â íà÷àëå öèêëà.
Целочислен) int Åñëè îíî èñòèííî, âûïîëíåíèå öèêëà ïðîäîëæàåòñÿ, èíà÷å ïðåêðàùàåòñÿ.
ные типы long Öèêë ïîâòîðÿåòñÿ, ïîêà óñëîâèå íå ñòàíåò ëîæíûì.
sbyte
short Пример 1.21. Цикл «do...while»
do{
uint [áëîê ïðåäëîæåíèé];
ulong } while( óñëîâèå );
ushort
 öèêëå do...while ïðîâåðÿåìîå óñëîâèå íàõîäèòñÿ â êîíöå è ïðîâåðÿåòñÿ ïîñ-
Рис. 1.3. Классификация типов данных в языке C# ëå âûïîëíåíèÿ áëîêà ïðåäëîæåíèé. Åñëè îíî èñòèííî, òî áëîê ïðåäëîæåíèé
âûïîëíÿåòñÿ åùå ðàç, â ïðîòèâíîì ñëó÷àå ïðîèñõîäèò âûõîä èç öèêëà. Öèêë
do...while ïîõîæ íà öèêë while ñ îäíèì îòëè÷èåì: áëîê ïðåäëîæåíèé áóäåò âû-
ïîëíåí õîòÿ áû îäèí ðàç. Öèêëû ýòîãî âèäà âñòðå÷àþòñÿ ðåæå, ÷åì for è while.
Поток управления Ñëåäóåò îòìåòèòü, ÷òî â áîëüøèíñòâå ñëó÷àåâ âñå òðè öèêëè÷åñêèõ êîíñò-
 ÿçûêå C# äëÿ óïðàâëåíèÿ ïîòîêîì âûïîëíåíèÿ ïðîãðàììû ïðèìåíÿþòñÿ ðóêöèè ôóíêöèîíàëüíî ýêâèâàëåíòíû.
öèêëû.  ïðîãðàììàõ ÷àñòî âñòðå÷àþòñÿ ó÷àñòêè, êîòîðûå íàäî ïîâòîðèòü
ëèáî çàðàíåå èçâåñòíîå ÷èñëî ðàç, ëèáî äî òåõ ïîð, ïîêà íå áóäåò âûïîëíå- Пример 1.22. Эквивалентность циклов – выполнение пяти итераций.
íî íåêîòîðîå óñëîâèå. Öèêëû êàê ðàç è ïðåäíàçíà÷åíû äëÿ ðåøåíèÿ ïîäîá- Öèêë for
for( i = 0 ; i < 5 ; i++ ){
íîãî ðîäà çàäà÷. Èìååòñÿ òðè îñíîâíûõ âèäà öèêëîâ: for, while è do...while. áëîê_ïðåäëîæåíèé;
}
Пример 1.19. Цикл «for»
For( íà÷àëüíîå_âûðàæåíèå; ïðîâåðÿåìîå_óñëîâèå; îïåðàöèÿ ){ Öèêë while
[áëîê ïðåäëîæåíèé]; int i = 0;
} while( i < 5 ){
66 Глава 1. Написание безопасных программ Язык C# 67
áëîê_ïðåäëîæåíèé; ìè õàðàêòåðèñòèêàìè. Êëàññ ãðóïïèðóåò äàííûå è ìåòîäû íåêîòîðûõ òèïîâ.
i++;
} Êëàññ ìîæåò ñîäåðæàòü êîíñòðóêòîðû, êîòîðûå îïðåäåëÿþò, êàê ñîçäàåòñÿ
ýêçåìïëÿð êëàññà èëè îáúåêò.  êëàññ âêëþ÷àþòñÿ ìåòîäû, âûïîëíÿþùèå
Öèêë do...while îïåðàöèè íàä ýêçåìïëÿðàìè ýòîãî êëàññà.
int i = 0; Ïðåäïîëîæèì, íàïðèìåð, ÷òî ïðîãðàììèñò ðàáîòàåò íàä ñèìóëÿòîðîì ïî-
do {
áëîê_ïðåäëîæåíèé; ëåòîâ äëÿ êîìïàíèè – ïðîèçâîäèòåëÿ ñàìîëåòîâ. Ðåçóëüòàòû ýòîé ðàáîòû ïî-
i++; ìîãóò êîìïàíèè ïðèíÿòü âàæíûå ïðîåêòíûå ðåøåíèÿ. Â òàêîé ñèòóàöèè
} while( i < 5 )
îáúåêòíî-îðèåíòèðîâàííîå ïðîãðàììèðîâàíèå – èäåàëüíûé èíñòðóìåíò.
Ìîæíî ñîçäàòü êëàññ plane, èíêàïñóëèðóþùèé âñå õàðàêòåðèñòèêè ñàìîëåòà
 êàæäîì èç ýòèõ ïðèìåðîâ áëîê_ïðåäëîæåíèé âûïîëíÿåòñÿ ïÿòü ðàç.
è ìåòîäû äëÿ ìîäåëèðîâàíèÿ åãî ïåðåìåùåíèé. Ìîæíî òàêæå ñîçäàòü íå-
Êîíñòðóêöèè ðàçíûå, íî ðåçóëüòàò îäèí è òîò æå. Ïîýòîìó ìû è ãîâîðèì,
ñêîëüêî îáúåêòîâ êëàññà plane, êàæäûé èç êîòîðûõ áóäåò ñîäåðæàòü ñâîè ñîá-
÷òî âñå âèäû öèêëîâ ôóíêöèîíàëüíî ýêâèâàëåíòíû.
ñòâåííûå äàííûå.
Êëàññ ìîæåò ñîäåðæàòü íåñêîëüêî ïåðåìåííûõ, ê ïðèìåðó:
Методы  Weight (âåñ);
Ìîæíî ñêàçàòü, ÷òî ìåòîä (â äðóãèõ ÿçûêàõ åãî àíàëîãîì ñëóæèò ôóíêöèÿ) –  Speed (ñêîðîñòü);
ýòî ìèíèàòþðíàÿ ïðîãðàììà. Èíîãäà ïðîãðàììèñòó íóæíî ïîëó÷èòü íà âõî-  Maneuverabil ity (ìàíåâðåííîñòü);
äå îïðåäåëåííûå äàííûå, ïðîèçâåñòè íàä íèìè íåêîòîðóþ îïåðàöèþ è âåð-  Position (ïîëîæåíèå).
íóòü ðåçóëüòàò â òðåáóåìîì ôîðìàòå. Ïîíÿòèå ìåòîäà è áûëî ïðèäóìàíî äëÿ
Ñ åãî ïîìîùüþ ïðîãðàììèñò ìîæåò ñìîäåëèðîâàòü ïîëåò ñàìîëåòà ïðè çà-
òàêèõ ïîâòîðÿþùèõñÿ îïåðàöèé. Ìåòîä – ýòî àâòîíîìíàÿ ÷àñòü ïðîãðàììû,
äàííûõ óñëîâèÿõ. Äëÿ ìîäèôèêàöèè õàðàêòåðèñòèê îáúåêòà ìîæíî íàïèñàòü
êîòîðóþ ìîæíî âûçâàòü äëÿ âûïîëíåíèÿ îïåðàöèè íàä äàííûìè. Ìåòîä