LEKCJA8.TXT

(10 KB) Pobierz
          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...
Zgłoś jeśli naruszono regulamin