Bezpieczne programowanie. Aplikacje hakeroodporne

download Bezpieczne programowanie. Aplikacje hakeroodporne

of 16

Transcript of Bezpieczne programowanie. Aplikacje hakeroodporne

  • 8/6/2019 Bezpieczne programowanie. Aplikacje hakeroodporne

    1/16

    Bezpieczne programowanie.Aplikacje hakeroodporne

    Autor: Jacek Ross

    ISBN: 978-83-246-2405-8

    Format: 158235, stron: 312

    Wyobra sobie sytuacj, w ktrej powicasz mnstwo czasu na stworzenie nowego,

    ciekawego rozwizania w wiecie informatyki. Kosztuje Ci to wiele dni i nocy ogromnego

    wysiku. Dokadnie w momencie opuszczenia Twojego bezpiecznego komputera,

    udostpniony wiatu, Twj pomys zostaje wystawiony na cik prb w sieci

    dziaaj krakerzy, ktrzy za wszelk cen bd prbowali zama Twoje zabezpieczenia

    lub wykorzysta luki w Twojej aplikacji. Jak tego unikn? Jak tworzy oprogramowanie

    odporne na ich ataki?

    Proste i przejrzyste odpowiedzi na podobnie skomplikowane pytania znajdziesz wanie

    w tej ksice! Podczas lektury poznasz zagroenia, na jakie naraony jest programista,oraz proste sposoby utrudniania krakerom zadania. Dodatkowo zdobdziesz wiedz na

    temat metod szyfrowania danych i wyznaczania sygnatur. Jednak, co najwaniejsze,

    zobaczysz, jak wykorzysta t wiedz w praktyce! W publikacji Bezpieczne programowanie.

    Aplikacje hakeroodporne znajdziesz rwnie sporo ciekawych informacji na temat

    zabezpieczania aplikacji sieciowych oraz zaawansowane metody, gwarantujce

    podniesienie bezpieczestwa Twojego produktu do wysokiego poziomu. To jeszcze

    nie wszystko! W kolejnych rozdziaach autor prezentuje sposoby ochrony przed

    debugerami, patenty na bezpieczne tworzenie kodu na platformie .NET oraz

    psychologiczne aspekty tworzenia hakeroodpornych aplikacji!

    Przegld zagroe, rodzaje oszustw i narusze bezpieczestwa Zabezpieczenie programu przy uyciu numeru seryjnego

    Dostpne na rynku systemy zabezpieczania aplikacji

    Algorytmy szyfrujce

    Tworzenie skrtw wiadomoci

    Wykorzystanie szyfrowania przy zabezpieczaniu oprogramowania

    Zabezpieczenia aplikacji wykorzystujcych PHP i .NET

    Ochrona przed atakami typu: wstrzykiwanie SQL, XSS, DOS i DDOS

    Uywanie zaawansowanych metod ochrony oprogramowania

    Sposoby zaciemniania programu

    Ochrona kodu przed debugerami

    Zastosowanie kluczy sprztowych i technik biometrycznych Psychologiczne aspekty ochrony oprogramowania

    Dowiedz si, jak tworzy aplikacje odporne na ataki!

    http://helion.pl/ksiazki/beprog.htmmailto:[email protected]://helion.pl/online.htmhttp://helion.pl/cennik.htmhttp://helion.pl/emaile.cgihttp://helion.pl/zakupy/add.cgi?id=beproghttp://helion.pl/katalog.htmhttp://helion.pl/zamow_katalog.htmhttp://helion.pl/
  • 8/6/2019 Bezpieczne programowanie. Aplikacje hakeroodporne

    2/16

    Spis treci

    Wstp .............................................................................................. 9

    Rozdzia 1. Zagroenia czyhajce na programistw ........................................... 111.1. Dawno, dawno temu w wiecie gier ...........................................................................111.2. Moje przygody z gr Metal Knights ........................................................................ 141.3. Niebezpieczny edytor map, czyli sabe punkty ........................................................ 161.4. A jak to robi w Diablo... czyli co o bezpieczestwie aplikacji sieciowych .......... 191.5. Rodzaje oszustw i narusze bezpieczestwa ........................................................... 21

    1.5.1. Nieuprawnione uycie bd kopiowanie programu ........................................ 211.5.2. Nielegalna podmiana autorstwa kodu ............................................................. 23

    1.5.3. Nieuprawniona modyfikacja kodu ..................................................................231.6. Pirat, Robin Hood, kraker? ......................................................................................241.7. Czy ja take mam myle o zabezpieczeniach? .......................................................251.8. Czym si rni kraker od zodzieja samochodw? .................................................. 27Zadania do samodzielnego wykonania ........................................................................... 30Pytania kontrolne ............................................................................................................ 31

    Rozdzia 2. Proste metody zabezpieczenia programw ......................................... 332.1. Wstp ....................................................................................................................... 332.2. Numer seryjny .........................................................................................................332.3. CrackMe przykady saboci prostych zabezpiecze

    przed nieuprawnionym uytkowaniem programu .................................................352.3.1. CrackMe1 .......................................................................................................352.3.2. CrackMe2 .......................................................................................................42

    2.4. Gotowe systemy zabezpieczania aplikacji przed nieuprawnionym uyciem ........... 44Przegld systemw zabezpieczajcych dostpnych na rynku ................................... 47

    2.5. Zakoczenie ............................................................................................................. 50Zadania do samodzielnego wykonania ........................................................................... 51Pytania kontrolne ............................................................................................................ 51

    Rozdzia 3. Teoria szyfrowania. Algorytmy szyfrujce w praktyce ....................... 533.1. Wstp ....................................................................................................................... 53

    3.2. Szyfrowanie i kodowanie informacji ....................................................................... 533.3. Historyczne algorytmy szyfrowania i kodowania .................................................... 543.3.1. Pocztki ..........................................................................................................543.3.2. Szyfry przestawieniowe i podstawieniowe, szyfr Cezara ............................... 553.3.3. Szyfry polialfabetyczne ..................................................................................553.3.4. Zasada Kerckhoffsa ........................................................................................ 56

  • 8/6/2019 Bezpieczne programowanie. Aplikacje hakeroodporne

    3/16

    4 Bezpieczne programowanie. Aplikacje hakeroodporne

    3.4. Wspczesne algorytmy szyfrowania ................................................................... 563.4.1. Rozwj algorytmw szyfrowania ................................................................... 563.4.2. Algorytmy symetryczne. Algorytm RC4 ........................................................ 573.4.3. Szyfrowanie symetryczne, algorytm DES ...................................................... 613.4.4. Szyfrowanie symetryczne, algorytm AES ...................................................... 61

    3.4.5. Szyfrowanie asymetryczne, algorytm RSA ....................................................613.4.6. Podpis cyfrowy ............................................................................................... 633.4.7. Szyfr z kluczem jednorazowym ...................................................................... 63

    3.5. Algorytmy wyznaczajce sygnatury (skrty) danych ..............................................643.5.1. Algorytm wyznaczania CRC ..........................................................................643.5.2. Algorytm MD5 ............................................................................................... 653.5.3. Algorytm SHA-1 ............................................................................................ 65

    3.6. Generatory liczb pseudolosowych ...........................................................................693.7. Do czego moe suy szyfrowanie w zabezpieczaniu programw? ....................... 70Zadania do samodzielnego wykonania ........................................................................... 71Pytania kontrolne ............................................................................................................ 71

    Rozdzia 4. Zabezpieczanie programw sieciowych na przykadzie jzyka PHP ... 734.1. Wstp ....................................................................................................................... 734.2. Obsuga danych z zewntrz ..................................................................................... 744.3. Przekazywanie danych midzy skryptami ............................................................... 754.4. Uwierzytelnianie w PHP .......................................................................................... 764.5. Niebezpieczne konstrukcje jzyka ........................................................................... 79

    4.5.1. Konstrukcja include ($plik) ............................................................................ 804.5.2. eval($code), konstrukcja $$ ............................................................................ 814.5.3. fopen($url) ...................................................................................................... 82

    4.6. Bezpieczna obsuga bdw ..................................................................................... 83

    4.7. Bezpieczestwo systemu plikw .............................................................................844.8. Cross site scripting ................................................................................................... 854.9. Wstrzykiwanie kodu SQL ........................................................................................ 86

    4.9.1. Wstrzykiwanie kodu SQL przykad 1. ....................................................... 874.9.2. Wstrzykiwanie kodu SQL przykad 2. ....................................................... 904.9.3. Uycie PDO .................................................................................................... 914.9.4. Ataki wielofazowe ..........................................................................................924.9.5. Sposoby ochrony ............................................................................................92

    4.10. Wstrzykiwanie polece systemowych (shell injection) .........................................934.11. Wstrzykiwanie zawartoci e-mail (e-mail injection) ..............................................944.12. Cross site request forgery ...................................................................................... 954.13. Przejcie kontroli nad sesj (session fixation) ....................................................... 974.14. Session poisoning ................................................................................................ 101

    4.14.1. Przechowywanie stanu aplikacji w niezabezpieczonych miejscach ........... 1014.14.2. Przypisanie wartoci do zmiennej sesyjnej

    o nazwie stworzonej na podstawie danych od uytkownika ................... 1044.14.3. Podmiana sekwencji wywoa przez wamywacza. Problem wycigu ....... 1054.14.4. Uywanie tych samych zmiennych sesyjnych do rnych celw ............... 1064.14.5. Zmienne sesyjne nie s gwarancj bezpieczestwa .................................... 108

    4.15. Ataki typu DOS i DDOS ..................................................................................... 1104.16. Dyrektywa register_globals ................................................................................. 112

    4.17. Narzdzie zaciemniajce kod rdowy jzyka PHP ........................................... 114Zakoczenie .................................................................................................................. 116Zadania do samodzielnego wykonania ......................................................................... 116Pytania kontrolne .......................................................................................................... 116

  • 8/6/2019 Bezpieczne programowanie. Aplikacje hakeroodporne

    4/16

    Spis treci 5

    Rozdzia 5. Zaawansowane metody zabezpieczania programw ....................... 1215.1. Wstp ..................................................................................................................... 1215.2. Klucze rejestracyjne przypisane do uytkownika .................................................. 122

    5.2.1. Idea kluczy rejestracyjnych przypisanych do uytkownika .......................... 1225.2.2. Typowe techniki ........................................................................................... 124

    5.2.3. Tworzenie kluczy rejestracyjnych w aplikacjach sieciowych ....................... 1255.3. Samotestujcy si program .................................................................................... 126

    5.3.1. Testowanie integralnoci programu gwarancj jego oryginalnoci .............. 1265.3.2. Przykad weryfikacja integralnoci pliku wykonywalnego ..................... 1275.3.3. Przykad weryfikacja integralnoci kodu programu ................................ 132

    5.4. Sprawdzanie integralnoci danych ......................................................................... 1355.4.1. Ukryj moje dane ........................................................................................... 1365.4.2. Testowanie integralnoci danych ulegajcych zmianom .............................. 1375.4.3. Wersje czasowe oprogramowania kopoty z shareware ........................... 1385.4.4. Bezpieczne przechowywanie danych przykad ........................................ 140

    5.5. Samomodyfikujcy si program ............................................................................ 1445.5.1. Samomodyfikujcy si program.

    Brzydka sztuczka czy eleganckie zabezpieczenie? ................................. 1445.5.2. Sabota, czyli jak ukara krakera? ................................................................ 1465.5.3. Za 5 sekund ten program ulegnie samozniszczeniu

    automatyczna deinstalacja programu .................................................1475.5.4. Kod o ograniczonej przydatnoci do wykonania ............................................ 148

    5.6. Klucz programowy ................................................................................................ 1505.6.1. Klucz programowy przykad ................................................................... 1515.6.2. Deszyfrowanie fragmentw programu w trakcie jego dziaania ................... 1565.6.3. Przykad programu deszyfrujcego si w trakcie dziaania .......................... 158

    5.7. Zaciemnianie kodu i danych programu .................................................................. 1615.7.1. Czy to wci open source? Zaciemnianie kodu jako metoda obronna .......... 1615.8. Zabezpieczenia. Jak to w praktyce wprowadzi w ycie .................................... 163

    5.8.1. Zabezpieczenia a etapy produkcji .................................................................1635.8.2. Generator zabezpiecze ................................................................................ 164

    Zadania do samodzielnego wykonania ......................................................................... 165Pytania kontrolne .......................................................................................................... 166

    Rozdzia 6. Zabezpieczenie programw przed debugerami ............................... 1676.1. Wstp ..................................................................................................................... 1676.2. Wykrywanie debugerw ........................................................................................ 1686.3. Utrudnianie debugowania ...................................................................................... 169

    6.3.1. Wstawki kodu utrudniajce debugowanie ....................................................1696.3.2. Generator wstawek kodu utrudniajcych debugowanie ................................ 172

    Zadania do samodzielnego wykonania ......................................................................... 175Pytania kontrolne .......................................................................................................... 175

    Rozdzia 7. Wykorzystanie internetu do zabezpieczania programw .................. 1777.1. Wstp ..................................................................................................................... 1777.2. Rejestracja programu przez internet ...................................................................... 1787.3. Aktywacja numeru seryjnego przez internet .......................................................... 1797.4. Kontrola uytkowania aplikacji z czciowym dostpem do internetu .................. 1807.5. Weryfikacja prawidowej pracy aplikacji przez sie .............................................. 1817.6. Przechowywanie poufnych danych uytkownika .................................................. 1827.7. Deszyfrowanie programu w trakcie dziaania a internet ........................................ 1837.8. Fragmentaryczne dane pobierane z internetu ......................................................... 1857.9. Przesyanie informacji o programie do centralnego serwera .................................... 186

  • 8/6/2019 Bezpieczne programowanie. Aplikacje hakeroodporne

    5/16

    6 Bezpieczne programowanie. Aplikacje hakeroodporne

    7.9.1. Totalna inwigilacja? Rejestrowanie informacjio zachowaniu programu i uytkownika .....................................................186

    7.9.2. Zdalne sprawdzanie tosamoci uytkownika .............................................. 1887.9.3. Zdalne i lokalne blokowanie dziaania programu

    sterowanego danymi z centralnego serwera ............................................... 191

    7.10. Wirtualne wybory ................................................................................................ 192Zadania do samodzielnego wykonania ......................................................................... 196Pytania kontrolne .......................................................................................................... 196

    Rozdzia 8. Zabezpieczanie programw przy uyciu kluczy sprztowychoraz technik biometrycznych ......................................................... 1978.1. Wstp ..................................................................................................................... 1978.2. Zabezpieczenie aplikacji za pomoc kluczy sprztowych ..................................... 198

    8.2.1. Karty magnetyczne i elektroniczne .............................................................. 1988.2.2. Podpis cyfrowy na trwaym noniku ............................................................ 1998.2.3. Klucze sprztowe w zabezpieczaniu oprogramowania ................................. 200

    8.3. Technologie GPS i RFID, geolokalizacja ..............................................................2018.3.1. Technologie GPS i RFID ..............................................................................2018.3.2. Problemy etyczne i moralne postpu technicznego

    zwizanego z lokalizacj i kontrol uytkownikw ................................... 2028.4. Weryfikacja tosamoci za pomoc technik biometrycznych ................................... 203

    8.4.1. Techniki biometryczne ................................................................................. 2038.4.2. Indywidualne oprogramowanie .................................................................... 204

    8.5. Szpiegostwo elektroniczne .................................................................................... 2048.5.1. Wamania do sieci bezprzewodowych .......................................................... 2048.5.2. Przechwytywanie fal elektromagnetycznych ................................................ 205

    Pytania kontrolne .......................................................................................................... 206

    Rozdzia 9. Tworzenie bezpiecznych aplikacji w rodowisku .NET ..................... 2079.1. Wstp ..................................................................................................................... 2079.2. Autoryzacja oparta na uprawnieniach i rolach (Role-Based Authorization) .......... 208

    9.2.1. Uprawnienia, interfejs IPermission, klasa Principal ..................................... 2099.2.2. Autoryzacja nakazowa oparta na rolach (Imperative Role-Based Security) ........ 2109.2.3. Autoryzacja deklaracyjna oparta na rolach (Declarative Role-Based

    Security) ............................................................................................................... 2139.3. Zabezpieczenie dostpu kodu do zasobw (Code Access Security) ......................... 215

    9.3.1. Nakazowe zabezpieczenie dostpu kodu do zasobw(Imperative Code Access Security) ............................................................... 215

    9.3.2. Deklaracyjne zabezpieczenie dostpu kodu do zasobw(Declarative Code Access Security) .............................................................. 219

    9.3.3. Poziomy regu bezpieczestwa (Security Policy Level) ............................... 2209.3.4. Narzdzie The Code Access Security Policy Utility caspol.exe .............. 221

    9.4. Bezpieczestwo ASP.NET .................................................................................... 2229.4.1. Metody uwierzytelniania w ASP.NET ......................................................... 2229.4.2. Dostp anonimowy ....................................................................................... 2239.4.3. Uwierzytelnianie systemu Windows ............................................................ 2239.4.4. Uwierzytelnianie przy uyciu formularza ..................................................... 2269.4.5. Uwierzytelnianie za pomoc .NET Passport ................................................2289.4.6. Bezpieczna komunikacja za pomoc SSL .................................................... 228

    9.5. Tworzenie silnych nazw podzespoom .................................................................. 230Zadania do samodzielnego wykonania ......................................................................... 231Pytania kontrolne .......................................................................................................... 232

  • 8/6/2019 Bezpieczne programowanie. Aplikacje hakeroodporne

    6/16

    Spis treci 7

    Rozdzia 10. Bezpieczny Program ..................................................................... 23510.1. Wstp ................................................................................................................... 23510.2. Opis programu ..................................................................................................... 23610.3. Przegld kodu rdowego ................................................................................... 238

    10.3.1. BezpiecznyProgram.exe ............................................................................. 238

    10.3.2. ZabezpieczBP.exe ...................................................................................... 24510.3.3. StwrzKluczBP.exe .................................................................................... 246

    10.4. Wnioski ............................................................................................................... 247Zadania do samodzielnego wykonania ......................................................................... 249

    Rozdzia 11. Psychologiczna strona bezpieczestwa ......................................... 25111.1. Wstp ................................................................................................................... 25111.2. Wpyw architektury programu na jego bezpieczestwo ...................................... 25111.3. Tylne wejcia i kod tymczasowy ......................................................................... 25311.4. Uycie gotowego kodu ........................................................................................ 25411.5. Open source ......................................................................................................... 256

    11.6. Taczce winki kontra bezpieczestwo .............................................................25711.7. Security by obscurity zabezpieczanie przez zaciemnianie .............................. 25811.8. Karanie wamywacza ........................................................................................... 26011.9. Brzytwa Ockhama ............................................................................................... 26111.10. Uycie socjotechniki .......................................................................................... 26111.11. Nie poprawiaj wamywacza ............................................................................... 26211.12. Walka ze script kiddies ......................................................................................26311.13. Ochrona przed automatami ................................................................................26411.14. Ataki z wewntrz ............................................................................................... 26711.15. acuch a sie zabezpiecze ............................................................................. 26711.16. Caociowe spojrzenie na problem bezpieczestwa ...........................................268

    Pytania kontrolne .......................................................................................................... 270

    Podsumowanie ............................................................................. 273

    Odpowiedzi do pyta kontrolnych .................................................. 281

    Sowniczek poj ......................................................................... 293

    Skorowidz .................................................................................... 301

  • 8/6/2019 Bezpieczne programowanie. Aplikacje hakeroodporne

    7/16

    Rozdzia 6.

    Zabezpieczenie programw

    przed debugerami

    6.1. Wstp

    Wykrywanie aktywnych debugerw oraz programw zrzucajcych fragment pamici

    typu ProcDumpto czynno, ktra moe by opacalna, jednak nie jest tak prosta, jaksi wydaje. Istnieje wiele wyrafinowanych sztuczek wykrywajcych te programy, jednakzdecydowana wikszo z nich wykrywa dokadnie okrelone programy, jak na przykadSoftIce czy OllyDbg, i w dodatku czsto tylko okrelone ich wersje. Najgorsz infor-macj jest jednak to, e istnieje mnstwo atek i rozszerze popularnych debugerw,ktre zabezpieczaj si przed wykryciem. Programy te po modyfikacjach (wykona-nych czsto przez samych krakerw dla siebie) ukrywaj si i stosuj techniki mylce.Dlatego wykrywanie debugerw jest zadaniem czsto skazanym na porak. Zwyklejest si p kroku do tyu, a nawet jeli uda nam si poprzez zaimplementowaniewielu technik jednoczenie wykry skutecznie wszystkie istniejce debugery, to i tak

    jest to tylko chwilowe zwycistwo, bo za chwil powstan takie, ktrych nie wykry-jemy. Jest to wic typowe leczenie objaww, a nie przyczyn choroby.

    Nie oznacza to, e nie naley w ogle przejmowa si problemem i nie stosowa adnychzabezpiecze. Jednak jeli Czytelnik nie jest geniuszem assemblera, powinien zostawito zadanie innym i uy do tego celu programu pobranego z internetu. Jest ich wiele,zarwno darmowych, jak i patnych. Do tych drugich nale m.in. opisane w rozdzialedrugim TheMida czy AsProtect. Dziki temu zaoszczdzimy sobie czasu na prby,ktrych wyniki mog by wtpliwe, a co wicej, ktrych rezultat ciko bdzie namzweryfikowa, poniewa nie bdziemy dysponowa odpowiedni iloci wersji debuge-

    rw. Procedury kontrolujce dziaanie takich programw nie musz by niestandar-dowe i dlatego warto pozostawi je fachowcom.

  • 8/6/2019 Bezpieczne programowanie. Aplikacje hakeroodporne

    8/16

    168 Bezpieczne programowanie. Aplikacje hakeroodporne

    Z tych wanie powodw w rozdziale tym nie znajdziecie wielu wyrafinowanych sztuczekblokujcych debugery. Opisz jedynie kilka najprostszych, aby kady mg sobie wy-robi opini na ten temat i w razie potrzeby poszuka bardziej zaawansowanych in-formacji w innych rdach. Zamiast tego skupi si na oglnych metodach utrudniania

    debugowania, ktre mog by uyteczne niezalenie od stosowania funkcji wykry-wajcych debugery lub komercyjnych systemw zabezpiecze, ktre rwnie takowefunkcje posiadaj.

    6.2. Wykrywanie debugerw

    Najprostszym sposobem wykrywania debugerw jest wstawienie do kodu po prostu:

    if(IsDebuggerPresent())// wykonaj jaki kod, np. zamknij program;

    Mona to atwo przetestowa, wpisujc w miejsce komentarza na przykad poleceniewywietlenie jakiego komunikatu i uruchamiajc aplikacj krok po kroku w VisualStudio. Debuger VS zostanie wykryty i program wywietli komunikat. Uruchamiajcprogram z pliku wykonywalnego, nie zobaczymy komunikatu.

    Tego typu zabezpieczenie bdzie jednak cakowicie nieskuteczne w przypadku za-awansowanych debugerw uywanych przez krakerw, takich jak SoftIce czy OllyDbg.

    Wamywacze uywaj zmodyfikowanych wersji tych programw, ktre s zabezpie-czone nie tylko przed opisan powyej weryfikacj, ale take przed wieloma bardziejzaawansowanymi metodami. Twj program musiaby mie naprawd szerok gamtestw, aby mona byo mie pewno wykrycia wikszoci mutacji tych debugerw.Dlatego wanie lepiej jest uy gotowego narzdzia wykonanego przez specjalistw,a samemu skupi si na innych zabezpieczeniach. Jako ciekawostk podam jeszczeprzykady dwch rozwiza tego typu:

    mov ah,43hint 68hcmp eax,0F386h

    jz mamy_debugger

    W tym tecie prbujemy zbada, czy uruchomiony zosta program SoftIce poprzezwykrywanie sterownika debugera systemowego. Kolejny przykad opiera si na wy-krywaniu int 41huywanego przez debugery:

    xor ax,axmov es,axmov bx, cslea dx, int41handlerxchg dx, es:[41h*4]

    xchg bx, es:[41h*4+2]in al, 40hxor cx,cxint 41hxchg dx, es:[41h*4]xchg bx, es:[41h*4+2]

  • 8/6/2019 Bezpieczne programowanie. Aplikacje hakeroodporne

    9/16

    Rozdzia 6. Zabezpieczenie programw przed debugerami 169

    cmp cl,aljnz si_jest

    int41handler PROCmov cl,al

    iretint41handler ENDP

    Obydwa powysze przykady wykrywania debugera SoftIce pochodz ze strony:http://4programmers.net/Assembler/FAQ/Wykrywanie_debuggera_(SoftICE)1.

    6.3. Utrudnianie debugowania

    6.3.1. Wstawki kodu utrudniajce debugowanie

    Utrudnienie debugowania mona wykona, wklejajc w wiele miejsc kodu rdowegoprogramu relatywnie nieskomplikowane wstawki. Jeli uywamy jzyka C/C++, sprawajest prosta, moemy bowiem wykorzysta makra preprocesora, co w poczeniu z twr-czym uyciem instrukcji skoku bezwarunkowego (tak oczerniane przez wszystkichgoto), wstawek assemblerowych czy konstrukcji takich jak setjmpczy longjmp, moesolidnie skomplikowa ledzenie programu w debugerze. Wane jest, aby tego typu

    wstawki pozostaway neutralne dla kodu.

    Oto przykad:

    jmp_buf env;#define AD(kod, numer) if( setjmp(env) == 0 ) \{ \

    goto skok_ad_##numer; \} \else \{ \

    kod; \

    } \goto koniec_ad_##numer; \skok_ad_##numer: \

    longjmp(env, 1); \koniec_ad_##numer: \;

    Powysze makro wstawia kod wygldajcy mniej wicej tak:

    if( setjmp(env) == 0 ){

    goto skok_ad_1;}else

    1

    Tre udostpniona na zasadach licencji Creative Commons Attribution:

    http://creativecommons.org/licenses/by/2.0/pl/legalcode .

  • 8/6/2019 Bezpieczne programowanie. Aplikacje hakeroodporne

    10/16

    170 Bezpieczne programowanie. Aplikacje hakeroodporne

    {// WACIWY FRAGMENT KODU

    }goto koniec_ad_1;skok_ad_1:

    longjmp(env, 1);koniec_ad_1:

    W trakcie wykonania instrukcja setjmp(env) == 0wywoana po raz pierwszy ustawipunkt powrotu dla skoku longjmpna miejsce swojego wywoania oraz zwrci wartoTRUE. W zwizku z tym kolejn wykonywan instrukcj bdzie goto skok_ad_1. Nastpniewykona si longjmp(env,1), ktre spowoduje przesunicie wykonania z powrotem dopierwszej linii kodu. Tym razem jednak warunek nie bdzie ju speniony i wykonanyzostanie cig instrukcji oznaczony jako WACIWY FRAGMENT KODU. Na koniec instrukcjagoto koniec_ad_1zapewni prawidowe opuszczenie tego bloku kodu. Caa konstrukcja

    ma wple w kod kilka dziwnych i zaciemniajcych sens skokw wyduajcychi utrudniajcych ledzenie wykonania w debugerze. Oczywicie powinna by uytaw programie wiele razy, aby by naprawd skuteczn.

    Uycie makra jest nastpujce. Kod, ktry zaciemniamy, otacza si wywoaniem makra:AD(kod, x). Pewn wad tego makra jest to, e trzeba go wywoywa z dodatkowymparametrem, ktry za kadym razem musi by inny. To, co przed zaciemnieniem wy-glda tak:

    for( int i = 0; i < 10; i++)for( int j = 0; j < i; j++)

    if( x[i] < x[j]){

    int tmp = x[i];x[i] = x[j];x[j] = tmp;

    }

    po bdzie wyglda tak:

    AD(for( int i = 0; i < 10; i++)

    for( int j = 0; j < i; j++)

    AD(if( x[i] < x[j]){

    int tmp = x[i];AD(x[i] = x[j] ,2);AD(x[j] = tmp ,3);

    }, 1)

    , 0)

    Inne makra mog korzysta wprost ze wstawek assemblerowych:

    #define WSTAWKA_START_ASM __asm PUSH EAX __asm PUSH EBX __asm PUSH ECX __asm PUSHF

    #define WSTAWKA_STOP_ASM __asm POPF __asm POP ECX __asm POP EBX __asm POP EAX

    #define WSTAWKA_PUSTA_1 WSTAWKA_START_ASM __asm MOV EAX, ECX __asm MOV EAX, 0 __asmADD EAX, 0xD007 _asm MOV EBX, EAX WSTAWKA_STOP_ASM

  • 8/6/2019 Bezpieczne programowanie. Aplikacje hakeroodporne

    11/16

    Rozdzia 6. Zabezpieczenie programw przed debugerami 171

    #define WSTAWKA_PUSTA_2 WSTAWKA_START_ASM MAKE_DUMMY_1 __asm TEST EAX, EAX __asmPUSHF __asm POP EAX __asm MOV EAC, EAX MAKE_STOP_ASM

    #define WSTAWKA_PUSTA_3 WSTAWKA_START_ASM __asm MOV EAX, EBX __asm ADD EAX, 0x01ac__asm PUSH EAX __asm MOV EAX, EBX __asm POP EBX WSTAWKA_STOP_ASM

    Powysze kody nie maj adnego sensu, natomiast nie zmieniaj stanu rejestrw aniflag (dziki uyciu makr WSTAWKA_START_ASMi WSTAWKA_STOP_ASM). Uycie jest proste:wywoanie makra wstawia si po prostu do kodu.

    for( int i = 0; i < 10; i++)for( int j = 0; j < i; j++)

    if( x[i] < x[j]){

    WSTAWKA_PUSTA_3int tmp = x[i];

    WSTAWKA_PUSTA_3 WSTAWKA_PUSTA_2x[i] = x[j];WSTAWKA_PUSTA_3 WSTAWKA_PUSTA_1 WSTAWKA_PUSTA_3x[j] = tmp;

    WSTAWKA_PUSTA_2}

    Prawda, e proste? Polecam obejrzenie kodu assemblerowego wygenerowanego przezkompilator dla kadej z trzech powyszych wersji kodu. Powiciwszy 3 4 godziny,mona wyprodukowa kilkanacie czy nawet kilkadziesit podobnych fragmentwkodu i uy ich w setkach miejsc, wykonujc po prostu prac typu kopiuj/wklej. Nie

    powstrzyma to samo w sobie adnego krakera, ale utrudni mu nieco prac. Oczywi-cie takie wstawki wyduaj kod oraz nieznacznie spowalniaj jego wykonanie. Jelijednak bdziemy uywa ich wycznie w najbardziej krytycznych fragmentach pro-gramu, dotyczcych zabezpiecze, to jest to opacalne. Zwaszcza e przy dzisiej-szych prdkociach procesorw tych kilkadziesit instrukcji maszynowych nie bdzieduym obcieniem.

    Powysze makra s banalne i maj wycznie posuy jako przykad tego, co monarobi. W prawdziwym systemie warto posiedzie nieco duej i doda nastpujceelementy:

    Wstawki assemblerowe z du iloci skokw wymieszanych bez adu, naprzykad:

    WSTAWKA_START_ASM__asm JMP skok_1x;

    skok_1x: __asm TEST EAX,EBX;__asm JMP skok_3x;

    skok_5x:__asm MOV EAX, EBX;__asm JMP skok_4x;

    skok_2x: __asm MOV EAX, ECX;

    __asm JMP skok_5x;skok_4x: __asm POPF;__asm JMP skok_6x;

    skok_3x: __asm MOV EAX, 0;__asm PUSH EAX;__asm MOV EAX, EBX;

  • 8/6/2019 Bezpieczne programowanie. Aplikacje hakeroodporne

    12/16

    172 Bezpieczne programowanie. Aplikacje hakeroodporne

    __asm TEST EAX, EAX;__asm JNZ skok_4x;__asm JMP skok_2x;

    skok_6x: __asm MOV EAX,EBX;WSTAWKA_STOP_ASM

    Uycie nie tylko skokw bezwzgldnych, ale take duej iloci zagniedonychfunkcji oraz skokw warunkowych (jak w powyszym przykadzie skok JNZ).

    Wstawianie instrukcji, ktre nie bd nigdy wykonane, w poblie waciwegokodu. Mona tego dokona poprzez skoki. Ciekaw instrukcj, ktr monaw takie miejsce wstawi, jest __asm int 3, czyli instrukcja przerwaniaprogramowego.

    Mona nawet pokusi si o sterowanie przepywem wykonania za pomocwyjtkw.

    Przez cay czas powinnimy mie jednak na uwadze to, e jest to tylko dodatek, i uwaa,aby nie zaciemni sobie kodu nadmiernie.

    6.3.2. Generator wstawek kodu utrudniajcychdebugowanie

    Makra, o ktrych pisaem powyej, to interesujca technika, ale maj one kilka wad:

    Nie kady jzyk posiada makra preprocesora. Mona jeszcze ratowa si uyciemfunkcji rozwijanych w miejscu wywoania (inline), ale nie zawsze i niewszystko uda si nimi zastpi.

    Makra pisane rcznie s zazwyczaj schematyczne. Ciko je sparametryzowaczy zmienia im dynamicznie tre.

    Nawet najwygodniejsze w uyciu widniej w kodzie rdowym, zmniejszajcjego czytelno oraz utrudniajc testowanie (i debugowanie, ale w kocu po tozostay napisane).

    Lepszym rozwizaniem bdzie wic zostawienie wersji deweloperskiej kodu w stanieczystym i wstawianie kodu antydebugowego przez automat dopiero w procesie pro-dukcji oprogramowania. Dziki uyciu zautomatyzowanych systemw produkcjioprogramowania takich jak na przykad CruiseControl .NET, systemw kontroli wer-sji takich jak CVS czy SVN oraz narzdzi skryptowych takich jak NANT, Python czyRuby proces ten nie powinien by skomplikowany. Wyglda on nastpujco:

    Prace deweloperskie wykonywane s przez programistw. Programista,koczc prace, wysya kod rdowy do repozytorium systemu kontroli wersji.

    Automat pobiera zmodyfikowane rda do swojej lokalnej kopii.

    Prekompilacja wygenerowanie przez automat wstawek antydebugowychi wstawienie ich do kodu.

    Kompilacja zmodyfikowanego kodu.

    Wykonanie testw automatycznych.

  • 8/6/2019 Bezpieczne programowanie. Aplikacje hakeroodporne

    13/16

    Rozdzia 6. Zabezpieczenie programw przed debugerami 173

    Automat taki moe generowa wstawki losowo spord zbioru elementw w miejscaoznaczone w kodzie w specyficzny sposb. Dziki temu jedyne, co musi zrobi pro-gramista, to wstawi takie oznaczenia wszdzie, gdzie chce. Moe to by na przykadspecyficzny komentarz:

    // ZABEZPIECZfor( int i = 0; i < 10; i++)for( int j = 0; j < i; j++)

    if( x[i] < x[j]){// ZABEZPIECZ

    int tmp = x[i];// ZABEZPIECZ

    x[i] = x[j];// ZABEZPIECZ

    x[j] = tmp;

    // ZABEZPIECZ}// ZABEZPIECZ

    Na pycie CD znajduje si kod rdowy programu GenerujZabezpieczenia napisanegow jzyku C#. Jest to program uruchamiany z linii polece, ktrego jedynym parametremjest cieka do pliku rdowego (w jzyku C++), w ktrym wstawki // ZABEZPIECZmaj zosta zmienione na wstawki antydebugowe. Czytelnik moe rozbudowa i zmody-fikowa go wedug wasnych potrzeb. Mona zmieni go w nastpujcy sposb:

    Dodanie wikszej iloci elementw sucych do generowania wstawek.

    Dodanie generacji wstawek dla rnych jzykw programowania.

    Dodanie generacji kilku rodzajw wstawek, w tym parametryzowanych.

    Stworzenie bardziej skomplikowanych wstawek.

    Stworzenie mniej schematycznych wstawek.

    Naley przy tym pamita o tym, e program po prostu wstawia wstawk tam, gdziezobaczy stosowny tekst. Moe wic si zdarzy, e kod rdowy po modyfikacji niebdzie si kompilowa lub w ogle nie bdzie dziaa. Zaley to od sposobu uyciaoznakowania wstawek. Jeli ich tre pojawi si w nietypowym miejscu, na przykadw cigu znakw do wywietlenia na konsoli itp., to dziaanie programu moe zmienisi na nieprawidowe.

    Kod programu jest do prosty. Podstawow funkcj jest ModyfikujPlik, ktra odczytujeplik, wyszukuje frazy // ZABEZPIECZi podmienia je na losowo wygenerowane wstawkiassemblerowe. Generowane s dwa typy wstawek:

    Statyczna od 1 do 9 rozkazw assemblera wylosowanych z tablicystatyczneWstawki.

    Faszywe skoki trzy przeplatajce si fragmenty kodu (wylosowane jak wstawkastatyczna).

  • 8/6/2019 Bezpieczne programowanie. Aplikacje hakeroodporne

    14/16

    174 Bezpieczne programowanie. Aplikacje hakeroodporne

    Oto gwna funkcja:

    static void ModyfikujPlik(string acieka) { // odczyt pliku

    TextReader reader = new StreamReader(acieka, System.Text.Encoding.Default); string zawarto = reader.ReadToEnd(); reader.Close();

    // modyfikacja zawartoci int ile = 0; while (zawarto.IndexOf(oznaczenieWstawki) != -1) { int indeksWstawki = zawarto.IndexOf(oznaczenieWstawki); string wstawka = UtwrzWstawk(); zawarto = zawarto.Substring(0, indeksWstawki) + wstawka +

    zawarto.Substring(indeksWstawki + oznaczenieWstawki.Length); ile++; }

    // zapis pliku TextWriter writer = new StreamWriter(acieka, false, System.Text.Encoding.Default); writer.Write(zawarto); writer.Close();

    Console.WriteLine(acieka + " zosta zmodyfikowany "

    + ile.ToString() + " razy"); }

    Pojedyncz wstawk tworzy funkcja UtwrzWstawk():

    static string UtwrzWstawk() { string cigPodmiany = pocztekWstawki; int ile = rd.Next(1, 3); for (int i = 0; i < ile; i++) { if(rd.Next(0,2) == 0) cigPodmiany += UtwrzSztuczneSkoki(); else cigPodmiany += UtwrzStatycznWstawk(); } return cigPodmiany + koniecWstawki; }

    T funkcj zmodyfikuj, jeli chcesz mie wicej typw wstawek. Po prostu nie losujliczb z zakresu

  • 8/6/2019 Bezpieczne programowanie. Aplikacje hakeroodporne

    15/16

    Rozdzia 6. Zabezpieczenie programw przed debugerami 175

    retWart += statyczneWstawki[rd.Next(0, statyczneWstawki.Length)] + "\r\n";

    } return retWart; }

    static string UtwrzSztuczneSkoki() { string retWart = ""; string etykieta1 = UtwrzEtykiet(); string etykieta2 = UtwrzEtykiet(); string etykieta3 = UtwrzEtykiet(); retWart += "__asm JMP " + etykieta1 + ";\r\n"; retWart += etykieta2 + ":" + UtwrzStatycznWstawk(); retWart += "__asm JMP " + etykieta3 + ";\r\n"; retWart += etykieta1 + ":" + UtwrzStatycznWstawk(); retWart += "__asm JMP " + etykieta2 + ";\r\n"; retWart += etykieta3 + ":" + UtwrzStatycznWstawk(); return retWart; }

    Druga z nich tworzy skoki ukadajce si w cig:

    1.Id do 3

    2.Id do 4

    3.Id do 2

    4.

    Koniec

    Pomidzy nimi znajduj si statyczne wstawki wygenerowane przez UtwrzStatyczn-Wstawk (), ktrej z kolei kod jest tak prosty, e raczej nie trzeba go objania. Wartojeszcze doda, e kada wstawka zaczyna si odoeniem stanu rejestrw i flag nastos, a koczy pobraniem ich stamtd. Dziki temu stan programu nie zmienia si.

    Zadania do samodzielnego wykonania1.Rozwi program GenerujZabezpieczenia zgodnie z sugestiami w treci rozdziau.

    Pytania kontrolne

    P 6.1. Jakie s wady makr antydebugowych

    wstawianych rcznie do kodu?a)S cakowicie nieskuteczne i nie przeszkadzaj krakerom.

    b)W niektrych jzykach programowania ich implementacja moe by trudna.

  • 8/6/2019 Bezpieczne programowanie. Aplikacje hakeroodporne

    16/16

    176 Bezpieczne programowanie. Aplikacje hakeroodporne

    c)Nie jest atwo napisa takie makra nieschematycznie, zwykle s podobne dosiebie.

    d)Znajduj si w kodzie rdowym, co zaciemnia go i utrudnia testowanie.