Lekcja VIII - "Techniki anty-debug i anty-disassembler" a) techniki anty-debug i metody ochrony przed nimi - meltice - int 68 - klucze w rejestrze i autoexecu - tablice IDT i wektory przerywan - ochrona przed tracowaniem - ochrona przed pulapkami - magiczne wartosci - wyjatki b) ochrona przed disassemblerowaniem - zmiana fizyczne w pliku - dummy opcodes - rozne makra - glupie zrodla Let's begin: ----==== a) techniki anty-debug i metody ochrony przed nimi ====---- Heh.... jak sie pewnie domyslacie programisci nie siedzieli z zalozonymi rekami i wymslili wiele roznych mniej, lub bardziej zaawansowanych technik anty-debug. Warto by bylo sie wiec z nimi zapoznac i nauczyc sie chronic przed nimi. Dla bardziej leniwych istnieje wiele programow, ktore beda chronic SI przed wykryciem. Do najpopularniejszych nalezy FrogIce. W najnowyszych wersjach zabezpiecza on SI bardzo skutecznie (nawet przed modyfikacjami tablic IDT,GDT). Oczywiscie nie musicie sie ograniczac to jednego programu, istnieje chocby rodzimy program autorstwa massh^cookiecrk. Poszukajcie, a znajdziecie wszystko czego szukacie ;-) ----==== meltice ====---- Wstep: Najprostsza metoda, stara prawie tak jak swiat. SoftIce uzywa paru vxd'kow ktore moga byc latwo wykryte ;-) Vxd'ki te to: //./SICE, //./NTICE, //./SIWVID. Sposob dzialania: jesli softice bedzie aktywny, to proby utworzenia pliku o nazwie jednego z vxd'kow dadza dadza rezultat negatywny ;-) Wystarczy wywolac funkcje CreateFileA z np. //./SICE. Jesli eax=-1 to mamy debugger Sposob zapobiegania: najprosciej hurtem podmienic nazwy wszystkich vxd'kow w pliku winice.exe (ale zmieniamy tylko czesc po //./ !), niestety po takiej zmianie loader softice, bedzie caly czas myslal, ze nie ma SI ;-( Najprosciej w Si wpisac komende ' bpx createfilea do "d esp->4; p ret" '. I kiedy w oknie danych zobaczymy ktoras z nazw, poprostu wciskamy F11, a nastepnie zmieniamy wartosc rejestru EAX (np. na 1). Mozesz takze uzyc makr: macro NOSICE ="d @(esp+4);e @(esp+4) 0;x;" bpx CreateFileA if *(esp->4+4)=='SICE' || *(esp->4+4)=='SIWV' do "nosice" ----==== int 68 ====---- Wstep: Softice z przyczyn technicznych podpina sie pod niektore przerywania. Przerywanie o numerze 68 jest jednym z nich ;-) of course gdy juz sie podepnie to daje oznaki swojego istnienia, i tu jest caly myk ;-) Sposob dzialania: wystarczy wywolac przerywanie 68 (komenda 'int 68'), z rejestrem ah=43h, gdy w wyniku komendy w EAX bedzie rowne F386 to znak, ze debuger jest podpiety ;-) Sposob zapobiegania: w SI zakladamy pulapke 'bpx Exec_int if ax==386', zmienic tylko jeden skok, albo wartosc eax ;-) mozna takze zmodyfikowac plik winice.exe, ale o tym poczytajcie w pliku dolaczonym do lekcji ;-) ----==== klucze w rejestrze i autoexecu ====---- Wstep: jak sie pewnie domyslasz SI przy instalacji tworzy pare wpisow w rejestrze, a takze wpis w autoexec, do automatycznego uruchamiania SI ;-) Sposob dzialania: tworzy wpis w rejestrze HKEY_LOCAL_MACHINE\Software\Numega/ i w pliku autoexec.bat wpis ze sciazka do pliku winice.exe ;-) wystarczy po prostu sprawdzic czy ten klucz istnieje, oraz czy w autoexecu jest jakis ciag znakow a'la 'SoftIce', 'Numega' albo 'winice.exe' ;-) Sposob zapobiegania: zmiana katalogu instalacyjnego SI, oraz nazwy winice.exe. W rejestrze nalezy klucz po prostu usunac (co wiaze sie jednak z malymi konsekwencjami). ----==== tablice IDT i wektory przerywan ====---- Wstep: system windows posiada w sobie takie cosik jak tablice, jedna z nich jest tablica IDT, zawiera ona szcegolowe informacje o wektorach przerywan. Of course SI musi dokonac w niej odpowiednich zmian ;-) Sposob dzialania: azeby sprawdzic tablice IDT wystarczy przejsc do trybu ring 0 (co w win9x nie jest zbyt duzym problem ;-)) a nastepnie pobrac tablice paroma komendami i tylko dokonac malych porownan ;-) Sposob zapobiegania: trudno zablokowac tablice IDT przed zapisem, najlepiej obczaic moment gdy program przechodzi do ring0, albo gdy porownuje dane i spatchowac ten moment ;-) ----==== ochrona przed tracowaniem ====---- Wstep: Sposob dzialania: Sposob zapobiegania: ----==== ochrona przed pulapkami ====---- TEKST TEN POCHODZI Z ARCHIWUM LISTY CPL-FORUM, NAPISANY ZOSTAL PRZEZ CBOL! istota tego wykrywania jest b. prosta - jesli SICE ustawi BPX w getwindowtexta to oznacza ,ze w pierwszej komorce tej funkcji w pamieci wpisze kod BPX czyli bajt = "CC" zatem wykrycie polega na odczytaniu tej komorki i sprawdzeniu czy jest to "CC" czy co innego teraz jak to jest w praktyce: --------------------------------- w win32 wywolywanie funkcji z dll odbywa sie dosc orginalnie gdy program wola GetDlgItemTextA to jest tworzona pseudo funkcja zlozona z 6-bajtow o tresci : pseudo_funkcja jmp ds:xxxxxxx " oraz dodana specjalna komorka pamieci xxxxxx na adrs funkcji w dll xxxxxxx : prawdziwy_adres_funkcji_wstawiany_podczas_ladowania_do_pamieci czyli by uzyskac prawdziwy adres funkcji GetDlgItemTextA z dll trzeba przejsc przez kolejne adresy tej lagmiglowki -------------------------------- lea edi,GetDlgItemTextA -> to jest adres miejsca w pamieci gdzie jest : jmp ds:GetDlgItemTextA ; - parametry dla getdlgitemtexta - to bedzie potrzebne duzo pozniej push 10 push offset psw push IDD_EDIT1 push [hwnd] ;----- zachowaj ds i ustaw ds=cs push ds push cs pop ds ;----------- mov edi,[edi+2] ;Get DLL function jmp address ; rozkaz jmp xxxx ma 6 bajtow 2 pierwsze omijamy ; cztery pozostale to adres adresu funkcji w pamieci mov edi,[edi] ;Get DLL function real address ; pobieramy do edi prawdziwy adres funkcji mov eax,[edi] ;Get first bytes of DLL function ; pierwsze slowo z kodu funkcji pop ds ; odtwarzamy ds and eax,0FFh ;Save only the first byte cmp eax,0CCh ;It this function BPX'ed? TO JEST ISTOTA SPRAWDZENIA jne NoBPX -------- ; jesli ustawion bpx to komunikat i koniec procesu push L MB_ICONEXCLAMATION push offset siceHeader push offset nosice push 0 mov al,26 call [chooseofs] ;MessageBoxA = 33 push [msg.msWPARAM] mov al,10 call [chooseofs] ;ExitProcess = 34 ---------; jak nie ma bpx to call function , parametry wczesniej sa juz na stosie NoBPX: call edi ; wywolanie GetDlgItemTextA z dll --------------------------------------------------------------- jesli nie zbyt jasno to pytajcie dalej ----==== magiczne wartosci ====---- Wstep: softice posiada pare fajnych magicznych wartosci ;-) nic nie stoji na przeszkodzie, azeby troche sie nimi pobawic... Sposob dzialania: wystarczy tylko wywolac przerywanie, przewaznie 3, albo 1, z odpowiednimi wartosciami rejestrow... debuger jesli jest to zwraca nam fajne wartosci... czytaj w dodatkach ;-) Sposob zapobiegania: poprostu, odnajdz moment i go spatczuj ;-) ----==== wyjatki ====---- Wstep: heh, zarabista metoda ;-) mniej wiecej wyglada to tak, ze program ustawia sobie obsluge wyjatkow, a nastepnie generuje jakis jeden. SI ma taka wlasciwosc, ze gubi kod i pojawi sie dopiero po obsludze wyjatka ;-) Sposob dzialania: najpierw nalezy ustawic tzw. SEH'a, czyli mowiac po polsku cos co obsluguje wyjatki ;-) nastepnie wywoluje sie wyjatek (jak? chocby dzielac przez zero, czy wywolujac 'int 3'). Szczegoly techniczne we wspomnianym 'Anti anti'. Sposob zapobiegania: w chwile przed wywolaniem wyjatka nalezy wykonac komende 'xframe' gdzie bedzie znajdowal sie adres obslugi wyjatkow w programie. Nastepnie albo zakladamy pulapke na ten adres, albo zmieniamy kod na skok pod tamten adres ;-) ----==== b) ochrona przed disassemblerowaniem ====---- Istnieje takze wiele ciekawych sztuczek chroniacych program przed disassemblerem, zobaczmy. ----==== zmiana fizyczne w pliku ====---- Heh... jest pare fajnych kombo, ktore bardzo fajnie moga pomieszac disassembler ;-) Np. - zmiana charakterystyk sekcji na C0000040, program nie bedzie sie disassemblerowal - istnieje metoda na okrycie kodu przed glupimi disassemblerami przez odpowiednie namieszanie wartosci sekcji, tak ze program bedzie w innym zakresie niz by mogl ;-) ----==== dummy opcodes ====---- Co to sa dummy opcodes? Sa to takie smieci w kodzie programu, ktore maja za zadanie zmylic program disassemblujacy tak, azeby generowal jakies smieci zamiast normalnego kodu ;-) Sa to najczesciej wstawki paro bajtowe. Dodatkowo utrudniaja one sledzenie programu pod debugerem, wiec sa to bardzo pozyteczne zwierzatka. Odpowiednie ich kombinacje, moga zrobic naprawde fajny burdel ;-) O dummy opcodach najlepiej poczytaj w tekscie 'Anti anti' by bart, ktory znajduje sie w drugiej czesci badidea, oraz w bartpaku#6. ----==== rozne makra ====---- Innym sposobem anty-w32dasm jest utrudnianie deasemblacji. Mozna to zrobic w nastepujacy sposob: ;... jmp dalej db 23h dalej: ;... najlepiej umieszczac ten fragment przed instrukcjami jedno lub dwubajtowymi... aby zobaczyc jak dziala napisz proga uzywajacego tego snippetu i zdeasembluj go. Mozna pokombinowac z wartoscia po db aby uzyskac lepsze wyniki -;). Aby ulatwic stosowanie snippetu mozna zapisac go jako makro _fuck_dasm macro LOCAL f jmp f db 23h f: endm i w programie zamiast wpisywac caly snippet wystarczy wpisac ;... _fuck_dasm ;... ----==== glupie zrodla ====---- ; w sekcji .data nalezy zadeklarowac nastepujaca zmienna ; szW32Dasm db "URSoft W32Dasm Ver 8.9...
afikomp