2 Tok kódu, start programu a importy
- poznat if, smyčky a switch v assembleru
- popsat cestu od vstupního bodu do
main - projít importní tabulku a vysvětlit její přepis
- vysvětlit injekci kódu
2.1 Ukázka: if v assembleru
cmp eax, 5
jle jinak ; skok při opačné podmínce
... ; then
jmp konec
jinak:
... ; else
konec:
Překladač skáče přes then, proto je skok opačný k podmínce v C. Smyčka má navíc skok zpět. switch s hustými hodnotami se mění na tabulku skoků, poznáš ji podle jmp dword ptr [eax*4+tabulka].
2.2 Od vstupního bodu do main
Vstupní bod ukazuje na mainCRTStartup, ne na main. Běhová knihovna nejdřív připraví haldu, argumenty a statické konstruktory (initterm) a teprve pak volá main. Po návratu zavolá exit.
Ochrany i malware rády běží přes initterm ještě před main. Pokud v main nic nenajdeš, podívej se tam.
2.3 Importní tabulka
Tabulka adres importovaných funkcí, kterou plní zavaděč. Kód na ni volá nepřímo, typicky call dword ptr [adresa].
Cesta k ní: GetModuleHandle(NULL) → IMAGE_DOS_HEADER.e_lfanew → IMAGE_NT_HEADERS → OptionalHeader.DataDirectory → importní adresář.
Každý IMAGE_IMPORT_DESCRIPTOR odpovídá jedné DLL a má dvě paralelní pole: OriginalFirstThunk se jmény a FirstThunk, kde jsou po načtení adresy.
Hodnoty jsou RVA, tedy offsety od báze modulu.
Přepis IAT: najdeš položku funkce, stránku odemkneš přes VirtualProtect a zapíšeš vlastní adresu. Tím odchytíš volání bez změny kódu.
2.4 Injekce
Cizí proces spustí tvůj kód: OpenProcess, VirtualAllocEx, WriteProcessMemory, CreateRemoteThread. Typicky se volá LoadLibrary s cestou k DLL a DllMain se spustí v cílovém procesu. Funkce pracující s oknem se tak volají přímo z procesu, který okno spravuje.
2.5 Kvíz
2.6 Tahák
- Podmíněný skok je opak podmínky v C.
- Skok zpět je smyčka, tabulka skoků je switch.
- EP ≠ main: CRT, initterm, main, exit.
- DOS → NT → DataDirectory → importy →
FirstThunk. - RVA = offset od báze.
- Přepis IAT: VirtualProtect + zápis.
- Injekce: OpenProcess, VirtualAllocEx, WriteProcessMemory, CreateRemoteThread.