Anti-FrogsICE - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Assembler

Anti-FrogsICE

3. října 2001, 00.00 | V dnešním článku si řekneme pár slov o tom, jak se bránit jednomu z nejpoužívanějších anti-anti-debugging nástrojů..

Upozornění: Tento díl seriálu předpokládá aspoň základní znalosti v oblasti přechodu mezi Ring módy. Je zbytečné abych se zabýval tímto tématem, protože již tak učinilo mnoho lidí přede mnou a pouze bych kopíroval jejich myšlenky a nápady. Všechny potřebné informace naleznete na I-netu. 

Dnes budeme hovořit o jednom z nejpoužívanějších anti-anti-debugger (spíše SoftICE) programů - programu s názvem FrogsICE (FI). Tento prográmek vám umožní nejenom detekovat snad všechny známé i neznámé detekční metody debuggeru, ale také kontroluje využívání některých hardwarových přerušení, operace s debuggovými registry a ještě mnoho víc. Prostě a jednoduše, pro útočníka prográmek k pohledání. 
Při krátkém hledání na I-netu jsem našel algoritmus, který by měl zabránit používání tohoto programu:

push edx
sidt [esp-2] // načte IDT do stacku
pop edx

add edx,(/*INT 3h*/3*8)+4 // načte vektor námi požadovaného přerušení (INT 3h)
mov ebx,[edx]
mov bx,word ptr [edx-4]      // načte adresu staré obsluhy INT 3h
lea edi,InterruptHandler
mov [edx-4],di
ror edi,16                    // nastaví novou obsluhu INT 3h
mov [edx+2],di

push ds // bezpečnost nade vše
push es
int 3                            // --> Ring0 (námi definovaná nová obsluha INT 3h)
pop es 
pop ds
mov [edx-4],bx         // nastavení původní obsluhy INT 3h
ror ebx,16
mov [edx+2],bx

//-----=============-----
//Nova obsluha INT 3h (Ring0)
// -----=============-----

InterruptHandler:

db 0cdh, 20h
dd 00001013FH   // VMMCall VMM_GetDDBList 
iretd                      // pokud se dostaneme až sem Frogs-ICE není aktivní v paměti



Základem tohoto algoritmu je volání funkce VMM_GetDDBList, která v případě, že je FI aktivní, způsobí zhroucení programu (více níže..). Funkce VMM_GetDDBList musí být volána z Ring0 módu - vzhledem k tomu, že tento mód není ve Windows NT přístupný, nebude vám žádný zde uváděný algoritmus na tomto operačním systému pracovat . 
Je patrné, že pro přechod do Ring0 módu je využito vektorové výměny - v našem případě je přepsána obsluha přerušení INT 3.Myšlenka je vcelku dobrá, ale provedení poněkud zaostává.
Stejně tak jako všechno kolem nás, také software se neustále mění a vyvíjí. A u crackingových nástrojů to platí dvojnásob. 
Kvůli častému používání vektorových výměn zejména v anti-debugging algoritmech, přibyla v FI možnost: "IDT monitor/protector". Díky tomu FI při pokusu o vektorovou výměnu vše zachytí a uvede do původního stavu - funkce VMM_GetDDBList se tak nezavolá a FI bude nadále bez problému pracovat. 
Řešení tohoto problému je vcelku jasné - přechod do Ring0 módu musí být proveden metodou, kterou FI neumí zachytit. Pro tyto potřeby je ideální "The Owl's method", využívající SEHu. Implementace je následující:

xor eax,eax
push offset xhandler 
push dword ptr fs:[eax] 
mov dword ptr fs:[eax],esp

pushfd 
mov eax,esp
xor ebx,ebx 
mov ecx,[ebx] //-->Ring0

//-----=============-----
// Ring0
// -----=============-----
push edx // GS
push edx // FS
push edx // ES
push edx // DS
push edx // SS
push eax // ESP
push dword ptr [eax] // EFLAGS
push ecx // CS
push offset ring3 // EIP = adresa pro návrat do RING3

db 0cdh, 20h
dd 00001013FH // VMMCall VMM_GetDDBList 

iretd //--> RING3

//-----=============-----
// Ring3
// -----=============-----
ring3:
popfd 
pop dword ptr fs:[0] 
add esp,4 
call ExitProcess, -1

//-----=============-----
// XHandler
// -----=============-----

xhandler:
push ebp
mov ebp,esp
push ebx
push ecx

mov ebx,[ebp+8] 
cmp dword ptr [ebx], 0C0000005h
jne konec 
mov eax,[ebp+10h] 
movzx ecx,word ptr [eax+0bch] 
mov [eax+0ach],ecx
mov dword ptr [eax+0bch],28h 
movzx ecx, word ptr [eax+0c8h] 
mov [eax+0a8h],ecx 
mov dword ptr [eax+0c8h],30h 
or dword ptr [eax+0c0h],0200h 
mov eax,0
konec:
pop ecx 
pop ebx
mov esp,ebp
pop ebp
retn //--> RING0


Zde bych rád upozornil na fakt, že pokud je při volání tohoto algoritmu FI aktivní, může dojít nejenom k jeho zhroucení či zhroucení programu, který algoritmus použil, ale také totálnímu kolapsu celého systému - pokud ale FI nepoužíváte, nemáte se čeho bát.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Assembler  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: