- Debugger SoftICE
- Anti-debugové triky
- Další nástroje používané crackery
Cracking a anticracking jsou dvě techniky, které od sebe nelze odloučit. Schopnosti i nástroje crackerů se zdokonalují, stejně jako se zdokonalují i schopnosti programátorů, kteří chtějí svůj software chránit. Programátor je v tomto boji o krok napřed, protože on určuje jakou ochranu bude jeho program mít. Jenomže dost programátorů svůj krok napřed promarní špatnou ochranou. Ochrana, která je nepřekonatelná, neexistuje, ale ochrana, která crackerovi znepříjemní práci… Všechny ochrany proti debuggerům, kterými se zde budu zabývat budou zaměřeny proti debuggeru Soft-Ice. Nemá cenu se zabývat ochranými prostředky pro jiné debuggery, protože by to bylo jako získat korunu a ztratit milión.
Soft-Ice
Debugger Soft-Ice používá drtivá většina všech crackerů. Svými schopnostmi při nastavování breakpointů, krokování programu, prací s pamětí a celkově prací s debugovaným programem převyšuje všechny ostatní debuggery. Dalo by se říci, že ovládání Soft-Ice je jednoduché a přitom geniální. Soft-Ice se ovládá pomocí příkazů, které se píší do příkazové řádky, kterou obsahuje. Příkazů jsem napočítal přes 170. Ačkoliv je to velké číslo, tak se nemusíte děsit, protože většina příkazů se dá velice jednoduše zapamatovat a velkou část z nich možná ani nevyužijete. Už to je důkazem rozsáhlých schopností Soft-Ice. Tento debugger má jenom jednu vadu na kráse (jestli se to tak dá nazvat) a tou je, že většina ochran v aplikacích je zaměřena na něj. Není ale třeba zoufat, protože existují nástroje jako je Frogs-Ice, který dokáže Soft-Ice skrýt. Většina anti-debugových triků neuspěje, ale ty co jsou úspěšné, musíte před debuggingem odstranit. Proto je dobré společně se Soft-Ice používat některý z méně známých debuggerů. Ideálním je OllyDbg.
O Soft-Ice by se dalo psát hodiny, ale bohužel moje znalosti tohoto debuggeru jsou pouze základní, takže vás odkážu na jednu stránku, kde naleznete popis příkazů a postup při instalaci a konfiguraci Soft-Ice. Mám radši OllyDbg, a tak to asi i zůstane.
Soft-Ice si můžete zakoupit ZDE
Anti-debugové triky
Triků proti debuggerům je velké množství, i když příchod Windows XP znamenal pro anti-debugové triky velké síto. Důvodem je, že ve Windows XP standardně nelze v aplikacích přepínat mezi Ring módy. Kvůli tomu musel být odstraněn ze SafeDiscu trik s debug registrem (viz první část seriálu). Zvěřejním zde několik ochran, které fungují jak ve Windows 9x, tak ve Windows XP.
Detekce Soft-Ice voláním INT 3
Tato metoda detekce je přiliš známá na to, aby mohla crackera překvapit, ale pokud ji šikovně zamaskujete, tak může potrápit.
.586P
.MODEL FLAT, stdcall
;---------------------------------------
; konstanty
MB_OK EQU 0
MB_ICONERROR EQU 10h
;---------------------------------------
; externí funkce
EXTERN MessageBoxA@16:NEAR
EXTERN ExitProcess@4:NEAR
EXTERN SetUnhandledExceptionFilter@4:NEAR
;---------------------------------------
; direktivy pro připojení knihoven
INCLUDELIB C:\MASM32\LIB\USER32.LIB
INCLUDELIB C:\MASM32\LIB\KERNEL32.LIB
;---------------------------------------
; segment s daty
_DATA SEGMENT
titulek DB "Detekce pomocí přerušení INT 3", 0
zprava1 DB "Soft-Ice nalezen!", 0
zprava2 DB "Soft-Ice nebyl nalezen.", 0
oldESP DD 0
oldEAX DD 0
_DATA ENDS
;---------------------------------------
; segment s kódem
_TEXT SEGMENT
Start:
;---------------------------------------
; nastaví SEH pro případ chyby
MOV [oldESP], ESP
PUSH OFFSET CHYBA
CALL SetUnhandledExceptionFilter@4
MOV [oldEAX], EAX
; více o SEHU se dosvíte po tomto příkladu
;---------------------------------------
MOV EAX, 4
MOV EBP, 4243484Bh
; pokud zavoláte přerušení INT 3 s těmito hodnotami,
; tak pokud je Soft-Ice aktivní bude v EAX jiná
; hodnota než 4
INT 3
PUSH EAX ; EAX si uložím na zásobník
;----------------------------------------
; nastaví předcházející obsluhu SEH
PUSH DWORD PTR [oldEAX]
CALL SetUnhandledExceptionFilter@4
;----------------------------------------
POP EAX ; obnovím návratovou hodnotu
CMP EAX, 4 ; je Soft-Ice aktivní?
JNZ Aktivni
NoAktivni:
PUSH MB_OK
PUSH OFFSET titulek
PUSH OFFSET zprava2
PUSH 0
CALL MessageBoxA@16
JMP KONEC
Aktivni:
PUSH MB_ICONERROR
PUSH OFFSET titulek
PUSH OFFSET zprava1
PUSH 0
CALL MessageBoxA@16
KONEC:
PUSH 0
CALL ExitProcess@4
CHYBA:
MOV ESP, [oldESP]
PUSH OFFSET NoAktivni
RET
_TEXT ENDS
END Start
SEH
SEH (Structured Exception Handling) je prevencí před pádem programu. Při různých přerušeních a API funkcích v případě neúspěchu může dojít k pádu programu, ovšem nedojde k němu, pokud je nastaven SEH. Je velice dobré ho používat zvlášť v operačním systému tak „stabilním“ jako je Windows. Pokud nastane v aplikaci chyba, tak program skočí na návěstí CHYBA, které jsem určil před voláním API funkce SetUnhandledExceptionFilter. SEH není jedinou možností prevence před pádem programu, ale rozhodně je nejjednodušší na použití. Aplikaci SEHu můžete vidět na příkladu detekce Soft-Ice pomocí přerušení INT 3h.
Detekce Soft-Ice pomocí otevření jeho ovladačů, voláním API funkce CreateFileA (SICE, NTICE)
Toto je nejčastěji používaná detekce Soft-Ice. Dají se s její pomocí zjistit i jiné aktivní VxD knihovny a Sys ovladače. Celým vtipem této detekční rutiny je pokusit se otevřít VxD ovladač Soft-Ice. Pokud se nám povede ho otevřít, tak je Soft-Ice aktivní.
.586P
.MODEL FLAT, stdcall
;------------------------------------------
; konstanty
FILE_FLAG_WRITE_THROUGH EQU 80000000h
FILE_SHARE_READ EQU 1h
OPEN_EXISTING EQU 3h
FILE_ATTRIBUTE_NORMAL EQU 80h
MB_OK EQU 0
;------------------------------------------
; externí funkce
EXTERN CreateFileA@28:NEAR
EXTERN SetUnhandledExceptionFilter@4:NEAR
EXTERN MessageBoxA@16:NEAR
EXTERN ExitProcess@4:NEAR
;-------------------------------------------
; direktivy pro připojení knihoven
INCLUDELIB C:\MASM32\LIB\USER32.LIB
INCLUDELIB C:\MASM32\LIB\KERNEL32.LIB
;-------------------------------------------
; segment s daty
_DATA SEGMENT
TITULEK DB "Detekce pomocí CreateFileA", 0
ZPRAVA1 DB "Soft-Ice nalezen", 0
ZPRAVA2 DB "Soft-Ice nebyl nalezen", 0
oldESP DD 0
oldEAX DD 0
SOFTICEXP DB "\\.\NTICE", 0
; jméno ovladače Soft-Ice pro Windows NT/2k/XP
; pokud byste chtěli provést test ve Windows 98
; je název ovladače SICE. Zde uvede pouze pro
; Windows XP, ale mohli byste udělat test obou
_DATA ENDS
;-------------------------------------------
; segment s kódem
_TEXT SEGMENT
START:
;-------------------------------------------
; nastaví SEH pro případ chyby
MOV [oldESP], ESP
PUSH OFFSET CHYBA
CALL SetUnhandledExceptionFilter@4
MOV [oldEAX], EAX
;-------------------------------------------
PUSH 0
PUSH FILE_ATTRIBUTE_NORMAL
PUSH OPEN_EXISTING
PUSH 0
PUSH FILE_SHARE_READ
PUSH FILE_FLAG_WRITE_THROUGH
PUSH OFFSET SOFTICEXP
CALL CreateFileA@28
PUSH EAX ; uložím si návratovou hodnotu
;--------------------------------------------
; nastaví předcházející hodnotu SEH
PUSH DWORD PTR [oldEAX]
CALL SetUnhandledExceptionFilter@4
;--------------------------------------------
POP EAX
CMP EAX, -1 ; pokud funkce neuspěla EAX = -1
JNZ Aktivni
NoAktivni:
PUSH MB_OK
PUSH OFFSET TITULEK
PUSH OFFSET ZPRAVA2
PUSH 0
CALL MessageBoxA@16
JMP KONEC
Aktivni:
PUSH MB_OK
PUSH OFFSET TITULEK
PUSH OFFSET ZPRAVA1
PUSH 0
CALL MessageBoxA@16
KONEC:
PUSH 0
CALL ExitProcess@4
CHYBA:
MOV ESP, [oldESP]
JMP NoAktivni
_TEXT ENDS
END START
Detekce Soft-Ice pomocí otevření jeho ovladače voláním API funkce _lcreat
API funkce _lcreat se už téměř nepoužívá a je ve Windows kvůli kompatibilitě se staršími 16 bitovými programy. Přesto je lepší než CreateFileA, protože je méně nápadná. Budu se snažit otevřít ovladač SIWVIDSTART (pro Windows 9x je to SIWVID).
.586P
.MODEL FLAT, stdcall
;-------------------------------------
; konstanty
MB_OK EQU 0
;-------------------------------------
; externí funkce
EXTERN SetUnhandledExceptionFilter@4:NEAR
EXTERN _lcreat@8:NEAR
EXTERN MessageBoxA@16:NEAR
EXTERN ExitProcess@4:NEAR
;-------------------------------------
; direktivy pro připojení knihoven
INCLUDELIB C:\MASM32\LIB\USER32.LIB
INCLUDELIB C:\MASM32\LIB\KERNEL32.LIB
;-------------------------------------
; segment s daty
_DATA SEGMENT
TITULEK DB "Detekce pomocí _lcreat", 0
ZPRAVA1 DB "Soft-Ice nalezen!", 0
ZPRAVA2 DB "Soft-Ice nebyl nalezen!", 0
oldESP DD 0
oldEAX DD 0
OVLADACxp DB "\\.\SIWVIDSTART", 0
_DATA ENDS
;--------------------------------------
; segment s kódem
_TEXT SEGMENT
START:
;--------------------------------------
; nastaví SEH pro případ chyby
MOV [oldESP], ESP
PUSH OFFSET CHYBA
CALL SetUnhandledExceptionFilter@4
MOV [oldEAX], EAX
;--------------------------------------
; teď se pokusím otevřít ten ovladač
PUSH 0
PUSH OFFSET OVLADACxp
CALL _lcreat@8
PUSH EAX
;--------------------------------------
; nastaví přecházející obsluhu SEH
PUSH DWORD PTR [oldEAX]
CALL SetUnhandledExceptionFilter@4
;--------------------------------------
POP EAX
CMP EAX, -1
JNZ Aktivni
NoAktivni:
PUSH MB_OK
PUSH OFFSET TITULEK
PUSH OFFSET ZPRAVA2
PUSH 0
CALL MessageBoxA@16
JMP KONEC
Aktivni:
PUSH MB_OK
PUSH OFFSET TITULEK
PUSH OFFSET ZPRAVA1
PUSH 0
CALL MessageBoxA@16
KONEC:
PUSH 0
CALL ExitProcess@4
CHYBA:
MOV [oldESP], ESP
JMP NoAktivni
_TEXT ENDS
END START
Další možnosti detekce Soft-Ice
Detekovat Soft-Ice v počítači je jedna věc, ale druhou věcí je, jestli je Soft-Ice aktivní. Už jsem měl tu čest s programem, který když viděl nainstalovaný „deaktivovaný“ Soft-Ice, tak se odmítal spustit. Zjistit jestli je Soft-Ice nainstalovaný se dá i pomocí registrů Windows. Konkrétně se jedná o tyto klíče:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\SoftICE
HKEY_LOCAL_MACHINE\Software\NuMega\SoftICE
Touto cestou se dá také zjistit, kde je Soft-Ice nainstalován.
Tyto možnosti detekce jsou nejčastěji používané, a tak je dobré o nich vědět. Detekcí samozřejmě existuje mnohem víc a je jen na vás jestli svoje znalosti budete rozvíjet.
Detekce user debugeru pomocí API funkce IsDebuggerPresent
Přestože jsem říkal, že se ochrannými prostředky pro jiné debuggery než je Soft-Ice zabývat nebudu, tak jednu metodu zde uveřejním. Tento trik nedokáže detekovat OllyDbg ani SoftICE, ale poradí si třeba s debuggerem, který obsahuje Win32Dasm.
.586P
.MODEL FLAT, stdcall
;---------------------------------------
; externí funkce
EXTERN MessageBoxA@16:NEAR
EXTERN ExitProcess@4:NEAR
EXTERN IsDebuggerPresent@0:NEAR
;---------------------------------------
; direktivy pro připojení knihoven
INCLUDELIB C:\MASM32\LIB\USER32.LIB
INCLUDELIB C:\MASM32\LIB\KERNEL32.LIB
;---------------------------------------
; segment s daty
_DATA SEGMENT
TITULEK DB "Detekce user debugeru", 0
ZPRAVA1 DB "Debuger nalezen!", 0
ZPRAVA2 DB "Debuger nebyl nalezen.", 0
_DATA ENDS
;--------------------------------------
; segment s kódem
_TEXT SEGMENT
START:
; v tomto příkladu nemusím použít SEH, poněvadž
; testuji přítomnost debuggeru nástrojem, který
; je pro to určen, takže by bylo smutné, kdyby
; způsobil chybu
CALL IsDebuggerPresent@0
OR EAX, EAX ; je EAX = 0?
JNZ Aktivni
NoAktivni:
PUSH 0 ; MB_OK
PUSH OFFSET TITULEK
PUSH OFFSET ZPRAVA2
PUSH 0
CALL MessageBoxA@16
JMP KONEC
Aktivni:
PUSH 0
PUSH OFFSET TITULEK
PUSH OFFSET ZPRAVA1
PUSH 0
CALL MessageBoxA@16
KONEC:
PUSH 0
CALL ExitProcess@4
_TEXT ENDS
END START
Pozn.: Jako kompilátor pro všechny uvedené příklady byl použity MASM32 v8 (Stáhněte zde).
Další programy používané crackery
RegistryMonitor
Tento program monitoruje přístupy programů do registrů Windows. Zobrazení přístupů do registru můžete filtrovat.
Stáhnout
FileMonitor
Uživatelské rozhraní tohoto programu je stejné jako RegistryMonitor s tím rozdílem, že FileMonitor zaznamenává pokusy o otevření aplikací.
Stáhnout
Resource Hacker
Pomocí tohoto šikovného prográmku si můžete prohlížet i modifikovat dialogy programu, ikony, kurzory, bitmapy…
Stáhnout
Tyto prográmky mohou být velice užitečné, ale dá se bez nich obejít. Až budeme probírat PE souborový formát, tak si představíme další programy, ale zatím se do nich nebudu pouštět.
V boji cracker vs. programátor má druhý jmenovaný krok napřed, takže doufám, že jsem vás naučil, jak svůj krok nepromarnit. Pokud máte jiný záměr než chránit svůj software, tak doufám, že jsem vás naučil, jak s programátorem srovnat krok.