-= 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...
Daroo19