MENU  
  Strona startowa
  Newsletter
  Rejestracja
  LOGOWANIE
  Forum
  Systemy
  WAREZ
  Chomikuj.pl
  Darmowy Hosting
  GRAFIKA
  Baner Flash
  Alfabet HTML
  Asembler Kurs
  PIERWSZY RAZ HTML
  Hakerstwo
  => Lekcja 1
  => Lekcja 2
  => Lekcja 3
  => Lekcja 4
  => Lekcja 5
  => Lekcja 6
  => Lekcja 7
  => Lekcja 8
  => Lekcja 9
  => Lekcja 10
  => Lekcja 11
  Świat WWW
  Serwery Proxy
  Galeria
  GRY
  SKÓRKA DO GG
  Lockerz.com
  SKLEP
...
Lekcja 7
  Lekcja 7  - "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_MACHINESoftwareNumega/
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.93 Program Disassembler/Debugger",0
; a oto kod wykrywajacy i wylaczajacy w32dasm:

;...
        push offset szW32Dasm
        push 0
        call FindWindowA
        cmp eax,0
        je dalej
        push 0
        push 0
        push WM_CLOSE
        push eax
        call PostMessageA
dalej:
;...

A oto kawalek kodu programu Ptaska (z tego co wiem wyklada WDasm'a, a jak
z IDA to nie wiadomo...):

.386
locals
jumps
.model flat,STDCALL
extrn ExitProcess:Proc
.data
wskaznik:
xchg eax,ecx;kod instrukcji - 91h
xchg eax,ecx
xchg eax,ecx
xchg eax,ecx
xchg eax,ecx
xchg eax,ecx
xchg eax,ecx
xchg eax,ecx
xchg eax,ecx
xchg eax,ecx
jmp koniec
.code
start:
mov edi,offset wskaznik;adres w selektorze danych
mov ecx,10
petla:
dec byte ptr [edi];zmniejsz 10 bajtow, kazdy o 1 co daje 90h(NOP)
inc edi
loop petla
jmp wskaznik;a teraz skocz i wykonuj co siedzi w data(czyli nop'y)
koniec:
push 0
call ExitProcess
end start

Teraz 11201 odwiedzający (26036 wejścia)
Logowanie  
 
Nazwa użytkownika:
Hasło:
 
 
 
 
 
   
Ta strona internetowa została utworzona bezpłatnie pod adresem Stronygratis.pl. Czy chcesz też mieć własną stronę internetową?
Darmowa rejestracja