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

3. ledna 2002, 00.00 | Novou sekci už do souboru umíme přidat, ale tím to samozřejmě ještě nekončí. Je třeba ji také něčím zaplnit a v neposlední řadě také na tyto data loader přesměrovat. Dnes se podíváme jak na to.

Novou sekci už do souboru umíme přidat, ale tím to samozřejmě ještě nekončí. Je třeba ji také něčím zaplnit a v neposlední řadě také na tyto data loader přesměrovat. Jdeme na to.

Pro začátek vyplníme novou sekci nějakým bezúčelným kódem - např. několika NOPy. Aby se ale tento kód zpracoval, je třeba přepsat hodnotu Program Entry Point struktury IMAGE_NT_HEADERS RVA adresou požadovaných dat (pokud nevíte proč, odkazuji vás na seriál PE file format).
Data se sice zpracují, ale…..no samozřejmě, původní data nikoli. Proto musíme po zpracování dat skočit zpět na původní kód. K tomu postačí instrukce JMP. To už se však dostáváme za hranice tohoto dílu. 
Ukázkový příklad přidá do souboru novou sekci s několik NOPy a přesměruje položku Program Entry Point. O skok zpět se zatím nestará (místo toho je přidána instrukce RET, aby nedošlo k výjimce - soubor se po spuštění prostě jen ukončí) - to bude náplní příštího dílu.
Příklad bude použit jako základ pro další ukázky, jejímž výsledkem bude první PE cryptor. Nedivte se proto, že některé procesy provádí příliš složitě - myslíme do budoucna.

Pokud někdo z výše uvedeného nepochopil, jak funguje přesměrování zpracování instrukcí v souboru, z obrázku je to snad patrné:



Samozřejmě, že můžete původní kód zavolat instrukcí CALL z vloženého kódu a následně se do něj vrátit, ale tím se budeme zabývat až později.

Na tomto místě bych také rád upozornil ještě na jednu věc. 
V normálním souboru by se SizeofRawData + PointerToRawData poslední sekce mělo rovnat celkové velikosti souboru. Bohužel tomu tak vždy není - některé soubory tuto podmínku nesplňují (vypadá to jako by byly uloženy ve větší velikosti, než tomu ve skutečnosti je). Proto raději místo hodnoty velikosti souboru používejte součet SizeofRawData a PointerToRawData.
Kód ukázky obsahuje spoustu poznámek a vychází z minulého příkladu pro přidání sekce, takže doufám, že s jeho pochopením nebudou žádné problémy.

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: