Blog literacki, portal erotyczny - seks i humor nie z tej ziemi


Lekcja XII - "IDA - potezne narzedzie w doswiadczonych rekach"


-----------
------------============== 1.0 Wstep ==============------------
-----------

Heh, kiedys gdy bylem jeszcze poczatkujacym crackerem, istnial tylko
WDasm, tzn. zle sie wyrazilem... IDA napewno juz istniala, jednak
nie byla ona nawet w 10% tak popularna w polskim swiatku crackerskim
jak on. Ja sam dlugie miesiace uzywalem WDasm'a, az w koncu nie
wytrzymalem. Ciagle tylko slyszalem: 'IDA jest super', 'WDasm jest
slaby' itp... i powiem trudno tutaj nie bylo przyznac racji...
program nie aktualizowany od dawien, dawna nie radzil sobie z nawet
prostymi sztuczkami 'anty', wysypywal sie kiedy tylko mogl.
Nie pozostalo mi wiec nic innego jak wziasc zaniesc swoj tylek
(razem z dyskiem) do iNetCafe i sciagac to ogromne cudo....

16 mega, to mnie wowczas rozwalalo... zastanawialem sie, co to za
paskudztwo tyle wazy, co oni tam upchali? Uruchomilem i...? wielkie
rozczarowanie ;-) Program jakis taki skomplikowany, zakrecony z
mnostwem ikonek, opcji i podopcji. Przyznam szczerze, ze troche
mnie do przestraszylo i odrzucilo...

Impas ten w mojej glowce trwal jakis czas, az na nowo pelen sil
i gotowy na pare nieprzespanych nocy postanowilem nauczyc sie
za wszelka cene jego obslugi. I co najdziwniejsze, chyba sie
przelamalem ;-) Zaczelem sie go uczyc (wcale nie za pilnie)
powolutku, ale skutecznie. Poznawalem po woli jego funkcje i
zaczalem rozumiec, co tysiacy crackerow w niej widza... wiecie
co? Najlepszy disassembler jaki kiedykolwiek po bajtach stapal!

Wiec pamietaj smiertelniku, jesli jeszcze nie nauczylesz sie
jego obslugi zrob to dzis!

------------------------
------------============== 1.1 O czym to bedzie ==============------------
------------------------

Naucze cie jak odtworzyc kod zrodlowy programu (dotyczyc to
bedzie wersji pod win, np. 4.04) Heh... wiem, ze tutor na ten temat
powstal i wisi na www.crackmes.prv.pl, wiec poki zostane posadzony
o plagiat to podaje powody:

- tamten przeznaczony jest dla wersji DOS ktora sie znacznie rozni
od windowsowskiej ;-)

- autor zapomnial o wielu zarabistych funkcjach IDA ;-)

- jest on ogolnie taki jakis wybrakowany i nie porusza wielu
aspektow...

Tak w ogole to nie skupie sie tylko na rekompilacji, mam ochote
zachaczyc o pare dodatkowych tematow ;-) Mam nadzieje, ze uda
mi sie znalesc pretekst...

------------------------------------------
----------============ 2.0 Ladujemy pierwszy program do IDY ;-) ============----------
------------------------------------------

Ok... to wypadalo by teraz zdisassemblowac sobie nasz pierwszy programik ;-)
Jako przyklad wybrane zostalo... crackme by Jube #4 (chyba nie ma
nic przeciwko ;-)) Ok.. uruchom IDE i wybierz do uruchomienia plik
jube4.exe, dolaczony do lekcji. IDA teraz chwilke pomysli (to znaczy
sprawdzi format pliku exe - tak na marginesie to IDA oblsuguje ich
naprawde sporo, ale wiekszosc wam sie nigdy nie przyda) i twoim oczom
powinno ukazac sie piekne okienko. Teraz masz tak:

- u gory mozesz wybrac format pod jakim prog ma byc przemielony (jak sie
domyslasz w tym przypadku PE)
- ponizej mozesz wybrac typ procesorka
- potem masz pare przyciskow, pod kazdym z nich kryje sie dosc sporo opcji
jednak ba nasze potrzeby zachowajmy ustawienia 'fabryczne', oczywiscie
nic nie stoi na przeszkodzie azeby poekseprymentowac z nimi (ja sie troche
bawilem, ale nie dawalo to ciekawych rezultatow ;-))
- i ponizej jeszcze pare opcji.

W tych ostatnich opcjach mozesz wybrac np. :

'Load manualy' - IDA bedzie pytala sie po koleji ktore sekcje ma disassemblowac,
a ktore nie.

'Load resources' - jesli to zaznaczysz IDA zdisassembluje sekcje .rsrc, nie daje
to zadnych ciekawych rezultatow...

'Make imports segment' - jesli to odznaczysz to IDA nie przejrzy sekcji importow,
w zwiazku z czym nie beda widoczne nazwy uzywanych przez niej funkcji API.

Ok... ja nic nie zmienialem w ostawieniach jakie proponuje IDA, ty tez tak na razie
zrob, inaczej mozesz miec zupelnie cos innego na ekranie niz ja, a potem beda
kwiatki ;-)

Teraz tylko klinij ok i poczekaj az IDA przemieli kod ;-) A wlasnie... IDA ma taka
ciekawa wlasciwosc, ze przeprowadza dissasemblace w dwoch krokach:

- w pierwszym IDA pobiera caly kod i wyswietla go na ekranie w opcodach, prawie tak
jak hexedytor... w tym momencie uzytkownik moze juz przegladac kod.

- w drugim IDA analizuje caly kod, wpisy w importach itp... na biezaco na ekranie
wyswietlany jest poprawiony kod.

O wszystkim informuja swiatla w prawym gornym rogu ekranu:
czerowne - IDA przeprowadza punkt pierwszy
zielone - skonczyla pierwszy i zaczyna drugi
zolte - IDA zakonczyla obydwa punkty pomyslnie (z lepszym lub gorszym rezultatem) ;-)

------------------------
------------============== 2.1 Zapoznanie z IDA ==============------------
------------------------

Okno glowne IDY podzielony jest na 2 czesci, w gornej wyswietlany jest kod programu,
natomiast na dolnej, sa rozne raporty generowane przez IDE (np. czy wykonanie komendy
sie powiodlo czy nie). Ok... teraz co nieco o ogolnych zasadach pracy z IDA.
Pierw jak IDA przetwarza kod... IDA dzieli kod na sekcje, o kazdej z nich przedstawia
krotka informacje (flagi, wyrownania itp.). Kod jest nastepnie dzielony na
procedury... IDA pakuje w nie kazdego call'a ;-) Poszczegolne procedury oddzielone
sa od siebie komentarzami, o ile ich nie wylaczymi.
Sekcje ulozone sa tak jak w pliku, przewaznie pierw jest sekcja .code, potem .data
i .rsrc...
Mysle, ze bez problemu polapiesz sie w tym co IDA ci prezentuje ;-)

IDA ma taka ciekawa wlasciwosc, ze jesli importowana jest jakas funkcja, to IDA
tworzy call'a o nazwie 'j_nazwa_funkcji' (ktory zawiera skok do wlasciwej funkcji),
na ta nazwe podmieniane sa wszystkie wywolania funkcji w programie. Przyznam, ze
jako fan MASM'a zawsze mnie to wkurzalo, ale nigdzie nie znalazlem opcji zeby to
wylaczyc ;-) widocznie tak juz musi byc ;-)

------------------------
------------============== 2.2 Opcje i konfiguracja IDY ==============------------
------------------------

Ok... wiekszosc operacji w IDA wykonuje sie z poziomu menu, ikon albo skrotow
klawiaturowych (bardzo pomocne i szybkie).
Ok to tak skrotowo:

- Wyswietlanie: w menu 'View' mozemy dokonac przelaczania widokow (mozna wybierac
pomiedzy kodem i danymi, wyswietlaniem w hexach, czy normalnie). Nastepnie z tego
menu mamy dostep do wyswietlania takich informacji jak: funkcje, dane, problemy,
struktury, selektory i inne zabawki ;-) kazdy znajdzie tu cos dla siebie.

- Edycja: z menu 'Edit' mozemy dokonac praktycznie kazdej potrzebnej zmiany. Zmieniac
mozemy np. nazwy funkcji czy danych, typy danych, dodawac komentarze, edytowac
struktury. IDA pod tym wzgledem wyglada naprawde pozadnie. Dokonac mozemy jakichkolwiek
zmian czy przeksztalcen.

- Skoki: z menu 'Jump' mozemy przeniesc sie do praktycznie kazdego szukanego elementu.
Z duzej liczby opcji mozemy wybrac kategorie, ktora nam odpowiada i przeniesc sie do
wybranego miejsca w kodzie.

- Szukanie: z menu 'Search' mamy dostep do opcji przeszukiwania, mozemy szukac okreslonego
tekstu w calym wyswietlonym tekscie, albo tylko w kokretnych typach.
- Opcje: z menu 'Options' mamy mozliwosc dokonania opowiednich zmian w konfiguracji IDY,
ale o tym pozniej.
- Pliki: z menu 'File' mozemy dokonac paru rzeczy: odczytac nowy plik, zapisac rezultaty
pracy, wywolac skrypt czy wygenrowac kod w odpowiednim formacie kodu.

Ok... teraz zajmiemy sie konfiguracja IDY, z menu 'options -> general' mamy podstawowe
opcje konfiguracyjne. I teraz mamy zakladki:

#1 - z niej mozemy dokonac wyboru co bedzie wyswietlane na ekranie (chodzi o takie rzeczy
jak komentarze, ramki, puste linie), czy tez ustawic prawy margines.
#2 - w tej opcji mamy mozliwosc zmiany decyzji, jaka musielismy podjac przed zaladowaniem
pliku przez IDE (jak procesor itp.)
#3 - ustawienia wyswietlnaia xref
#4 - tutaj wybieramy typ napisow, w naszym przypadku sa to tzw. 'null terminated strings'
(chodzi o to, ze kazdy z nich zakonczony jest zerem). Ustawienia te sa wazne jesli
bedziesz wyciagal kod zrodlowy! Mozemy takze ustawic komende ktora bedzie sluzala do
zabawy danymi.
#5 - tutaj mamy taka zarabista opcje jak kolorki ;-) mimo iz te standardowe nie sa zbyt
najgorsze, to warto poeksperymentowac z roznymi wartosciami... w koncu wzrok i czytelnosc
kodu jest najwazniejsza.
Ostatnie dwie opcje, sa malo interesujace i bardzo proste ;-)

------------------------
------------============== 2.3 Zabawa z kodem ==============------------
------------------------

Ok... zaladowalismy kod do IDY, program go ladnie przemielil i teraz mamy wyswietlany
ladny tekst... i w sumie w tym miejscu mozna by juz wygenerowac kod zrodlowy. Jednak
tylko na tym stracimy! IDA oferuje tyle funkcji i zabawek do modyfikacji typow
danych, ze az zal nie skorzystac z jej mozliwosci!
No, ale po koleji. Przewin informacje o sekcji .code, powienienes zauwazyc tam procedure
'start'. Jak sie pewnie domyslasz wywolywana jest ona zaraz na poczatku pracy
progamy, wiec mylse, ze jak zaczniemy w tym momencie to bedzie dobrze.

Widzimy cos takiego:

00401000 public start
00401000 start proc near
00401000 push 0
00401002 call j_GetModuleHandleA
00401007 mov ds:dword_402000, eax
0040100C call j_GetCommandLineA
00401011 mov ds:dword_4021FB, eax
00401016 push 0
00401018 push offset sub_401050
0040101D push 0
0040101F push 64h
00401021 push ds:dword_402000
00401027 call j_DialogBoxParamA
0040102C push 0
0040102E call j_ExitProcess
0040102E start endp

Jak widzisz jest to standardowy kod programu w win32asm, prosty, latwy i przjemny.
Widzimy tutaj wywolania 4 funkcji, pierwsza pobiera uchwyt modulu, druga zapisuje
linie komend, nastepnie trzecia wywoluje okno dialog, a ostania poprostu konczy prace
programu. Tak na dobra sprawe mozna by to tak zostawic, ale nazwy tych wszystkich
dwordow sa jakies takie nieczytelne, mozna by je zmienic na jakies bardziej trafiajace
do gustu ;-) Najlepiej zmieniac na oficjalne nazwy, uzywane przez wszystkie schematy.
Ok, a jak zmienic to za pomocy IDY? Wystarczy kliknac myszka na dworda (ale uwaga, trzeba
ro robic dokladnie na niego, a nie gdzies po bokach, bo potem kwiatki wychodza!) i
wcisnac kombinacje 'ctrl n', powinno otworzyc sie okno gdzie mozna wybrac pare opcji,
takich jak maksymalna dlugosc wpisu, ale tym sie na razie nie przejmuj. U gory natomiast
mozesz zrobic to co nas interesuje, czyli wpisac nowa nazwe zmiennej. Aha, jesli dlugosc
ta przekroczy zaznaczony limit to IDA zapyta sie czy ma kontynuowac (jednoczesnie
zmienijac limit na odpowiednio wiekszy). Dodatkowo po wykonaniu tej komendy IDA zmieni
wszystkie inne odwolania do tego dword'a w calym pliku (wiec co nieco nam ulatwia
robote ;-)). Oto jak ja ten kod przerobilem:

00401000 public start
00401000 start proc near
00401000 push 0
00401002 call j_GetModuleHandleA
00401007 mov ds:hInstance, eax
0040100C call j_GetCommandLineA
00401011 mov ds:linia_komend, eax
00401016 push 0
00401018 push offset DlgProc
0040101D push 0
0040101F push 64h
00401021 push ds:hInstance
00401027 call j_DialogBoxParamA
0040102C push 0
0040102E call j_ExitProcess
0040102E start endp

Ladnie? to przechodzimy dalej...
Ponizej tego kodu widac wywolanie MessageBox'a, na razie to opuszczamy bo jest to do
niczego nam nie potrzebne ;-) Przechodzimy ponizej:

00401050 DlgProc proc near ; DATA XREF: start+18o
00401050
00401050 arg_0 = dword ptr 8
00401050 arg_4 = dword ptr 0Ch
00401050 arg_8 = dword ptr 10h
00401050
00401050 enter 0, 0
00401054 push ebx
00401055 push edi
00401056 push esi
00401057 cmp [ebp+arg_4], 2
0040105B jz short loc_401082
0040105D cmp [ebp+arg_4], 10h
00401061 jz short loc_401082
00401063 cmp [ebp+arg_4], 111h
0040106A jz short loc_401090
0040106C cmp [ebp+arg_4], 110h
00401073 jz loc_40118D
00401079 xor eax, eax
0040107B pop esi
0040107C pop edi
0040107D pop ebx
0040107E leave
0040107F retn 0Ch

Jak sie pewnie domyslasz mamy tutaj procedure obslugi okna dialogowego... Te porownania
to poprostu procedura obslugi wiadomosci odbieranych przez okno (a wysylanych przez
Windows... jesli jeszcze o tym nie czytales to na www.win32asm.cjb.net masz tuty Iczeliona
na ten temat). Przed analiza tych porownan upiekszmy troche kod, azeby byl bardziej czytelny.
Zwroc na razie uwage na pierwsze pare komend:

00401050 arg_0 = dword ptr 8
00401050 arg_4 = dword ptr 0Ch
00401050 arg_8 = dword ptr 10h

Mamy tutaj deklaracje stalych dword'ow, pod ktorymi kryja sie bardzo ciekawe rzeczy... jakie?
popatrz jak ja to przerobilem:

00401050 hWin = dword ptr 8
00401050 uMsg = dword ptr 0Ch
00401050 wParam = dword ptr 10h

hWin - jest to uchwyt okna dialogowego
uMsg - w tej wartosci zwracane sa typy wiadomosci
wParam - a w tej mozemy znalezc parametr wiadomosci, wyjasnienia pozniej ;-)

No to mamy teraz:

00401057 cmp [ebp+uMsg], 2
0040105B jz short loc_401082
0040105D cmp [ebp+uMsg], 10h
00401061 jz short loc_401082
00401063 cmp [ebp+uMsg], 111h
0040106A jz short loc_401090
0040106C cmp [ebp+uMsg], 110h
00401073 jz loc_40118D

Ok, no to czas na wyjasnienia... w wartosci uMsg program zwraca na nam kod hexowy
wiadomosci przekazanej do programu. Wszystkie wiadomosci razem z ich hexowymi
odpowiednikami mozemy znalezc chocby w pakiecie MASM (w katalogu inclue, pod nazwa
resource.h). Ponizej masz rozpiske najpopularniejszych komend:

WM_NULL 0x0000
WM_CREATE 0x0001
WM_DESTROY 0x0002
WM_MOVE 0x0003
WM_SIZE 0x0005
WM_ACTIVATE 0x0006
WM_SETFOCUS 0x0007
WM_KILLFOCUS 0x0008
WM_ENABLE 0x000A
WM_SETREDRAW 0x000B
WM_SETTEXT 0x000C
WM_GETTEXT 0x000D
WM_GETTEXTLENGTH 0x000E
WM_PAINT 0x000F
WM_CLOSE 0x0010
WM_QUERYENDSESSION 0x0011
WM_QUIT 0x0012
WM_QUERYOPEN 0x0013
WM_ERASEBKGND 0x0014
WM_SYSCOLORCHANGE 0x0015
WM_ENDSESSION 0x0016
WM_SHOWWINDOW 0x0018
WM_WININICHANGE 0x001A
WM_SETTINGCHANGE WM_WININICHANGE
WM_DEVMODECHANGE 0x001B
WM_ACTIVATEAPP 0x001C
WM_FONTCHANGE 0x001D
WM_TIMECHANGE 0x001E
WM_CANCELMODE 0x001F
WM_SETCURSOR 0x0020
WM_MOUSEACTIVATE 0x0021
WM_CHILDACTIVATE 0x0022
WM_QUEUESYNC 0x0023
WM_GETMINMAXINFO 0x0024
WM_PAINTICON 0x0026
WM_ICONERASEBKGND 0x0027
WM_NEXTDLGCTL 0x0028
WM_SPOOLERSTATUS 0x002A
WM_DRAWITEM 0x002B
WM_MEASUREITEM 0x002C
WM_DELETEITEM 0x002D
WM_VKEYTOITEM 0x002E
WM_CHARTOITEM 0x002F
WM_SETFONT 0x0030
WM_GETFONT 0x0031
WM_SETHOTKEY 0x0032
WM_GETHOTKEY 0x0033
WM_QUERYDRAGICON 0x0037
WM_COMPAREITEM 0x0039
WM_GETOBJECT 0x003D
WM_COMPACTING 0x0041
WM_COMMNOTIFY 0x0044
WM_WINDOWPOSCHANGING 0x0046
WM_WINDOWPOSCHANGED 0x0047
WM_POWER 0x0048
WM_COPYDATA 0x004A
WM_CANCELJOURNAL 0x004B
WM_NOTIFY 0x004E
WM_INPUTLANGCHANGEREQUEST 0x0050
WM_INPUTLANGCHANGE 0x0051
WM_TCARD 0x0052
WM_HELP 0x0053
WM_USERCHANGED 0x0054
WM_NOTIFYFORMAT 0x0055
WM_CONTEXTMENU 0x007B
WM_STYLECHANGING 0x007C
WM_STYLECHANGED 0x007D
WM_DISPLAYCHANGE 0x007E
WM_GETICON 0x007F
WM_SETICON 0x0080
WM_NCCREATE 0x0081
WM_NCDESTROY 0x0082
WM_NCCALCSIZE 0x0083
WM_NCHITTEST 0x0084
WM_NCPAINT 0x0085
WM_NCACTIVATE 0x0086
WM_GETDLGCODE 0x0087
WM_SYNCPAINT 0x0088
WM_NCMOUSEMOVE 0x00A0
WM_NCLBUTTONDOWN 0x00A1
WM_NCLBUTTONUP 0x00A2
WM_NCLBUTTONDBLCLK 0x00A3
WM_NCRBUTTONDOWN 0x00A4
WM_NCRBUTTONUP 0x00A5
WM_NCRBUTTONDBLCLK 0x00A6
WM_NCMBUTTONDOWN 0x00A7
WM_NCMBUTTONUP 0x00A8
WM_NCMBUTTONDBLCLK 0x00A9
WM_KEYFIRST 0x0100
WM_KEYDOWN 0x0100
WM_KEYUP 0x0101
WM_CHAR 0x0102
WM_DEADCHAR 0x0103
WM_SYSKEYDOWN 0x0104
WM_SYSKEYUP 0x0105
WM_SYSCHAR 0x0106
WM_SYSDEADCHAR 0x0107
WM_KEYLAST 0x0108
WM_IME_STARTCOMPOSITION 0x010D
WM_IME_ENDCOMPOSITION 0x010E
WM_IME_COMPOSITION 0x010F
WM_IME_KEYLAST 0x010F
WM_INITDIALOG 0x0110
WM_COMMAND 0x0111
WM_SYSCOMMAND 0x0112
WM_TIMER 0x0113

Poszukaj tam kodow wiadomosci obslugiwanych przez okno, u nas sa to takie:

00401057 cmp [ebp+uMsg], 2 ; WM_DESTROY
0040105B jz short loc_401082
0040105D cmp [ebp+uMsg], 10h ; WM_CLOSE
00401061 jz short loc_401082
00401063 cmp [ebp+uMsg], 111h ; WM_COMMAND
0040106A jz short loc_401090
0040106C cmp [ebp+uMsg], 110h ; WM_INITDIALOG
00401073 jz loc_40118D

Wypadaloby sobie pododawac takie same komentarze w kodzie... w tym celu klinij na linijke
w ktorej chcesz wstawic komentarz i uzyj kombinajci 'shift ;'... latwe? ;-)

Ponizej masz rozpisane kiedy te wiadomosci wystepuja:

- WM_CLOSE i WM_DESTROY: przy zamykaniu, kasowanie okienka itp...
- WM_COMMAND: przy roznego rodzaju przycisnietych przyciskach itp...
- WM_INITDIALOG: przy tworzeniu okna...

Mozesz sobie popodmieniac skoki ponizej na nazwy mowiace co nieco o wiadomosci, ktora
wystapila (za pomoca znanej komendy 'ctrl n')... Jak pewnie zauwazysz ponizej
tego kodu znajduja sie procedury obslugi wiadomosci. Procedura wiadomosci 'wm_destroy'
i 'wm_close' sa proste i nie wymagaja komentarza. Zainteresujemy sie na razie procedura
od funkcji 'wm_command'. Jest to ta procedura:

00401090 loc_401090: ; CODE XREF: DlgProc+1Aj
00401090 cmp [ebp+wParam], 0Ah
00401094 jz short loc_4010C5
00401096 cmp [ebp+wParam], 1
0040109A jz short loc_4010FC
0040109C cmp [ebp+wParam], 2
004010A0 jz short loc_4010A9
004010A2 pop esi
004010A3 pop edi
004010A4 pop ebx

Heh, sproboje wyjasnic jakos prosto co ten kod robi. Jak juz mowilem wczesniej
wiadomosci posiadaja takze wartosci dodatkowe. Znajduja sie one w strukturach 'wParam'
i 'lParam'. Wiadomosc 'wm_command' posiada w 'wParam' przewaznie kod nacisnietego
przycisku. Ten kod odpowiada wlasnie za sprawdzenie co za przycisk zostal nacisniety.
Jak widzisz oblsugiwane sa trzy przyciski o kodach hexowych: 1,2 i OAh.
Ok wypadaloby sie dowiedziec co to za przyciski, mozemy zrobic to na dwojaki sposob:

a) obejrzec kod jaki odpowiada za obsluge kazdego przycisku i na tej podstawie
wywnioskowac co i jak
b) wyciagnac zasoby pliku i obejrzec co jest czym.

My urzyjemy drugiego bardziej eleganciekiego sposobu. Powod? i tak w koncu bedziemy
potrzebowali tych zasobow do kompilacji ;-) Do wyciagania zasobow najlepiej uzyc jednego
z dwoch programow: Borland Resource Wokrshop, albo eXescope (oba na stronce underpl).
Ja osobiscie polecam drugi, bo BRW czesto generuje bledy kod z ktorym potem jest mnostwo
zabawy. Opisuje wiec obluge tego programu (wersja przynajmniej 6.10 bo wczesniejsze nie
maja opcji wyciagania zasobow!). Azeby wyciagnac zasoby zrob tak:

- uruchom eXescope
- wybierz plik programu do obrobki (w naszym przypadku crackmesa)
- z menu 'File' wybierz opcje 'Output sourde (*.rc)' i podaj tylko nazwe pliku.
- Gotowe ;-) Proste, latwe i przyjemne.

Ok... czas zagladnac w wygenerowany kod, oto co mi wyszlo w wyniku pracy programu:

#include

LANGUAGE 21, 1

100 DIALOG 36,59,137,69
STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE | DS_ABSALIGN | DS_MODALFRAME
CAPTION "Crackme 4.0 by Jube^7TeaM"
FONT 8, "Tahoma"
BEGIN
EDITTEXT 105,3,15,130,12,WS_BORDER
DEFPUSHBUTTON "OK",1,3,30,49,16,WS_BORDER | WS_DISABLED
PUSHBUTTON "About",10,53,30,49,16,WS_BORDER
PUSHBUTTON "E-Mail",2,103,30,30,16,WS_BORDER
CTEXT "Enter here your key :",-1,3,3,130,8,WS_GROUP
CTEXT "Powered by TASM32",-1,3,49,130,9,WS_GROUP | WS_DISABLED
CTEXT "--- www.crackmes.prv.pl ---",-1,3,60,130,8,WS_GROUP
END

Widzimy tutaj standardowe okienko, z 3 przyciskami, jednym polem do wpisania textu i
pare tekstow dodatkowych. Nas interesuja przyciski (bo przewaznie je sie przyciska ;-)).
Program jak juz mowilem ma trzy przyciski:

DEFPUSHBUTTON "OK",1,3,30,49,16,WS_BORDER | WS_DISABLED
PUSHBUTTON "About",10,53,30,49,16,WS_BORDER
PUSHBUTTON "E-Mail",2,103,30,30,16,WS_BORDER

Ok... mielismy tutaj znalezc identyfikatory przyciskow. Znajduja sie one zaraz po tekscie
ktory znajduje sie na przycisku. W takim przypadku mamy:

'Ok' - identyfikator '1'
'About' - identyfikator '10'
'E-mail' - identyfikator '2'

To wobec tego mozemy juz poprawic kod:

00401090 cmp [ebp+wParam], 0Ah ; bo 10 decymendalnie to 0Ah w hexach!
00401094 jz short loc_4010C5
00401096 cmp [ebp+wParam], 1 ; Ok
0040109A jz short loc_4010FC
0040109C cmp [ebp+wParam], 2 ; E-mail
004010A0 jz short loc_4010A9

No to mysle ze wszystko juz jest jasne ;-) Teraz pozostaje ci juz tylko popodmieniac,
reszte danych, na jakies ladne i czytelne nazwy. Mozesz jeszcze teraz dla ulatwienia
wylaczyc pare smieci ktore masz na ekranie. Przejdz do menu 'options->general' w zakladce
'Disassembly' odznaczamy 'Borders between data/code'. Z zakladki 'cross-reference' wywalamy
wszystko po lewej stronie. A z menu 'options->assembler directives' odznaczamy obydwie opcje.

Mozemy teraz przystapic do generowania kodu. Z menu 'File->produce' wybieramy opcje
'Asm'. Podajemy nazwe pliku i generujemy kod. Teraz musimy wyedytowac plik *.asm w
notatniku, czy czego tam kto uzywa ;-)
Wypadaloby teraz przystosowac kod do kompilacji w MASM'ie. Ponizej masz schemat
programu dialogu w win32asm... bedziemy potem musieli przystosowac go do realiow
crackme.

********************************************************************************

.386
.model flat, stdcall
option casemap :none ; case sensitive


include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib


dlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD

.data
dlgname db "DIALOG_1",0
hInstance dd 0

.code

start:

invoke GetModuleHandle, NULL
mov hInstance, eax
invoke DialogBoxParam,hInstance,ADDR dlgname,0,ADDR WndProc,0
push 0
invoke ExitProcess,eax

DlgProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD

.if uMsg == WM_INITDIALOG

.elseif uMsg == WM_COMMAND

.if wParam == 0Ah
.elseif wParam == 01
.endif

.elseif uMsg == WM_DESTROY
push 0
call PostQuitMessage

.elseif uMsg == WM_CLOSE
push 0
call PostQuitMessage

.endif

xor eax, eax
ret

DlgProc endp
end start

****************************************************************************

Co teraz musimy zrobic? po pierwsze wypadaloby jakos oczyscic kod wygenerowany
przez IDE. Oto co musisz zrobic:

- po pierwsze to wykasuj wszystko od bajtow 'db ? ; unexplored', jest to totalny
syf, ktory ci w ogole nie bedzie potrzebny...

- teraz zrob porzadki w sekcji '.data', jak masz jakies deklaracje zmiennych, w stylu

bajt_zerowy dd 0 ; ...
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;
db 0 ;

To wez to przerob na: ' bajt_zerowy dd 0' , po co ma byc taki syf? ;-) Ok dane masz juz
jako tako czyste, mozesz wiec je wkleic w naszym szablonie do sekcji .data (tamte
rzeczy stare, mozesz wyrzucic).

- wyrzuc teraz oznaczenia sekcji a'la:

; Section 2. (virtual address 00002000)
; Virtual size : 00001000 ( 4096.)
; Section size in file : 00000200 ( 512.)
; Offset to raw data for section: 00000A00
; Flags C0000040: Data Readable Writable
; Alignment : 16 bytes ?
; ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
; Segment type: Pure data
DATA segment para public 'DATA' use32

Wywalaj to cale, nic ci sie tam nie przyda ;-)

- wywal wszystkie te linie:
; [00000006 BYTES: COLLAPSED FUNCTION j_ExitProcess. PRESS KEYPAD "+" TO EXPAND]

- jesli twoj notatnik (ja uzywam EditPad'a) posiada opcje 'Search&Repleace' to
bardzo dobrze... pozmieniaj teraz tak:

wszystkie 'ds:' na nic
wszystkie 'j_' na nic
wszystkie '[ebp+hWin]' na 'hWin'
wszystkie '; ...' na nic
wszystkie '[ebp+uMsg] na 'uMsg'
wszystkie '[ebp+wParam]' na 'wParam'
wszystkie '[ebp+arg_0]' na 'arg_0'
wszystkie 'shot' na nic

- wykasuj teraz wszystkie smieci a'la:

; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
; Attributes: bp-based frame

- wykasuj wszystkie rzeczy a'la:

hWin = dword ptr 8
uMsg = dword ptr 0Ch
wParam = dword ptr 10h

(sa po kazdym poczatku procedury).

Teraz pozostaje nam juz tylko przystosowac kod crackmesa do schematu. Nie bede rozpisywal
sie na ten temat, bo to juz sa zagadnienia czysto win32asm. Popatrz na wyniki mojej pracy:

*************************** CUT THERE ***************************

.386
.model flat, stdcall
option casemap :none ; case sensitive


include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\shell32.inc
includelib \masm32\lib\shell32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib


DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
wyswietl_messageboxa PROTO :DWORD

.data
dlgname db "OKNO_1",0
hInstance dd 0
uchwyt_ikony dd 0
buffor2 dd 0
buffor5 dd 0
buffor6 dd 0
buffor4 dd 0
buffor3 db 0 ;
buffor8 dd 0
buffor7 dd 0
aMailtoJube@pol db 'mailto:jube@poland.com?subject=***Crackme 4.0***',0
aAbout db 'About',0
aCrackme4_0ByJu db 'Crackme 4.0 by Jube',0Dh,0Ah
db 'E-mail: jube@poland.com',0Dh,0Ah
db 0Dh,0Ah
db '----------------------------------',0Dh,0Ah
db 'INFO',0Dh,0Ah
db 'You must enter correct key',0Dh,0Ah
db 'NO PATCH ALLOWED',0Dh,0Ah
db '----------------------------------',0Dh,0Ah
db 0Dh,0Ah
db 'Greets : Plastek _Masta_',0Dh,0Ah
db ' _HaK_ Iczelion',0Dh,0Ah
db 0Dh,0Ah
db '7TeaM - Polish Crackers',0Dh,0Ah
db 'http://www.7team.z.pl',0
aError db 'Error',0
aInformation db 'Information',0
aThisKeyIsnTCor db 'This key isn',27h,'t correct,',0Dh,0Ah
db 'but don',27h,'t give up ! :-)',0
aThatSItSendMeY db 'That',27h,'s it! Send me your solution !',0Dh,0Ah
db 'kEEP cRACKING :)',0
jakis_buffor dd 0
bajt_zerowy dd 0
linia_komend dd 0
buffor_tekstu db 0 ;

.code

start:

invoke GetModuleHandle, NULL
mov hInstance, eax
invoke DialogBoxParam,hInstance,ADDR dlgname,0,ADDR DlgProc,0
push 0
invoke ExitProcess,eax

wyswietl_messageboxa proc tekst :DWORD

push 40h
push offset aInformation ; "Information"
push tekst
push bajt_zerowy
call MessageBoxA
leave
retn 4
wyswietl_messageboxa endp

; #########################################################################

DlgProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD

.if uMsg == WM_INITDIALOG

push 3E8h
push hInstance
call LoadIconA
mov uchwyt_ikony, eax
push eax
push 3E8h
push 80h
push hWin
call SendMessageA

.elseif uMsg == WM_COMMAND

.if wParam == 0Ah

push 1
push hWin
call GetDlgItem
mov jakis_buffor, eax
push 1
push jakis_buffor
call EnableWindow
push 20h
push offset aAbout ; "About"
push offset aCrackme4_0ByJu ; "Crackme 4.0 by Jube\r\nE-mail: jube@polan"...
push hWin
call MessageBoxA

.elseif wParam == 01

push 69h
push hWin
call GetDlgItem
mov jakis_buffor, eax
push eax
call GetWindowTextLengthA
add eax, 0FFFFFFF4h
jnz bad_boy
push 64h
push offset buffor_tekstu
push jakis_buffor
call GetWindowTextA
cmp eax, 0
jz bad_boy
mov edi, offset buffor_tekstu
mov eax, [edi]
rol eax, 6
xor eax, 0DEADDEADh
add eax, 30003C5Bh
jnz bad_boy
add edi, 4
mov eax, [edi]
ror eax, 7
xor eax, 88888888h
add eax, 0D1ADAD9Eh
jnz bad_boy
add edi, 4
mov eax, [edi]
rol eax, 5
xor eax, 12344321h
add eax, 0C9C5F07Bh
jnz bad_boy
push offset aThatSItSendMeY ; "That's it! Send me your solution !\r\nkEE"...
call wyswietl_messageboxa
pop esi
pop edi
pop ebx
leave
retn 0Ch
bad_boy:
push offset aThisKeyIsnTCor ; "This key isn't correct,\r\nbut don't give"...
call wyswietl_messageboxa


.elseif wParam == 02

push 1
push 0
push 0
push offset aMailtoJube@pol ; "mailto:jube@poland.com?subject=***Crack"...
push 0
push hWin
call ShellExecuteA

.endif

.elseif uMsg == WM_DESTROY
push 0
call PostQuitMessage

.elseif uMsg == WM_CLOSE
push 0
call PostQuitMessage

.endif

xor eax, eax
ret


DlgProc endp

end start

*************************** CUT THERE ***************************

Wywalilem procedure odpowiedzialna za centrowanie okna, syf tylko robi a zajmuje miejce ;-)

Teraz jeszcze tylko poprawka w pliku *.rc, tzn. trzeba zamienic pierwsza linijke na
taka ktora bedzie pasowala pod MASM, moj plik *.rc jest taki:

*************************** CUT THERE ***************************

#include

OKNO_1 DIALOG 36,59,137,69
STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE | DS_ABSALIGN | DS_MODALFRAME
CAPTION "Crackme 4.0 by Jube^7TeaM"
FONT 8, "Tahoma"
BEGIN
EDITTEXT 105,3,15,130,12,WS_BORDER
DEFPUSHBUTTON "OK",1,3,30,49,16,WS_BORDER | WS_DISABLED
PUSHBUTTON "About",10,53,30,49,16,WS_BORDER
PUSHBUTTON "E-Mail",2,103,30,30,16,WS_BORDER
CTEXT "Enter here your key :",-1,3,3,130,8,WS_GROUP
CTEXT "Powered by TASM32",-1,3,49,130,9,WS_GROUP | WS_DISABLED
CTEXT "--- www.crackmes.prv.pl ---",-1,3,60,130,8,WS_GROUP
END

*************************** CUT THERE ***************************


Teraz nam juz tylko pozostaje stworzyc jakis plik, co by to wszystko skompilowal
(ja uzylem zwyklego pliku *.bat). Dostosuj go do nazw jakie uzyles.

*************************** CUT THERE ***************************

\masm32\bin\rc /v jube4.rc
\masm32\bin\ml /c /coff /Cp jube4.asm
\MASM32\BIN\Link.exe /SUBSYSTEM:WINDOWS /LIBPATH:\masm32\lib jube4.obj jube4.res

*************************** CUT THERE ***************************

Teraz pozostaje tylko wszystko w jednym katalogu umiescic, uruchomic plik *.bat
i jak masz dobrze zainstalowanego MASM'a to ogladac skompilowanego proga ;-)


------------------------
------------============== 3.0 Co jeszcze moze IDA? ==============------------
------------------------

Postaram przedstawic wam jeszcze pare dodatkowych funkcji IDY. Oto one, wypunktowane
azeby sie latwiej czytalo:

a) W menu 'View' mamy dostep do funkcji wyswietlajacych konkretne typy danych. I tak
np. opcja 'Names' wyswietla nam spis wszystkich nazw uzywanych przez program (zarowno
zmiennych jak i przedefiniowanych funkcji). Opcja 'Problems' wyswietla problemy jakie
IDA znalazla analizujac kod programu. Z tego menu mamy tez dostep do procedur 'Hide'
i 'UnHide', ktore umozlwiaja nam chowanie wybracnych procedur, tak azeby kod stal
sie bardziej czytelny (sktory klawiaturowe do nich to '+' i '-').

b) mozesz latwo usunac informacje o sekcjach, wystarczy ze najedziesz na kazda z nich
po koleji, klikniesz prawym przyciskiem myszy i wybierzesz pierwsza opcje od gory.
Teraz wyczysc okno ktore ci sie pokaze, i bedzie po problemie.

c) uzywajac przycisku 'F3' mozesz otworzyc dodatkowe okno przegladanego kodu. Czasami
jest to bardzo pomocne.

d) gdy IDA zaladuje wstepnie kod i zacznie go przerabiac mozesz w kazdej chwili zatzrymac
to sprawdzanie klikajac na zole kolko w prawym gornym rogu ekranu. Gdy klinkiesz na nie
jeszcze raz IDA bedzie kontynuowala sprawdzanie.

e) IDA posiada bardzo rozbudowany mechanizm skryptow. Kazdy z nich znajduje sie w pliku
z roszerzeniem *.idc. Skrypty te uruchamia sie z menu 'File -> IDC file' a nastepnie
wybierajac odpowiedni skrypt. Obsluga ich jest banalna. Pisane sa one w czyms na wzor
c, wiec wiekszosc nie bedzie miala wiekszych problemow.

d) IDA posiada bardo ciekawa udogodnosc, mianowicie mozemy zaznaczyc odpowiedni linijke
wywolac funkcje z menu, wpisac jakas charakterystyczna nazwe, a potem bez problemu
przemieszczac sie pomiedzy nimi. Wystarczy tylko kliknac na linie uzyc hotkey'a 'N'
i wpisac odpowiednia nazwe, a nastepnie z menu 'View' wybrac opcje 'Names' by uzyskac
latwy dostep do punktow ;-)

e) programy patchujemy w IDA za pomoc opcji z menu 'Edit -> Patch program'. Mamy do wyboru
dwa rodzaje patchowania. Pamietaj jednak azeby potem wygenerowac plik exe, inaczej zmiany
beda tylko na papierze!

------------------------
------------============== 4.0 To juz jest koniec! ==============------------
------------------------

Tak jak w tej piosence ;-) Mam nadzieje, ze tekst ten cos ci pomogl, moze przekonal
cie do uzywania IDY. Pisany pod newbies, z malo znajomoscia win32asm'a, no ale coz.
Kazdy moze znajdzie tutaj jakies ciekawe infa czy cokolwiek tam chce. Cudow jednak
nie oczekujcie ;-) Bo moja zabawa z IDA dopiero zaczyna sie na dobre ;-)
Osoba ktore pragna poszerzyc swoje informacje o IDA polecam tekst znajdujacy sie na
www.under2001.prv.pl w dziale 'down->books' opisujacy mozliwosci i komendy IDY!

No to juz ostatnie z 41528 znakow... ;-)

Tepe^UnderPl
Bytom 25.07.2001
under@under2001.prv.pl
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • qualintaka.pev.pl
  •