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


-= 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 konkretnym wypadku

Oki, teras gdy juz choc troche znasz debugera, poprubujmy cos debugowac w nim.
Wybieramy : Load process, jako ze nie potrzebujemy przy uruchamianiu zadnych
przelacznikow itp. wciskamy Enter, w okienku, ktore nam wyskoczylo po wybraniu
Load Process. Teras F9 (Run program). Wpisujemy dowolne wartosci w crackmesie i
wciskamy sprawdz, teras gdy wyskoczylo okienko o blednych dancyh wciskamy :
Step Into (F7), a nastepnie Terminate. Teraz gdy z powrotem wrocilismy do Wdasma
wciskamy strzalke w gore pare razy, o co to? Wywolanie okienka, z infem ze zly
serial a wczesniej string : "To jest zly serial!". Oki, teras idziemy dalej w
gore. Mamy cos takiego, a co to? - spytasz ano sa to adresy spod ktorych
nastapilo wywolanie naszego okienka, wiec zobaczmy co pod nimi jest. Jako ze sa
to tylko dwa standardowe sprawdzenia, czy cokolwiek wpisalismy, zaglebmy sie
w call'a spod adresu 4010B2.

* Reference To: USER32.GetDlgItemTextA, Ord:0000h ->pobieranie tekstu z okienka
|
:004010A9 E8B4000000 Call 00401162
:004010AE 85C0 test eax, eax -> sprawdzenie czy cos wpisales
:004010B0 7405 je 004010B7 -> i skok jesli nie
:004010B2 E81A000000 call 004010D1 -> procedura sprawdzajaca

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00401096(C), :004010B0(C)
|
:004010B7 6A00 push 00000000

* Possible StringData Ref from Data Obj ->"Tym razem nie pojdzie ci tak latwo "
->":)"
|
:004010B9 6880224000 push 00402280

Teraz wejdzmy w ta proedure sprawdzajaca (strzalka w prawo, gdy mamy
podstwietlona ta linie). Na poczatku gdy jeszcze nie bedziesz potrafil
analizowac kodu, probuj sie oprzec na samych skokach, patrzac dokad one
prowadza, aby nie zmieniac na pale wszystkich. Okie teras mamy cos takiego :

* Referenced by a CALL at Address:
|:004010B2
|
:004010D1 B847224000 mov eax, 00402247
:004010D6 BBD1224000 mov ebx, 004022D1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004010F0(U)
|
:004010DB 8A08 mov cl, byte ptr [eax]
:004010DD 8A13 mov dl, byte ptr [ebx]
:004010DF 80F900 cmp cl, 00

-----------------------------------------------------------------------------
:004010E2 742E je 00401112 -> zobacz dokad on prowadzi ;)
-----------------------------------------------------------------------------
tu jest linia barowa

:004010E4 32CA xor cl, dl
:004010E6 80E930 sub cl, 30
:004010E9 80F900 cmp cl, 00
:004010EC 7504 jne 004010F2
:004010EE 40 inc eax
:004010EF 43 inc ebx
:004010F0 EBE9 jmp 004010DB

Oki mamy swoj wymarzony skok, oznacza on skocz jesli takie samo, a my przeciez
nie znamy prawdziwych danych, wiec musimy zmienic na: skocz jesli nie takie samo
Teraz spojrzyj na linie, ta ktora jest na samym dole, zobaczysz cos takiego :
Line:214 Pg 5 of 10 Code Data@:004010E2 @Offset 000006E2 in File: cmWily.exe
Co to znaczy? Ze: jestes w 214 lini, na 5 stronie pod adresem 4010E2, a ofsecie
rzeczywistym 6E2 w pliku cmWily.exe . Znaczy to ze chcac zmienic ten skok w
jakims HexEditorze musisz sobie spisac adres, lub offset. Ok mamy 6E2.
Teraz odpalamy Hiew, ladujemy nasz plik, nastepnie F4/Decode, potem F5(idz do)
i teraz w zaleznosci co spisales wpisujesz: jesli virtualny adres to porzedzasz
go kropka, jezeli fizyczny, to bez kropki. Gdy jusz jestes w zadanym miejscu,
wciskasz F3/F2 i zmieniasz sobie je na jne, lub tylko F3 i 74 na 75. Teras gdy
odpalasz nasze crackme, wpisujesz dowolne dane i crackme jest zarejestrowane ;)
Easy? Oki, teras pare porad co do Wdis:

1) W SDR, aby nie szukac w gaszczu stringow zacznij wpisywac "I tu twoj string"
2) Gdy nie ma jakiegos stringa w SDR (progsy napisane w Delphi), sprobuj
poszukac w hiew: ladujesz plik, F7, wklepujesz stringa, a gdy go znajdzie
wciskasz F6 i teras przepisujesz adres z lewej strony do Wdisa i analizujesz
sobie odwolanie i kod
3) Jezeli nie masz szybkiego kompa to daj sobie spokuj z duzymi execkami
4) Jezeli disasemblujesz proga napisanego w VB, w SDR nie bedzie zadnych
stringow, aby je widziec sciagnij sobie ze stronki: www.under2001.prv.pl
poprawke do Wdasma, lub zrob to samemu, zmieniajac sobie w w32dsm89.exe
pod offsetem 16B6C - 178 na 152 oraz pod offsetem 16B6Dh - 10 na 244.
5) Nawet jezeli nie rozumiesz kodu, a dojdziesz do miejsca gdzie nastepuje
skok zobacz czy nie ma nad nim porownania w stylu cmp eax,edx, jezeli jest
zobacz w debugerze wartosc rejestrow i masz seriala.
6) Nie patchuj skoku tuz nad okienkiem, przewaznie odpowiada tylko za wyrzucenie
okienka o dobrym, zlym serialu, wejdz w calla nad stringiem o zlym serialu.
7) Wdis jest dobry do lamania programow, wyrzucajacych durne okienka, wystarczy
ze poczekasz asz program wyrzuci okienko, Step Into, Terminate i masz miejsce
gdzie zostalo one wyrzucone, wtedy nopuj, lub szukaj odwolania.
8) Gdy zaznaczysz w opcjach debugera wiecej niz 3 gorne pola, bedziesz zapewne
musial wiecej niz raz nacisnac Run
9) Gdy nie ma czegos w SDR, i w Hiew, sprobuj poszukac tego stringa jako tekstu
w Wdis i w Hiew jako wide : litera,lub cyfra potem 00 i znowu litera itp
10) PAMIETAJ WDIS JEST DOBRY DOPOKI NIE BEDZIESZ ROZUMIAL KODU, GDY GO ZACZNIESZ
ROZUMIEC ZACZNIJ STOSOWAC SOFT-ICE, LUB IDE, SA ONE O LEPSZE !!!

To chyba wsio i tak jest pare kilo tekstu. Jezeli czegos nie rozumiesz, pisz :
andy@pac.pl. Lecz nie oczekuj odpowiedzi jezeli zadasz jakies durne pytanie.

Greetz to : trg Tszycha Avis Tepe^ UnderPL and other Polish cracking groups ...

... done by Andy^UnderPL'2oo1
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • qualintaka.pev.pl
  •