Kodowanie w Assemblerze dla crackerow.pdf

(5790 KB) Pobierz
35144390 UNPDF
B o o k s fro m H ell
S a t a ni cu m P a n de m oniu m
Win32 A s s e m bler C o din g for C ra c k er s
by G o ppit
Tłu m a czenie C h ai m e A s e m blo wi c
Wydawnictwo V U LT U R E E N T E R P R I S E S
35144390.003.png 35144390.004.png
Kodowanie assemblerowe Win32 dla Crackerów
Słowa kluczowe:
Kodowanie, ASM, Win32, GUI
Poziom:
Początkujący do Średnio zaawansowanych
Testowany OS:
XP Pro SP2
Autor:
Goppit – 01/04/2006 – goppit@hotmail.com
Tłumaczenie:
Chaime Assemblowic
Używane narzędzia:
MASM32 v9.0
lib2inc v1.11
WinAsm Studio Full v5.1.1.0
WinAsm v5.1.3.0 Update
Plik win32.hlp
OllyDbg v1.10
RGN Generator v1.01
Table Extractor v1.34
uFMOD
Dodatkowo:
Platforma SDK MS
H2 Viewer v1.3.5.0
WinAsm MSDN h2help add-in
Winspector v1.0b build 35
SignFinder by Asterix
Wprowadzenie
Cele tego tekstu
Większość, (jeśli nie wszyscy) najlepsi hackerzy, crackerzy i zwolennicy reverse engineerzy są również programistami.
Jest prawie niemożliwe nauczyć się dobrze RCE bez wiedzy programistycznej a wiele starszych plików tekstowych o
crackingu przekonuje chętnych - „najpierw naucz się assemblera, potem spróbuj to przeczytać”. Jest to prawda gdyż
pakery i ochrona plików wykonywalnych używają niezwykle złożonych i rozmaitych metod dla zabezpieczenia
rozpakowywania, debuggowania i rebuildingu. Powoduje to ,że grupy crackerskie kodują własne narzędzia zamiast
wykorzystać debugger, disassembler i narzędzie takie jak ImpREC. Powoduje to również ,że loadery stają się coraz
bardziej popularne, fakt odnotowany przez serię Cracking for Loaders grupy ARTeam. Nie jest to jednak łatwe do
zrozumienia dla początkujących bez poważnej wiedzy o kodowaniu. Napisałem ten tekst aby wypełnić lukę między
kompletnym początkującym a zaawansowanymi tekstami o loaderach , tracerach itd. Podobnie, gdy mogą
funkcjonować aplikacje konsolowe i narzędzia, pokażę jak łatwo tworzyć aplikacje GUI w assemblerze.
W duchu programowania assemblerowego i wspólnoty reversingu użyłem ponownie i zaadaptowałem kod z wielu
źródeł o jakich wiedziałem.
Wymagane narzędzia
Są cztery główne wymagane narzędzia:
1.Assembler
2.IDE lub Integrated Development Enviroment
3.Debugger
4.Platforma źródłowa i jego Aplication Programming Interface (Win32 API)
Wybór assemblera i IDE jest osobistym wyborem. Pakiet MASM32 może być również gdyż jest użyteczny przy
kodowaniu aplikacji graficznych dla Windows i jest o wiele więcej dostępnego kodu źródłowego korzystającego ze
składni MASM niż dla innych assemblerów. Moim ulubionym jest WinAsm Studio IDE ponieważ ma kilka dobrych
funkcji i jest kompaktowy i został zaprojektowany wyłącznie dla MASM32 bez żadnego rozdęcia na potrzeby obsługi
wielu assemblerów. Struktura katalogów przez niego tworzona dla nowego projektu jest również dużo prostsza niż na
przykład w RadASM. Dodatek 1 zawiera szczegóły instalacyjne i ustawienia dla MASM32 i WinAsm plus kilka
sposobów na ich spersonalizowanie. Chociaż wybór debuggera jest również osobisty namawiał będę wszystkich
początkujących do rozpoczęcia z Olly ponieważ jest bardzo przyjazny w porównaniu z SoftIce i jest do niego
dostępnych wiele pomocnych dodatków. Końcowym powyższym wymaganiem jest plik Win32.hlp albo przez nowsze
biblioteki MSDN dostępną online jako część platformy SDK dostępną do darmowego ściągnięcia z MS. Informacje
jakich się nauczysz z tego tekstu będzie składała się z dwóch głównych kategorii:
1.Składnia MASM32 – jak pisać poprawne instrukcje dla assemblera
2.Architektury Windows i API – wszystko co potrzebne dla reversera
Nowe koncepcje w tych grupach są podkreślone w nagłówku każdego rozdziału. Cały kod używany w tym dokumencie
jest zawarty w formacie tekstowym w sekcji Kodu źródłowego tego pliku, co pozwala łatwo wkleić go do WinAsm lub
edytora tekstu jaki wybrałeś. Zrzuty ekranowe z edytora kodu WinAsm są używane w całym tekście jako podświetlona
składnia czyniąc go bardziej czytelnym. Końcowa notka o kodzie, ja koduję dla WinXP i bez wysiłku mam wsteczną
kompatybilność z Winn9x. Niektóre podprogramy nie będą działać na starszych wersjach Windows.
Budowanie pliku wykonywalnego
Krótko wyjaśnię proces budowania pliku wykonywalnego. „Assembler” w rzeczywistości składa się z pakietu kilku
komponentów opartych o konsolę wliczając w to sam assembler, linker, kompilator zasobów i inne. Główną zaletą
zastosowania IDE jest to ,że automatycznie doprowadza poprawne instrukcje wiersza poleceń (które mogą być złożone)
do tych komponentów i pozwala ci zobaczyć wynik w środowisku graficznym. Instrukcje języka assemblera są
wpisywane do prostego pliku tekstowego z rozszerzeniem .asm. Assembler tłumaczy je w kodzie źródłowym na kod
maszynowy rozumiany przez CPU i konwertuje wartości numeryczne z dziesiętnych na binarne. Wynikiem jest plik
obiektowy (.obj) który zawiera instrukcje maszynowe, dane i informacje koniecznie do umieszczenia właściwie
instrukcji w pamięci kiedy aplikacja jest wykonywana. Linker łączy pliki obiektowe i pliki zasobów do stworzenia
końcowego pliku wykonywalnego. Linker przeszukuje pliki obiektowe aby znaleźć funkcje zewnętrzne używane i
łączone w importowanych bibliotekach dla tych funkcji. Plik wynikowy może teraz zostać wykonany przez system
operacyjny, Kiedy to się stanie, zostaje odwzorowane w pamięci przez loadera Windows wszystkie DLL'e których
potrzebuje, również są ładowane, i instrukcje przy ich punktach wejścia są wywoływane.
Zasoby
Zasoby są danymi przechowywanymi jako ikony, ciągli tablicowe, menu, okna dialogowe, bitmap, danych
definiowanych przez użytkownika, itp. Zasoby dal programów najpierw są definiowane w skrypcie pliku (plik .rc). Jest
to prosty plik tekstowy , który może być napisany albo ręcznie albo przez WinAsm Visual Resource Editor. Zasoby są
potem kompilowane przez kompilator zasobów na plik zasobów binarnych (.res) ,który jest łączony w plik
wykonywalny przez linker. Zasoby są dostępne przez unikalna liczbę ID , która jest definiowana w skrypcie zasobów .
W kodzie źródłowym asm te same ID są używane przy dostępie do zasobów.
Podstawowy szkielet programu assemblerowego
Nowe pojęcia:
Użycie WinAsm i MASM32
Dyrektywy assemblera
35144390.005.png
Użycie Invoke z funkcjami Win32 API
Nowe funkcje API:
ExitProcess
Użycie WinAsm
Poniższy zrzut ekranowy ilustruje część interfejsu WinAsm. Kod źródłowy wpisujesz w panelu edytora kodu (po lewej)
Panel explorera (po prawej) pokazuje plik jakie są częścią bieżącego projektu, wliczając w to kod assemblera, pliki
dołączane, zasobu itp. Przycisk „Go All” (wskazywany przez wskaźnik myszki na zrzucie ekranowym) będzie składał i
linkował kod źródłowy a potem wykonuje plik wynikowy. Polecenia przekazywane do assemblera i linkera razem z
wynikiem są wyświetlone w panelu wyjściowym (poniżej)
7 linii powyższego kodu przedstawia najmniejszy program ,który będzie assemblowanym linkowany i wykonywany.
Składa się z pojedynczej instrukcji RET w punkcie wejścia, która wykonując się natychmiast zwraca sterowanie do
Windows. Aby uczynić użytecznym ten szkielet przy budowie rzeczywistych programów zastąpimy RET funkcją
ExitProcess – standard API dla wyjścia z aplikacji. Aby zacząć kodowanie, otwórz WinAsm i kliknij na lewy przycisk
na pasku narzędziowym .Zwróć uwagę ,że mam zablokowany ostatni menadżer projektu przy starcie i używam New
Project Wizard Add-In które jest największą poprawę istniejącej funkcjonalności. Jeśli ustawisz system w ten sam
sposobów, powinieneś zobaczyć coś takiego:
35144390.006.png
Kliknij Next a następnie Finish. Stworzony zostanie standardowy projekt EXE, który ustawia opcje assemblera i linkera
dla stworzenia wykonywalnego win32GUI. WinAsm pyta się czy zapisać plik nowego projektu i nowy plik ASM , po
czym zobaczysz pusty ekran edytora kodu. Teraz wklej skeleton.asm z sekcji Kodu źródłowego tego pliku do okna
edytora kodu. Kliknij „Go All” jeśli proszony jesteś o zachowanie projektu i pliku asm do odpowiedniej lokacji przed
zbudowaniem i wykonaniem pliku. Twój kod powinien wyglądać jak ten (zajrzyj do dodatku 1 jeśli wystąpią błędy lub
zaznaczenie kolorowania składni jest wyłączone):
Teraz przeanalizujemy to linia po linii. Większość tego kodu przedstawia dyrektywy (instrukcje dla assemblera). Jest
tylko jedna linia rzeczywistego kodu programu – wywołanie funkcji API ExitProcess.
.386 – mówi MASM aby użył zbioru instrukcji Intela 80386
.model fla, stdcall – określa płaski model pamięci i standardową konwencję wywołania funkcji
option casemap:none – określa etykiety czułe na wielkość liter
include kernel32.inc – mówi MASM aby przetwarzał oznaczony plik (jeśli zawartość została skopiowana do kodu
35144390.001.png 35144390.002.png
Zgłoś jeśli naruszono regulamin