Čtení: 40 minHodnotí se: Crackme, zkouška

5 Debugging, anti-debugging a packery

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

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í:

  1. Spusť program v debuggeru a sleduj rozbalovací rutinu.
  2. Najdi OEP a zastav se na něm.
  3. Udělej dump procesu.
  4. Oprav sekce a importy, například ve Scylle.
  5. 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

Kvíz

1. Kolik hardwarových breakpointů je na x86?
2. Co je 0xCC?
3. Co je OEP?
4. Jak program pozná debugger bez API?
Ukázat řešeníPřečte z TIB adresu PEB přes fs:[30h] a v ní pole BeingDebugged. Dále NTGlobalFlag, časování nebo kontrolní součet kódu.

5.7 Tahák

Tahák
  • SW: 0xCC, HW: DR0–3, DR7.
  • PEB: BeingDebugged, NTGlobalFlag, ProcessHeap.
  • Časování a výjimky.
  • Packer: EP → rozbalení → OEP → dump → oprava importů.

Zdroje

  • rev06cz: debuggery strany 3–19, breakpointy 20–25, trasování 26, anti-debugging 34–43
  • rev05cz: rozpoznání kompilátorů strany 4–8, knihovny 10–14
  • NI-REV cvičení 10 a 11