Přesměrování Program Entry Pointu - pokračování - 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

Přesměrování Program Entry Pointu - pokračování

16. ledna 2002, 00.00 | Dnešní díl dokončí vložení dat do souboru, přesměrování na tyto data při spuštění soboru a úspěšný skok zpět na původní data.Soubor tak zůstane zcela funkční.

V minulém díle jsme se zabývali přesměrováním PEP(Program Entry Point). Dnes si řekneme, jak se vrátit zpět na původní data.

Skok zpět



Skok zpět na původní data můžeme provést několika způsoby. Pro ilustraci uvedu asi tu nejjednodušší možnost s využitím instrukce JMP. 
Pokud chceme někam skočit, je třeba vědět adresu cíle - v našem případě je to adresa původního PEPu. Musíme ji proto někam uložit dřív, než ji přepíšeme novou hodnotou. To lze udělat mnoha způsoby.
Můžete upravit samotný režijní kód na patřičné hodnoty dřív, než jsou vloženy do souboru - zapsané hodnoty jsou pak ale "přímo na očích". Také můžete vyhradit určité místo v režijním kódu, kam zapíšete potřebné proměnné a pak je odtamtud nahrát. Ukázkový příklad vám ukáže jak na to. Práce s daty je sice trochu složitější než kdybychom programovali přímo v ASM, ale na funkčnosti samotné to nic nemění.
K úspěšnému přesunu na původní data, ale nebude stačit pouze originální PEP. Je třeba znát také hodnotu ImageBase, protože PEP je pouze RVA adresou a pro skutečnou adresu skoku tedy musíme přičíst právě hodnotu ImageBase. 
Můžeme sice uložit až konečnou hodnotu součtu, ale hodnotu ImageBase budeme do budoucna ještě mnohokrát potřebovat, takže obě proměnné uložíme zvlášť.

Kam ukládat?



Je třeba si uvědomit, že proměnných bude postupně přibývat a z hlediska bezpečnosti opravdu není nejlepší nápad, všechny je ukládat na jedno místo. Na druhou stranu je to stejně jedno, protože při debuggingu kódu je umístění proměnných většinou zřejmé a tak bychom si pouze přidělávali práci. Lepší asi bude se potom řádně soustředit na ochranu proměnných (zakódování…).

Ukázkový příklad



Kód ukázkového příkladu je drobně vylepšen a také je konečně přidán skok zpět na původní data. Takto vypadá nový režijní kód přidaný do souboru:
push ebx ecx edx esi edi ebp //uložení registrů
call CallMe
CallMe:
pop ebp //zjištění skutečné adresy CallMe
sub ebp,offset CallMe //rozdíl mezi skutečnou a původní pozicí
mov ecx,offset ImageBase
mov ebx, [ebp+ecx] //ebx = ImageBase
mov ecx,offset EntryPoint
mov eax, [ebp+ecx] //eax = EntryPoint
add eax,ebx

pop ebp edi esi edx ecx ebx //obnovení registrů
jmp eax

Je třeba si uvědomit, že umístění instrukcí není stejné ve zdrojovém souboru odkud se režijní kód kopíruje (samotný PE cryptor) a v cílovém souboru. Tuto odchylku vypočítáme a následně použijeme k zjištění korektního umístění proměnných.
Samozřejmě je to jen jeden ze způsobů - fantazii se meze nekladou.

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: