Tworzenie debuggerów

Prowadzący

Michał Kowalczyk

Opis

Na warsztatach napiszemy własny debugger (dla programów Windowsowych x86) oraz pobawimy się jego różnymi zastosowaniami, m.in. wizualizacją wykonywania programów. Omówimy implementację wszystkich użytecznych funkcji debuggera, ale zaimplementujemy tylko te które będą nam potrzebne do wizualizacji. Porozmawiamy też o wadach i zaletach klasycznego podejścia do debugowania (przez systemowe API) oraz innych sposobach na kontrolowanie/monitorowanie wykonania programu (np instrumentacja, emulacja i wiele innych) oraz kiedy które z nich najlepiej stosować.

Bardziej technicznie:
- będziemy pisać w czystym WinAPI
- będziemy dezassemblować (distormem) i analizować wykonywane instrukcje (czytaj: będzie dużo asma)
- dam wszystkim nakładkę do rysowania wizualizacji, żeby niepotrzebnie nie tracić czasu na offtop
- przerobimy wszystkie możliwe typy breakpointów, ich wady i zalety (np breakpointy na odczyt fragmentu pamięci)
- podyskutujemy o metodach śledzenia wykonania kodu (trap flag i inne)
- piszemy w visualu, nie w devie
- warsztaty będą trudne, więc zadania kwalifikacyjne również

Po co?

Czasami potrzebna jest możliwość kontrolowanego uruchomienia programu/zliczenia wywołań jakiejś funkcji/podmiana wyników jakiejś funkcji WinAPI i wiele innych, w tym celu bardzo przydatna jest umiejętność napisania własnego debuggera. Dzięki temu zrozumiemy też jak dokładnie działają zwykłe debuggery (np te wbudowane w różne IDE) i będziemy w stanie lepiej ich używać (np dowiemy się czemu breakpointy na pamięć bardzo spowalniają program, oraz jak tego uniknąć).

Program zajęć

A raczej jego szkic, to że czegoś tu nie ma, nie znaczy, że tego nie omówimy ;)

I dzień (teoria)
- trochę o architekturze x86 i działaniu Windowsa
- jak działają wyjątki i DebugAPI
- jak się debuguje (jak się robi breakpointy (hardware/software/mem), step into, step over i maasa innych)
- inne pomysły na kontrolowanie wykonania
II dzień (kodzenie debuggera)
- projekt i rozplanowanie kodu
- kodzenie
III dzień (kodzenie wizualizacji)
- trochę teorii
- kodzenie

Wymagania

- dobra znajomość assemblera (wystarczą instrukcje używane w ring3, znajomość podstawowych rejestrów i różnych konwencji wywoływania funkcji (np cdecl))
- dobra znajomość C/C++ (wskaźniki, ręczna alokacja pamięci (malloc+free oraz new+delete) itp.)
- znajomość Windowsa (skill w sapera się nie liczy ;) ) i podstaw WinAPI (umiejętność tworzenia wątków, operowania na innych procesach itp.)
- ogarnianie systemów operacyjnych (czyli czym się różnią wątki od procesów, pamięć wirtualna itd.)

Zadania kwalifikacyjne

1. [WinAPI] 2pkt Napisz program który wyświetla listę aktualnie uruchomionych procesów, umożliwia wybranie któregoś z nich i wyświetlenie listy jego wątków, a następnie zatrzymywanie i wznawianie wybranego przez użytkownika wątku. Nie musi być GUI, ale fajnie jakby było jakieś proste ;)
2. [Asm] 4pkt Ściągnij program: <klik> i wygeneruj dla swojego imienia i nazwiska ("Imie_Nazwisko") 10 działających kluczy. Do rozwiązania przyda się debugger, np OllyDbg2. Twoim celem jest znalezienie algorytmu weryfikacji klucza, przeanalizowanie kodu w asemblerze i złamanie go. W razie problemów z uruchomieniem exeka ściągnij Visual 2012 Redistributable.

Rozwiązania wysyłajcie na maila moc.liamg|31wokm#moc.liamg|31wokm, w razie problemów/pytań śmiało piszcie ;)

Materiały pomocnicze

Seria Reverse Craft: http://re.coldwind.pl/
Zestaw bardzo dobrych video-tutoriali o RE, w dodatku po polsku, przyda się do zadania 2. ;)
Dla nieznających asma:
- W powyższej serii są też odcinki o asmie.
- http://4programmers.net/Assembler/Instrukcje_procesor%C3%B3w_8086-Pentium - opisy sporej części instrukcji asma x86 (jak działają)
- Magiczne Shift+F1 na jakiejś instrukcji w OllyDbg, polecam :)
- MSDN (dokumentacja WinAPI i nie tylko)

O ile nie zaznaczono inaczej, treść tej strony objęta jest licencją Creative Commons Attribution-ShareAlike 3.0 License