Witaj! Rejestracja

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_ladowani a_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 ExitProcessTongueroc
.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
Odpowiedz

[-]
Szybka odpowiedź

Disable AutoMedia embedding for this link.   MP3 Playlist

Weryfikacja przeciw botom
Zaznacz pole wyboru znajdujące się poniżej. Ten proces pozwala chronić forum przed botami spamującymi.

Podobne wątki
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  Techniki lamamniu zabezpieczen keyfile brunet 0 499 12-01-2010, 17:28
Ostatni post: brunet
  Techniki lamamniu zabezpieczen keyfile brunet 0 497 12-01-2010, 17:28
Ostatni post: brunet

Użytkownicy przeglądający ten wątek:

1 gości