IDA vs. W32dsm czyli Dawid i Goliat tylko kto jest kim?

Kazdy cracker potrzebuje jakichs porzadnych narzedzi, gdy zaczynalem swoja edukacje
nie widzialem swiata poza W32dsm, to byl dopiero prog, dekompilator i debugger
w jednym, bylem tak zaslepiony jego "mozliwosciami" ,ze nie chcialem nawet tykac
innych chocby tylko zeby zobaczyc jak dzialaja.Z czasem natknalem sie na pare
tutoriali opisujacych mozliwosci idy(fravia), postanowilem ze jednak sprobuje
zobaczyc to co za cudo.Pierwsza wersja jaka dostalem w swoje dlonie to 3.84
teraz mam 4.04 i mimo tego, ze jest pod win, klawiszologia w czworce i inne rzeczy
(heh win gui to widac na pierwszy rzut oka ;)nie ulegly zmianie w porownaniu z 3-ka.
Pierwsze co da sie zauwazyc to znacznie wolniejsza deasemblacja w porownaniu z W32dsm,
ale sadze, ze warto zaplacic ta cene za mozliwosci ktore oferuje IDA.

Ida jest wysoce konfigurowalnym progiem,praktycznie mozna zmienic wszystkie opcje,
zaczynajac na ustaleniu pamieci jaka alokuje ida na starcie poprzez opcje pozwalajace
nam konfigurowac jak ma wygladac wynikowy deadlisting konczac na kolorkach interfejsu.
Konfiguracja jest zapisana w pliku IDA.CFG znajdujacym sie w katalogu glownym IDY.Ide
mozna konfigurowac recznie poprzez zmiane pliku konfiguracyjnego oraz poprzez dialogi.
Ta druga metoda mimo ,ze szybsza nie pozwala na dokladne konfigurowanie idy.

Po dokladnym skonfigurowaniu przychodzi czas na wyprobowanie mozliwosci idy.W32dsm
podczas otwierania progsa nie pyta sie o zadne szczegoly,ida umozliwia nam na starcie
wybrac z jakimi parametrami ma byc dokonany proces deasemblacji.Do wyboru mamy np.
mozliwosc dobrania procesora w jakim zostal skompilowany program(wynik otrzymamy
w asemblerze tegoz procesora) do wyboru sa procesory serii intel,motorola,powerpc
sparc,dec,Z80 i mnostwo innych dzieki czemu ida wmozliwia analize programow
skompilowanych nie tylko dla intela.Ida stara sie automatycznie po wczytaniu proga
rozpoznac format tegoz programu(PE,LE,NE,DOS,BIN) dzieki czemu np. plik PE exe mozna
wgrac do idy jako PE wtedy otrzymamy deadlisting kodu wykonywanego w win albo wybrac
opcje load as MS-DOS executable co w wyniku da nam listing dosowego naglowka pliku PE.

Ida podobnie jak W32dsm posiada okno w ktorym wyswietlone sa wszystkie ciagi jakie
znajduja sie w exe-ku, takze nazwy funkcji API co moze troche utrudniac wyszukiwanie
poczatkujacym, tutaj maly plus dla W32dsm ktory posiada oddzielne okna dla funkcji API
(importowanych/exportowanych) i ciagow.Wpisujac kolejno litery poszukiwanego ciagu ida
automatycznie przechodzi do mozliwych pozycji listy.Proces wyszukiwania interesujacych
nas ciagow mozna przeprowadzic wciskajac kombo ALT-T i wpisujac fragment ciagu ktorego
poszukujemy.Nastepne pozycje zawierajace wpisany przez nas fragment mozemy odnalezc
ciskajac CTRL-T.Pozycje z listy mozemy kasowac,edytowac oraz mozemy rowniez dodawac nowe
okreslajac ich lokacje w pliku(virtualny adres w przypadku PEkow)!Ida posiada takze
oddzielna liste na ktorej znajduja sie procedury z pliku,liste segmentow ktora
umozliwia szybkie przemieszczanie sie pomiedzy segmentem np. code a data dostep do niej
uzyskujemy poprzez kombo CTRL-S,liste referencji i w cholere innych.

Referencje
~~~~~~~~~~
Na liscie referencji do ktorej dostep uzyskujemy po CTRL-X przedstawione sa wszystkie
adresy z ktorych nastepowalo odwolanie sie do danego fragmentu kodu(skoki warunkowe,
call-e)badz do danych(zapis,odczyt,ustawianie wskaznika na ta dana) np.

004010F2		jz	loc_401181
004010F8 
004010F8 loc_4010F8:			; CODE XREF: start+155j
004010F8				; start+15Ej start+167j
004010F8				; start+170j start+17Cj
004010F8				; start+18Bj
004010F8		inc	edi
004010F9		dec	eax
004010FA		jnz	loc_401074

referencje znajduja sie na liscie oraz wyswietlane sa jako komentarz(tak jak w asm)
za srednikiem.Klikajac na referencji tak jak na URL ladujemy w miejscu z ktorego
nastapilo odwolanie do danej lokacji.Klikajac na adresach jmp-ow i call-i takze
ladujemy w lokacjach na ktore wskazuja adresy komend.Powrot do poprzedniej lokacji
realizuje sie poprzez ESC dzieki czemu przemieszczanie sie miedzy fragmentami
kodu jest wyjatkowo szybkie.Pisalem ,ze referencje wyswietlane sa takze dla danych

00406000 dword_406000	dd 0		; DATA XREF: start+116w
00406000				; start+137r .text:0040218Br
00406000				; sub_40219D+22r

Literka w przy adresie skad nastapilo odwolanie oznacza ,ze pod tym adresem nastapil
zapis(Write) do danej lokacji pamieci, w tym przypadku do DWORDa

00401111		call	j_GetStdHandle
00401116		mov	dword_406000, eax; zapis do zmiennej

r jak pewne sie domyslacie oznacza ,ze z danej lokacji nastapilo odczytanie zawartosci
zmiennej

00402189		push	2Eh
0040218B		push	dword_406000	; push odczytuje zmienna i zapisuje ja na stosie

Ilosc max referencji pokazywanych przy danych mozna ustawic recznie w pliku konfiguracyjnym

SHOW_XREFS		= 50  // Show X cross-references (the rest is accessible by Ctrl-X)

polecam ustawic jak najwieksza ilosc gdyz bledne skonfigurowanie moze doprowadzic do tego,
ze nie bedziemy wiedzieli obok kodu skad nastapilo odczytanie ciagu "Sorry, this is
unregistered..." a czasami mozna zapomniec o CTRL-X ;)

Komentarze
~~~~~~~~~~
Ida pozwala definiowac wlasne komentarze do fragmentow kodu, danych wystarczy ,ze wcisniemy
srednik ; gdy kursor znajdzie sie na wierszu kodu nastepnie pojawi sie okienko pozwalajace
nam wpisac dowolny komentarz(wielowierszowy takze).Istnieja 2 rodzaje komentarzy powtarzalne
wstawiane za pomoca srednika i niepowtarzalne wstawiane za pomoca dwukropka.Niepowtarzalne
ktore wyswietlane sa nie tylko obok fragmentu kodu gdzie sami postawilismy komm ale takze
w miejscach w ktorych nastepuja odwolania do fragmentu kodu gdzie mamy nasz komentarz.
Np przy jmp-ie do fragmentu kodu gdzie mamy komentarz pojawi sie on raz jeszcze.Komentarze
niepowtarzalne pokazywane sa tylko i wylacznie w jednym miejscu.

Etykiety
~~~~~~~~
Piszac programy w asemblerze poslugujemy sie latwymi do przyswojenia etykietami
np. otworz_plik, exit, ida domyslnie wszystkim etykietom daje nazwe loc_virtualnyadres.
Nazwy etykiety mozemy z latwoscia edytowac wciskajac N gdy kursor znajdzie sie nad etykieta.
Mozna rowniez tworzyc nowe etykiety w dowolnych miejscach kodu rowniez poprzez N.Jezeli
chcemy szybko znalezc sie w miejscu danej etykiety wciskamy G i nastepnie wpisujemy nazwe
etykiety i jezeli takowa istnieje to ida przenosi nas w to miejsce.Ida posiada rowniez
oddzielna liste na ktorej znajduja sie wszystkie etykiety zmiennych uaktywniana poprzez
CTRL-L.

Breakpointy w deadlistingu
~~~~~~~~~~~~~~~~~~~~~~~~~~
Latwe podrozowanie pomiedzy roznymi fragmetami kodu daje nam
opcja markowania adresow.Wystarczy,ze umiescimy kursor na danej lokacji i wcisniemy kombosa
ALT-M ida poprosi nas o komentarz jaki pojawi sie w liscie zaznaczonych pozycji wywolywanej
przez CRTL-M.Jest to niezwykle przydatny bajer ktory wyklucza(ale nigdy do konca) spisywanie
adresow na kartce tak jak to mialo miejsce w przypadku deadlistingow z W32dsm

Jezeli sie zdarzy(niestety czesto sie zdarza), ze ida nie rozpoznaje poprawnie jakiegos
ciagu textowego(nalezy ustawic w opcjach jak ciagi textowe sie koncza w danym pliku,
standardem w win jest zakonczenie ciagu zerem ASCIz,ale np. ciagi w com-ach zakanczane sa
znakiem $) nalezy umiescic kursor nad pierwszym bajtem ciagu i cisnac literke A (make ASCI)

004060AA		db  45h ; E
004060AB		db  78h ; x
004060AC		db  65h ; e
004060AD		db  63h ; c
004060AE		db  75h ; u
004060AF		db  74h ; t
004060B0		db  61h ; a
004060B1		db  62h ; b
004060B2		db  6Ch ; l
004060B3		db  65h ; e
004060B4		db    0 ;

po tej skomplikowanej operacji otrzymamy na ekranach

004060AA szExecutableFil db 'Executable',0

Ciag ten mozemy rowniez zundefiniowac(inny wyraz akurat nie przychodzi mi do glowy) poprzez
nacisciecie klawisza U (undefine) co spowoduje ,ze ciag stanie sie znowu pojedynczymi bajtami.
Poprzez nacisniecie klawisza gwiazdki * mozemy tworzyc tablice.W okienku pojawi sie pytanie
ilu elementowa ma byc tablica,czy powtarzajace sie bajty maja byc deklarowane uzywajac
slowa dup,wynik otrzymujemy w postaci:

004060AA		db 45h, 78h, 65h, 63h, 75h, 74h, 61h, 62h, 6Ch, 65h, 00h

Podobne bajery mozemy robic takze z fragmentami kodu.Gdy w kodzie widzimy np. cos takiego

00401013		cmp	al, 61h

i chcemy sie dowiedziec czy 61h to jakis znak alfabetu wystarczy najechac na 61h kursorem
i wcisnac R (make chaR).Wartosc 61h mozemy zamienic na np wartosc przedstawiona w systemie
dziesietnym wystarczy, ze najedziemy na 61h i nacisniemy H.Mozna jej wartosc przedstawic
takze w formie binarnej naciskajac B,jako wartosc za-not-owana(czyzli not 9Eh) wciskajac
znak tyldy ~ ,lub ujemna(musi byc przedstawiona jako liczba dziesietna) wciskajac znak
minusa - .Istnieje rowniez opcja recznego wpisywania wartosci liczbowych.

Kalkulator
~~~~~~~~~~
Po wciscnieciu znaku zapytania ? pojawi sie okienko Evaluate expression, gdzie
mozemy wpisac dowolna operacje matematyczna.Operatory jakich mozemy uzyc pochodza z jezyka
C i tak mamy

+	- dodawanie np. 0x01+5
-	- odejmowanie np. 'A'-0x41
*	- mnozenie np. 40*13
/	- dzielenie np. 21/0x02
%	- reszta z dzielenia 20 % 2
~	- not np. ~2
^	- XOR np. 0x50^0x42
|	- OR  np. 0xF0 | 0x0F
&	- AND np. 0xBE & 0x07
<<	- SHL np. 2 << 1
>>	- SHR np. 1 >> 2

Operacje mozemy podawac w nawiasach co znacznie ulatwia wylicznie skomplikowanych wyraze.
Wartosci podawane bez przedrostka 0x traktowane sa jako dziesietne,znaki alfanumeryczne
mozna podawac w apostrofach ''.Istnieje takze opcja pozwalajaca konwertowac wartosci
hexadecymalne(i na odwyrtke) do formatow:

long( expr ) np. long(412/3) = 137
char( expr ) np. char(0x41 + 1) = 'B'
float(expr ) np. float( 412/3) = 1.37e2

Sygnatury
~~~~~~~~~
Ida w przeciwienstwie do W32dsm potrafi rozpoznac funkcje(inline) ktore sa standardowo
kompilowane przez takie pakiety programistyczne jak VC++,BCC,Delphi i automatycznie
przydziela tym funkcjom przyjazne nazwy zamiast sub_virtualnyadres otrzymujemy np.
_memcpy

00402158                 push    edi
00402159                 push    eax
0040215A                 push    [esp+10h+arg_0]
0040215E                 call    _memcpy

gdy klikniemy na _memcpy(to nie jest funkcja API tylko wew funkcja programu) wyladujemy w:

004048A0 _memcpy:
004048A0                 push    ebp
004048A1                 mov     ebp, esp
004048A3                 push    edi
004048A4                 push    esi
004048A5                 mov     esi, [ebp+0Ch]
004048A8                 mov     ecx, [ebp+10h]
004048AB                 mov     edi, [ebp+8]
004048AE                 mov     eax, ecx
...

Jak dziala takie rozpoznawanie funkcji?Pierwsze bajty kolejnych procedur porownywane
sa z zapisanymi bajtami w plikach definicyjnych i jezeli pasuja IDA autmatycznie przydziela
przyjazna nazwe danej funkcji.Czesto zdarza sie ,ze ida nie laduje wszystkich plikow sygnatur
i trzeba samemu to zrobic, wtedy idziemy do menu file-->load file-->flirt signature i wybieramy
sygnature ktora naszym zdaniem spelni zadanie(oczywiscie zladowanie sygnatury VC++ dla progow
skompilowanych w delphi nie da rezultatow).

"Rozszerzanie" funkcji
~~~~~~~~~~~~~~~~~~~~~~
IDA posiada opcje ktora sprawia ,ze standardowe procedury(flirt) wyswietlane sa w jednej linii
i jezeli chcemy obejrzec caly kod procki kursor umiejscowiamy nad ta linia i ciskamy plus +

004047D0 ; [0000007B BYTES: COLLAPSED FUNCTION _strlen. PRESS KEYPAD "+" TO EXPAND]

po + widzimy

004047D0 ; --------------- S U B R O U T I N E ---------------------------------------
004047D0 
004047D0 ; Attributes: library function
004047D0 
004047D0 _strlen	proc near
004047D0 arg_0		= dword ptr  4
004047D0 
004047D0		mov     ecx, [esp+arg_0]
004047D4		test    ecx, 3
004047DA		jz      short loc_4047F0
...

aby ponownie "schowac" kod tej procki wystarczy cisnac minus - ,kursor moze znajdowac sie
w dowolnym obszarze kodu procedury.Przy okazji mozna zauwazyc,ze ida parametry podawane
procedura poprzez stos w definicji procedury deklaruje jako stale i potem w kodzie procedury
odwolania do tego parametru uzywane sa z wykorzystaniem tej stalej.Jezeli komus sie to nie
podoba mozna to wylaczyc w konfigu

#define AF_LVAR         0x0400  // Create stack variables

wystarczy to zamienic na

#define AF_LVAR         0x0000  // Create stack variables

albo zXORowac wartosc ANALYSIS z 0x0400 co da ten sam rezultat.Po takich zmianach
deadlisting powyzszej procki bedzie tak wygladal:

004047D0 _strlen	proc near
004047D0 
004047D0		mov     ecx, [esp+4]
004047D4		test    ecx, 3
004047DA		jz      short loc_4047F0

kwestia gustu i nic wiecej.

Skrypty IDC
~~~~~~~~~~~
Ida wyposazona jest w potezna bron, kompilator(jezeli mozna to tak nazwac,
bardziej pasuje interpretator) skryptow IDC.Skrypty IDC swoja budowa bardzo przypominaja
programy pisane w C

#include <idc.idc>	// standardowy include
			// deklaracje funkcji
static nazwa_funkcji1(paramert1,paramert2,paramert3)
{
auto zmienna1;		// zmienne deklarujemy poprzez slowo auto(merc benz ;)
auto zmienna2;
			// kod
}

}			// wazne!

Opis funkcji dostepnych dla skryptow IDC znajduje sie w help-ie do IDY i opisywanie ich
tu wszystkich nie ma sensu(to tak jakby przepisywac win32api.hlp) a i ja nie mam na ochoty
na taka zabawe.Przedstawie moze moj prosty skrypt sluzacy do deszyfrowania danych

#include <idc.idc>

static xor(from,size,key)
{
auto t,x;		// zmienne potrzebne do dzialania petli
for(t=0;t<size;t++) {
x=Byte(from);		// pobranie bajtu z lokacji
x=x^Byte(key);		// xor-uj bajt z kluczem
			// ida nie umozliwia stosowania skrotow ala +=,-=,^=,*= :(
PatchByte(from,x);	// patchuj bajt
from=from+1;		// zwieksz licznik, znowu brak mozliwosci zastosowania ++,--
}
}			// bye

skrytpt ten nie robi nic innego jak xor-uje wybrany fragment kodu/danych wg. jednego
bajtu.

Uruchamianie skryptu,najpierw nalezy zaladowac plik skryptu poprzez F2 potem mamy do
dyspozycji dialog IDC Command otwierany przez SHIT-F2 ktory umozliwia nam wprowadzenie
polecen(prawie jak dos prompt) skrytpom IDC.W przypadku mojego prostackiego skryptu
wpisujemy np. xor(0x401000,0x100,0x55); nalezy pamietac o tych 0x i sredniku na koncu.

Pliki IDB
~~~~~~~~~
Jezeli nie dokonczylismy pracy z deadlistingiem mozemy go zachowac na dysku w formie
pliku IDB, po zapisaniu takiej bazy nie potrzebny jest juz oryginalny plik exe a i jego
rozmiar jest znacznie mniejszy(warto zaznaczyc opcje pack database :) niz plik wyjsciowy
deadlistingu generowany przez W32dsm.

ASM,MAP
~~~~~~~
IDA ma takze opcje ktore umozliwiaja "produkcje" plikow wynikowych do formatu 
.asm co po malych poprawkach umozliwia czasami skompilowanie takiego pliku(hi cox :)
, .map w pliku zapisane sa adresy virtualne procedur ,nazwy etykiet.Pliki .map moga byc
uzyte przez loadera z SoftIce'a dzieki czemu podczas sledzenia kodu w SI bedziemy
widzieli np. swoje nazwy procedur,zmiennych.

Podstawowe komendy
~~~~~~~~~~~~~~~~~~
Skroty klawiaturowe zapisane sa w pliku konfiguracyjnym(IDAGUI.CFG) wiec
podam tak jak jest na czysto:

g	- pojawia sie dialog proszacy nas o wpisanie adresu pod ktory chcemy isc np.g 401000
n	- zmiana nazwy etykiety
?	- kalkulator
;	- wstawienie komentarza
a	- zamiana na ciag ASCII
h	- zamiana wartosci liczbowej hex<-->dec
b	- zamiana bin<-->hex/dec/oct
ALT-M	- markowanie pozycji
CTRL-M	- lista zaznaczonych pozycji
ALT-T	- szukanie okreslonego ciagu textowego w deadlistingu(proces dosyc powolny)
CTRL-T	- szukanie nastepnego ciagu
F4	- przelacza widok na hex


Ja juz sie przekonalem kto jest Dawidem a kto Goliatem, zycze i Wam udanego wyboru :)

bart^CrackPl
cryogen@poland.com