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 9
 Lekcja 9 - "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 <winres.h>

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 masm32includewindows.inc
      include masm32includeuser32.inc
      include masm32includekernel32.inc

      includelib masm32libuser32.lib
      includelib masm32libkernel32.lib


        dlgProc PROTO WORD,: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   WORD,
             uMsg   WORD,
             wParam WORD,
             lParam WORD

      .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 masm32includewindows.inc
      include masm32includeuser32.inc
      include masm32includekernel32.inc
      include masm32includeshell32.inc
      includelib masm32libshell32.lib
      includelib masm32libuser32.lib
      includelib masm32libkernel32.lib


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

    .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   WORD

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

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

DlgProc proc hWin   WORD,
             uMsg   WORD,
             wParam WORD,
             lParam WORD

      .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 JubernE-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 !rnkEE"...
                call    wyswietl_messageboxa
                pop     esi
                pop     edi
                pop     ebx
                leave
                retn    0Ch
bad_boy:
                push    offset aThisKeyIsnTCor ; "This key isn't correct,rnbut 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 <c:masm32includeresource.h>

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 ***************************

masm32binrc /v jube4.rc
masm32binml /c /coff /Cp jube4.asm
MASM32BINLink.exe /SUBSYSTEM:WINDOWS /LIBPATH:masm32lib 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!

Teraz 13138 odwiedzający (28791 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