Jak ověřit platnost PE souboru?? - 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

Jak ověřit platnost PE souboru??

12. července 2001, 00.00 | Pokračování popisu struktury a formátu PE souboru. Potřebného k pochopení některých partií seriálu Cracker proof.

Odpověď na tuto otázku je poněkud složitější a nejednoznačná. Záleží na požadovaném stupni přesnosti. Prověřovat však všechny datové struktury, které PE formát nabízí, by bylo vysoce neefektivní. Spokojíme se proto s platností jen těch nejdůležitějších. Tou bezesporu nejdůležitější je samotná PE hlavička souboru. Jak už bylo řečeno v minulém díle, je tvořena strukturou IMAGE_NT_HEADERS. Ta vypadá takto (winnt.h):

typedef struct _IMAGE_NT_HEADERS {
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

DWORD Signature obsahuje hodnotu 50h, 45h, 00h, 00h. Přepsáno do textu - "PE" ukončené nulami. Pro naše pohodlí definoval Micro$oft tuto hodnotu jako konstantu pod názvem IMAGE_NT_SIGNATURE.
Struktura FileHeader obsahuje informace o fyzickém rozčlenění PE souboru - např. počet sekcí, informace o hostujícím stroji...atd.
Struktura OptionalHeader obsahuje informace o logickém rozčlenění PE souboru - např. adresu tzv. EntryPointu.

K získání struktury IMAGE_NT_HEADERS v C++, můžete využít volání funkce ImageNtHeader, nejdříve však musíte soubor nahrát do paměti. Vše to vypadá asi takto:

HANDLE File;
PIMAGE_NT_HEADERS pImageNT;
DWORD NOBR;

File = CreateFile("název souboru, jehož PE hlavičku chcete prověřit",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); //získáme HANDLE k již existujícímu souboru
BYTE *pMem = new BYTE[GetFileSize(File,NULL)]; // alokujeme paměť
ReadFile(File,pMem, GetFileSize(File,NULL),&NOBR,NULL); //nahrajeme soubor do paměti
pImageNT = ImageNtHeader((VOID*)pMem); // samotné získání struktury IMAGE_NT_HEADERS

Pokud volání funkce ImageNtHeader uspěje, je PE soubor platný. Pokud ne, struktura v souboru není => nejedná se o platný PE soubor.

V assembleru musíme zvolit poněkud odlišný postup.

V podstatě ale opět stačí získat strukturu IMAGE_NT_HEADERS. Potom porovnáme hodnotu Signature v této struktuře a konstantu IMAGE_NT_SIGNATURE.
Jak ale zjistit adresu struktury IMAGE_NT_HEADERS? Jednoduchá odpověď - DOS MZ hlavička je definována strukturou IMAGE_DOS_HEADER a právě v její proměnné e_lfanew nalezneme námi požadovanou adresu.
V prvním WORDu struktury IMAGE_DOS_HEADER a tím i v prvním WORDu celého souboru se nachází hodnota 4Dh,5Ah (textem - "MZ", odtud taky DOS MZ hlavička), kterou Micro$oft opět nadefinoval jako strukturu IMAGE_DOS_SIGNATURE. Pro jistotu zkontrolujeme platnost struktury IMAGE_DOS_HEADER (porovnáme první WORD souboru a výše zmiňovanou konstantu) a teprve potom z její proměnné e_lfanew použijeme adresu PE hlavičky.

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: