LEKCJA_3.TXT

(15 KB) Pobierz
        -= All fucking rights reserved for Andy & UnderPL group =-

Lekcja III - "W32Dasm - konfiguracja i uzytkowanie"           Stargard 9.VII.2oo1

  a) konfiguracja
  b) disassemblerowanie przykladowego programu
   - omowienie tabeli importow i exportow
   - podzial programu na sekcje i ich wlasnosci
   - zasoby plikow
   - skoki warunkowe, porownania
  c) problemy z w32dasm
   - programy spakowane
   - tricki anty-debug

dodatek : opis debugera w Wdasm
          opis patchniecia crackmesa przy uzyciu Wdasm'a i Hiew'a

autor : Andy
przykladowy program : Crackme2 by Wily
skad : www.crackmes.prv.pl
potrzebne narzedzia : Wdasm,Hiew - www.under2001.prv.pl

Czesc
W tej lekcji zajmiemy sie programem, ktory na pewno polubicie, od niego
zaczynali chyba wszyscy wielcy tego swiata ;) Jest prosty w obsludze,
w miare szybki, troche niedoskonaly ale na poczatek w sam raz, ale do rzeczy!
a) konfiguracja
Wdis praktycznie nie posiada zadnych opcji, ale omowie tu za to podstawowe menu:

Disassembler:
Open file to dissasemble - otworzenie pliku do disasemblacji
Save disassembly ... - zapisanie zdisasemblowanych plikow
Print Preview - podglad wydruku
Print - drukowanie
Print Setup - ustawienia drukowania
Copy selected line - kopiuje zaznaczona linie do schowka
Font - wybieramy sobie czcionke
Clear All Trade Marks - usuwa wszystkie zaznaczenia
Disassembler Options - wlasnie te cale opcje (ustaw wszystkie na enable)

Project:
Open Project File - otwiera wczesniej zapisany zdisasemblowany plik

Debug:
patrz dodatek I

Search:
Find Text - szukanie tekstu
Find Next - szukanie nastepnego miejsca gdzie wystepuje zadane wyrazenie

Goto:
Goto Code Start - idzie na poczatek kodu zdisasemblowanego programu
Goto Program Entry Point - idzie na poczatek wlasciwy programu, tam gdzie
                            program zaczyna sie wykonywac
Goto Page - idzie na zadana strone, Wdasm dzieli sobie listing programu na
            strony, czyli kolejne wcisniecia Page Down/Up
Goto Code Location - idzie pod konkretny Virtual Address, czyli typu 40000

Execute:
Execute Jump - wykonuje skok (strzalka w prawo)
Return From Last Jump - wraca do miejsca skad nastapil skok, aby to uczynic,
                        nalezy najechac linia na zaznaczony adres (st. w prawo)
Execute Call - wykonuje calla (tak jak skok)
Return From Last Call - wraca ... ( tak jak skok)

Functions:
Imports - lista importow
Exports - lista eksportow

HexData:
Hex Display of Data ... - wyswietla heksalnie zadany segment
Hex Display of Code ... - wyswietla heksalnie zadany kawalek kodu (ten ktory
                          obecnie widzimy w postaci zdisasemblowanej)

Refs:
Menu References - odniesienia do menu zdisasemblowanego programu
Dialog References - odniesienia do okienek
String Data References - odniesienia do stringow

Help: - bez komentarza

b) disassemblerowanie przykladowego programu
Dopra kiedy juz znamy Menu, zabieramy sie za zdisasemblowanie naszego programu.
Zawsze przed disasemblacja musimy sie upewnic ze program nie jest niczym
spakowany. W tym celu ladujemy go do Loadera, lub sprawdzamy jakims programem
np. File Info. Nasz program nie jest akuratnie spakowany, wiec ladujemy go do
Wdasm'a. Disassembler/Open File ... I oto po kliku chwilach Twoim oczom ukazal
sie listing naszego programu.

- omowienie tabeli importow i exportow
W menu Functions mamy Import i Export. Wybierzmy najpierw import, export nie ma.
Mamy tu kolejno : biblioteka:nazwa_funkcji_api. Poszukajmy teras jakiejs funckji
odpowiadajacej za pobranie tekstu z okienka, o jest USER32.GetDlgItemTextA.
Kilknijmy w nia dwa razy myszka. Wdasm przeniosl nas w miejsce gdzie funckcja ta
jest wywolywana przez program. Do tego wlasnie sluzy w Wdasmie tabela importow,
i eksportow.

- podzial programu na sekcje i ich wlasnosci
Przechadzac z powrotem na sama gore, ujrzymy cos takiego :

Number of Objects = 0005 (dec), Imagebase = 00400000h

Object01: CODE     RVA: 00001000 Offset: 00000600 Size: 00000200 Flags: 60000020
Object02: DATA     RVA: 00002000 Offset: 00000800 Size: 00000400 Flags: C0000040
Object03: .idata   RVA: 00003000 Offset: 00000C00 Size: 00000200 Flags: C0000040
Object04: .reloc   RVA: 00004000 Offset: 00000E00 Size: 00000200 Flags: 50000040
Object05: .rsrc    RVA: 00005000 Offset: 00001000 Size: 00000C00 Flags: 50000040

Sa to tzw sekcje, program podzielony jest na kilka sekcji w ktorych znajduja sie
rozne informacje, np. w sekcji .rsrc czyli resources, znajduja sie wszystkie
okienka, menu, grafika, muzyka oraz inne zasoby. Teras omowie po kolei co tam
jest. A wiec od patrzac od lewej:

ObjectXX: - numer sekcji
np. CODE - nazwa sekcji
RVA: - virtualny adres gdzie zaczyna sie sekcja
Offset: - rzeczywisty offset w pliku, gdzie rozpoczyna sie sekcja
Size: - rozmiar sekcji
Flags: - tzw charakterystyka sekcji, nie bende sie tu rozpisywal na ten temat
         dowiesz sie wiecej czytajac lekcje o formacie PE

-zasoby plikow
opisane troszku wyzej do ich tworzenia, jak i edycji sluza ResEditory np.
eXescope

- skoki warunkowe, porownania
To te najwazniejsze, bo troche ich jest ...

Hex:          Asm:      Znaczenie:              Co robi:
75 or 0F85    jne       jump if not equal       - skocz jesli nie takie samo
74 or 0F84    je        jump if equal           - skocz jesli takie samo
EB            jmp       jump directly to        - skok bezwzgledny
90            nop       no operation            - nic nie robi
77 or 0F87    ja        jump if above           - skocz jesli wieksze
0F86          jna       jump if not above       - skocz jesli nie wieksze
0F83          jae       jump if above or equal  - skocz jesli rowne lub wieksze
0F82          jnae      jump if not above or equal- jesli nie : wieksze/rowne
0F82          jb        jump if below           - skocz jesli mniejsze
0F83          jnb       jump if not below       - skocz jesli nie mniejsze
0F86          jbe       jump if below or equal - skocz jesli mniejsze/takie samo
0F87          jnbe      jump if not below or equal - jesli nie : mniejsze/rowne
0F8F          jg        jump if greater         - skocz jesli wieksze
0F8E          jng       jump if not greater     - skocz jesli nie wieksze
0F8D          jge       jump if greater or equal - jesli wieksze lub rowne
0F8C          jnge      jump if not greater or equal - jesli nie : wieksze/rowne
0F8C          jl        jump if less            - skocz jesli mniejsze
0F8D          jnl       jump if not less        - skocz jesli nie mniejsze
0F8E          jle       jump if less or equal   - skocz jesli mniejsze lub rowne
0F8F          jnle      jump if not less or equal - jesli nie mniejsze lub rowne
C3            ret       return                  - powrot z calla
              cmp       compare                 - porownuje dwa rejestry
              test      test                    - tak czy nie ;)

c) Problemy z Wdasm

>Widze krzaczki po zdiasemblowaniu programu.
  Zmien czcionke
>Program nie disasembluje sie.
  Sprawdz czy program nie jest spakowany, lub zmien charakterystyke sekcji
  na E0000080
>Wdasm wiesza sie podczas disasemblacji
  Sprobuj wskazywac na program w katalogu gdzie sie on zainstalowal, czasami
  Wdasm pobiera jakies framenty z inncyh plikow
>W SDR (String Data Reference) nie ma zadnych konkretnych stringow
 Program zapewne jest napisany w Delphi, uzyj DeDe 2.xx
>W SDR sa jakies krzaczki, program byc moze posiada zakodowane stringi, ktore
 nim zostana wyswietlone sa rozkodowyane w pamieci (np. WinCmd). Kliknij
na nie dwukrotnie i staraj sie przsledzic ich droge zanim trafia na stos.
>Kiedy otwieram crackowany program, Wdasm mi sie zamyka
 Program ma wbudowana sztuczke anty-wdis, poszukaj w w32dsm89.exe, napisu z
 paska tytulowego Wdasm'a i zmien go choc troche. Wdasm przestanie sie zamykac.

- programy spakowane
No wlasnie one sie nie chca zdisasemblowac. Najpierw trzeba je rozpakowac
np. Procdumpem, a potem dopiero wrzucic do Wdasm'a. W niektorych przypadkach
program zrzucony z pamieci, nie bedzie sie chcial disasemblowac, albo bedzie
sie blednie disasemblowal. Wtedy sprawdz czy zgadzaja sie wszystkie parametry
pliku PE : entry point, tabela importow, itp. Czasami pomaga zmienienie
charakterystyki sekcji, przewaznie w przypadku programow spakowanych AsPackiem.

- tricki anty-debug

1) Szukanie w pamieci napisu z paska tytulowego Wdasm'a.
2) Zmienione charakterystyki sekcji (AsPack)
3) Proba disasemblacji takiego kodu:
        400000 jmp 401000
        401000 jmp 400000
   zapetli Wdasm'a i spowoduje jego wysypanie sie. Ten fragment mozna zrobic
   juz po kompilacji/konsolidacji programu i zaraz za EP, hexeditem zmienic
   istniejace tam nopy (nie sa one nigdy wykonywane).
Inne rozwiazania mozecie znalesc w faq Tepe^UnderPL.

Dodatek I

Debug :
Load Process                    - laduj program
Attach to an Active Process     - dolacz do aktywnego procesu (przy dll'kach)
BrakPoint Toggle                - przelacza sie do debugera gdy ten dojdzie do
                                  podswietlonej lini
Run Process                     - uruchamia debugowany program
Pause Process                   - wstrzymuje jego prace
Goto Current Eip                - idzie do aktualnego EIP
Single Step Thru                - pojedyncze kroki po callach & powtarzajacych
                                  sie funkacjacch
Single Step Into                - pojedyncze kroki w callach i powtarzjacych sie
                                  funkcjach
Auto Single Step Thru           - to samo co przy single tyle ze auto
Auto Single Step Into           - to samo co przy single tyle ze auto
Terminate Process               - wylacz debugowany program
Debugger Options - opcje debugera, zaznacz pierwsze 3, reszte w zaleznosci co
                   nam jest poptrzebne w ko...
Zgłoś jeśli naruszono regulamin