Čtení: 35 minHodnotí se: úlohy 1, 2 a 4, zkouška

2 Tok kódu, start programu a importy

Po přečtení umíš
  • 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.

Varování 2.2 (Kód před main)

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

Definice 2.3 (IAT)

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

Kvíz

1. Kde jsou po načtení programu adresy importů?
2. Proč je potřeba VirtualProtect při přepisu IAT?
3. Co je typicky skok jmp [eax*4+tabulka]?
4. Popiš kroky injekce DLL do cizího procesu.
Ukázat řešeníOtevřít proces, alokovat v něm paměť, zapsat cestu k DLL a vytvořit vzdálené vlákno se startem v LoadLibrary. DllMain pak běží v cílovém procesu.

2.6 Tahák

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.

Zdroje

  • rev02cz: analýza toku strany 3–20, vstupní bod 21–23, inicializace 24–29, ukončení 30–32, kódování ukazatelů 33, hot patching 34, IAT 37–44
  • NI-REV cvičení 4 a 7