5 Debugging, anti-debugging a packery
- vysvětlit softwarový a hardwarový breakpoint
- popsat a obejít běžné anti-debugging techniky
- ručně rozbalit zabalený program
5.1 Ukázka: jak funguje breakpoint
Debugger přepíše první bajt instrukce na 0xCC (INT3). Procesor vyvolá výjimku, debugger ji zachytí, vrátí původní bajt, sníží EIP o jedna a zastaví. Proto debuggery kód mění a ochrany to mohou poznat kontrolním součtem.
5.2 Breakpointy
- Softwarový:
INT3, neomezený počet, mění kód. - Hardwarový: registry
DR0ažDR3a řízení vDR7, jen čtyři, kód nemění a umí hlídat i čtení nebo zápis paměti. - Trvalý breakpoint: po zastavení se nastaví příznak TF, provede se jedna instrukce a
INT3se vrátí.
5.3 Anti-debugging
| Technika | Co dělá | Obrana |
|---|---|---|
IsDebuggerPresent |
čte PEB.BeingDebugged |
změnit návrat nebo příznak |
| přímé čtení PEB | fs:[30h], pak příznak |
vynulovat v paměti |
ProcessHeap a NTGlobalFlag |
změny při spuštění z debuggeru | připojit se až po startu, opravit příznaky |
| časování | měří dobu mezi body | nekrokovat, upravit čas |
| výjimky | handler dělá skutečnou práci | předat výjimku programu |
| únik | kód v handleru, před main, jinde |
sledovat initterm a handlery |
5.4 Packery
Na disku je zabalený kód a rozbalovací rutina. Běh začíná v ní a po rozbalení skočí na OEP.
Postup z cvičení:
- Spusť program v debuggeru a sleduj rozbalovací rutinu.
- Najdi OEP a zastav se na něm.
- Udělej dump procesu.
- Oprav sekce a importy, například ve Scylle.
- Ověř, že výsledek běží.
U Crackme chce vyučující postup, který zopakuje i začátečník, a upozornění na zádrhel, který ve cvičení nebyl. Hotový rozbalovač je penalizovaný.
5.5 Rozpoznání kompilátoru
Podle startovního kódu a signatur knihoven se pozná překladač. Knihovní funkce pak není nutné číst.
5.6 Kvíz
5.7 Tahák
- SW:
0xCC, HW: DR0–3, DR7. - PEB: BeingDebugged, NTGlobalFlag, ProcessHeap.
- Časování a výjimky.
- Packer: EP → rozbalení → OEP → dump → oprava importů.