Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
Ôîñòåð
ïðè ó÷àñòèè Ìàéêà Ïðàéñà
Техника взлома:
сокеты, эксплойты, 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
Àíàëèç ............................................................................................................. 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
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!код
íèå), 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
Прочие соавторы, редакторы ðîâàíèå ñèñòåìû íà âîçìîæíîñòü âòîðæåíèÿ äëÿ íåñêîëüêèõ êîìïàíèè èç
ñïèñêà 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.
Характеристики языка âîçìîæíîñòÿìè. Îñîáåííî õîðîøî ÿçûê 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
Ñ typedef
int weight( void ){
Ñòðóêòóðà person ïîçâîëÿåò ïðîãðàììèñòó ëîãè÷åñêè ñãðóïïèðîâàòü èí-
typedef int weight; /* âåñ â ôóíòàõ */ ôîðìàöèþ î ôèçè÷åñêîì ëèöå, à çàòåì ëåãêî ïîëó÷èòü ê íåé äîñòóï. Òàê, äëÿ
weight johnweight = 150; ñëîæåíèÿ âåñà Äæîíà è Òîìà íàäî íàïèñàòü:
return johnweight;
} int combinedweight = John.w + Tom.w;
Пример 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 )
}
íèìè íåêîòîðóþ îïåðàöèþ è âåðíóòü ðåçóëüòàò â òðåáóåìîì ôîðìàòå. Ïîíÿ- 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
ïðÿìîóãîëüíèêîâ. Âçãëÿíóâ íà ôîðìóëû äëÿ êîýôôèöèåíòîâ ðÿäà Ôóðüå, ëåã- Характеристики языка
êî ïîíÿòü, ÷òî ïðîãðàììà âû÷èñëÿåò èõ îöåíêè äëÿ ïîñëåäóþùåãî ïîëó÷å-
íèÿ çíà÷åíèÿ ôóíêöèè 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 ðàçìåð è ôîðìàò âñåõ òèïîâ äàííûõ ñïå- Ñðåäè âñåõ öèêëîâ for èñïîëüçóåòñÿ ÷àùå âñåãî.  íà÷àëå âûïîëíåíèÿ öèêëà
öèôèöèðîâàíû â ñàìîì ÿçûêå. Ïðîãðàììèñòàì íå íàäî äóìàòü î ñèñòåìíûõ ïðîãðàììà âû÷èñëÿåò íà÷àëüíîå âûðàæåíèå è ïðîâåðÿåò ñëåäóþùåå çà íèì
îñîáåííîñòÿõ. óñëîâèå. Åñëè óñëîâèå èñòèííî, âûïîëíÿåòñÿ òåëî öèêëà («áëîê ïðåäëîæå-
 Java èìåþòñÿ òàêæå ññûëî÷íûå òèïû. Ïåðåìåííûå òàêîãî òèïà íå ñîäåð- íèé»).  êîíöå öèêëà ïðîèçâîäèòñÿ îïåðàöèÿ, óêàçàííàÿ òðåòüåé â çàãîëîâêå,
æàò çíà÷åíèÿ, à óêàçûâàþò íà êàêîé-òî àäðåñ â ïàìÿòè. Ìàññèâû, îáúåêòû è ïîñëå ÷åãî ñíîâà ïðîâåðÿåòñÿ óñëîâèå. Öèêë ïðîäîëæàåòñÿ, ïîêà óñëîâèå íå
èíòåðôåéñû – âñå ýòî äàííûå ññûëî÷íûõ òèïîâ. Íà ðèñ 1.2 ïðèâåäåíà êëàñ- ñòàíåò ëîæíûì.
ñèôèêàöèÿ òèïîâ â ÿçûêå Java. Îñîáåííî õîðîøî öèêë for ïîäõîäèò äëÿ âûïîëíåíèÿ èòåðàöèé. Åñëè íóæ-
íî âûïîëíèòü áëîê ïðåäëîæåíèé ïÿòü ðàç, òî ìîæíî íàïèñàòü òàêîé ïðî-
object ñòîé öèêë:
÷åí ïîòåíöèàëüíî îïàñíûé êîä.  ñòðîêå 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
ные типы
êå, ïîñëå ÷åãî ñíîâà ïðîâåðÿåòñÿ óñëîâèå. Öèêë ïðîäîëæàåòñÿ, ïîêà óñëîâèå
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 (ïîëîæåíèå).
íóòü ðåçóëüòàò â òðåáóåìîì ôîðìàòå. Ïîíÿòèå ìåòîäà è áûëî ïðèäóìàíî äëÿ
Ñ åãî ïîìîùüþ ïðîãðàììèñò ìîæåò ñìîäåëèðîâàòü ïîëåò ñàìîëåòà ïðè çà-
òàêèõ ïîâòîðÿþùèõñÿ îïåðàöèé. Ìåòîä – ýòî àâòîíîìíàÿ ÷àñòü ïðîãðàììû,
äàííûõ óñëîâèÿõ. Äëÿ ìîäèôèêàöèè õàðàêòåðèñòèê îáúåêòà ìîæíî íàïèñàòü
êîòîðóþ ìîæíî âûçâàòü äëÿ âûïîëíåíèÿ îïåðàöèè íàä äàííûìè. Ìåòîä