2017-06-16 2 views
2

私は最近、PE(Portable Executable)ファイル形式、具体的にはPE/COFFで開始しました。私はチュートリアルをRandy Kathhereで読んでいました。PEファイルでMZ DOSヘッダーシグネチャが0x54ADになっているのはなぜですか?

MZ DOSヘッダーの構造を読んでいるときに、e_magicフィールドの署名を使用してMZ DOSヘッダーが検証されていました。次のような構造は、次のとおりです。

typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header 
    USHORT e_magic;   // Magic number 
    USHORT e_cblp;   // Bytes on last page of file 
    USHORT e_cp;   // Pages in file 
    USHORT e_crlc;   // Relocations 
    USHORT e_cparhdr;  // Size of header in paragraphs 
    USHORT e_minalloc;  // Minimum extra paragraphs needed 
    USHORT e_maxalloc;  // Maximum extra paragraphs needed 
    USHORT e_ss;   // Initial (relative) SS value 
    USHORT e_sp;   // Initial SP value 
    USHORT e_csum;   // Checksum 
    USHORT e_ip;   // Initial IP value 
    USHORT e_cs;   // Initial (relative) CS value 
    USHORT e_lfarlc;  // File address of relocation table 
    USHORT e_ovno;   // Overlay number 
    USHORT e_res[4];  // Reserved words 
    USHORT e_oemid;   // OEM identifier (for e_oeminfo) 
    USHORT e_oeminfo;  // OEM information; e_oemid specific 
    USHORT e_res2[10];  // Reserved words 
    LONG e_lfanew;  // File address of new exe header 
    } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER; 

とチュートリアルは言う:

すべてのMS-DOS互換の実行可能ファイルは、ASCII文字MZを表し0x54AD、 にこの値を設定します。

私の質問は同じです。

MZのASCII値は16進数で4D5Aに変換され、それぞれ77及び90あります。 0x54ADMZをどのように表していますか?

愚かな質問かもしれません。しかし、あまりにも愚かであるかどうか理解するのを助けてください。

ありがとうございました。

答えて

1

まず、署名を要求する送信元が0x54ADであることが間違っています。

#include <Windows.h> // for the USHORT type 
#include <stdio.h> 

int main() 
{ 
    USHORT MZ = ('M' | 'Z' << 8); 
    printf("0x%.4X\n", MZ); 
    return 0; 
} 

出力::あなたはまだ疑問を持っているかもしれません

0x5A4D 

、なぜバイトをして、このプログラムの出力によって証明されるように六角形でMZは、(リトルエンディアンアーキテクチャのために)実際に0x5A4Dです署名が実際に'MZ'の場合、'Z'5A)が最初に来ますか?

これは、バイトが個々のハーフワード、ワード、ダブルワードなどで格納される順序であるエンディアンと関連しています。

ビッグエンディアンは、最上位のメモリアドレスに最上位バイトのバイトを格納し、リトルエンディアンは逆で最下位のメモリアドレスに最上位のバイトを格納します。

x86とx64のアーキテクチャはリトルエンディアンなので、MZで最上位バイト(すなわちZ)が最初に来ます。

関連する問題