古詩詞大全網 - 個性簽名 - 求助:請問怎麽樣知道壹個文件的“文件簽名”和“簽名偏移量”

求助:請問怎麽樣知道壹個文件的“文件簽名”和“簽名偏移量”

何必那麽麻煩 用FINALDATA操作比較方便快捷

DOS 頭部結構定義

//word 與 UNSHORT 等效

typedef struct _IMAGE_DOS_HEADER { // DOS .EXE 頭結構定義開始 文件中的位置(偏移量)

WORD e_magic; // 魔術數字 0x00000000-0x00000001

WORD e_cblp; // 文件最後頁的字節數 0x00000002-0x00000003

WORD e_cp; // 文件頁數 0x00000004-0x00000005

WORD e_crlc; // 重定位元素個數 0x00000006-0x00000007

WORD e_cparhdr; // 以段落為單位的頭部大小 0x00000008-0x00000009

WORD e_minalloc; // 所需的最小附加段 0x0000000A-0x0000000B

WORD e_maxalloc; // 所需的最大附加段 0x0000000C-0x0000000D

WORD e_ss; // 初始的堆棧段(SS)相對偏移量值 0x0000000E-0x0000000F

WORD e_sp; // 初始的堆棧指針(SP)值 0x00000010-0x00000011

WORD e_csum; // 校驗和 0x00000012-0x00000013

WORD e_ip; // 初始的指令指針(IP)值 0x00000014-0x00000015

WORD e_cs; // 初始的代碼段(CS)相對偏移量值 0x00000016-0x00000017

WORD e_lfarlc; // 重定位表在文件中的偏移地址 0x00000018-0x00000019

WORD e_ovno; // 覆蓋號 0x0000001A-0x0000001B

WORD e_res[4]; // 保留字(壹般都是為確保對齊而預留) 0x0000001C-0x00000023

WORD e_oemid; // OEM 標識符(相對於 e_oeminfo) 0x00000024-0x00000025

WORD e_oeminfo; // OEM 信息,即 e_oemid 的細節 0x00000026-0x00000027

WORD e_res2[10]; // 保留字(壹般都是為確保對齊而預留) 0x00000028-0x0000003B

LONG e_lfanew; // 新 exe 頭在文件中的偏移地址 0x0000003C-0x0000003F

} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER; //DOS .EXE 頭結構定義結束;引用結構名:IMAGE_DOS_HEADER,結構指針

名:PIMAGE_DOS_HEADER

//DOS 頭部***占64個字節(0x0000003F-0x0000000+1)=0x40=64

//接下來就是DOS STUB(DOS實模式殘余程序,或壹段完整的DOS程序),對Windows NT 及 windows 3.1 以上的版本,沒有多大的作用,

僅僅是在 DOS 模式下運行該可執行文件時簡單地顯示壹條諸如"This program cannot run in DOS mode(該程序無法在 DOS 模式下運

行)"或"This program requires run under windows(該程序必須在 windows 環境下才能運行)"的提示,當然這樣的提示可以由編程

者任意修改,只需要在鏈接階段選用-STUB:鏈接器選項來實現。雖然 DOS 頭、DOS STUB、PE 文件標誌、PE頭等是順序連續排列存放

的,但是 DOS STUB 到底占多少字節的空間無法確定,壹般無固定的字節數。因此導致 PE 頭在文件中的位置從何處開始無法通過存放

的順序來直接獲得,只好通過 e_lfanew 域來指向。

//上述域中真正在 windows 下有用的只有 e_lfanew

PE 頭部結構(包括簽名、文件頭、可選頭)

//註意:可選頭並不非是這個部分可有可無,實際上比必需的,也是PE文件中最重要的部分,不知 Micosoft 為什麽冠以這個很容易

引起誤解或產生歧義的名來命名這個結構名;

typedef struct _IMAGE_NT_HEADERS { //PE 頭結構定義開始

DWORD Signature; //簽名(文件類型標誌),文件中的偏移量由 DOS 頭中的域 e_lfanew 來指定

IMAGE_FILE_HEADER FileHeader; //PE 文件頭結構(占用20個字節)

IMAGE_OPTIONAL_HEADER32 OptionalHeader; //可選頭結構(占用224個字節)

} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS3 //PE 頭結構定義結束;引用結構名:IMAGE_NT_HEADERS32,結構指針名:

PIMAGE_NT_HEADERS3

//在WINNT.H 頭文件中對 Signature 的定義如下:

Signature 類型 十六進制值 ASCII串形式

#define IMAGE_DOS_SIGNATURE 0x5A4D // MZ

#define IMAGE_OS2_SIGNATURE 0x454E // NE

#define IMAGE_OS2_SIGNATURE_LE 0x454C // LE

#define IMAGE_VXD_SIGNATURE 0x454C // LE

#define IMAGE_NT_SIGNATURE 0x00004550 // PE00

PE 文件頭結構定義

typedef struct _IMAGE_FILE_HEADER { //PE 文件頭結構定義開始

WORD Machine; //OS 所有的處理器類型 偏移位置:e_lfanew+0x04

WORD NumberOfSections; //節數

DWORD TimeDateStamp; //創建文件的日期和時間

DWORD PointerToSymbolTable; //符號表指針

DWORD NumberOfSymbols; //符號數

WORD SizeOfOptionalHeader; //可選頭大小

WORD Characteristics; //特征(通過它可以了解PE文件中是否包含調試信息)

} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; //PE 文件頭結構定義結束

我聽別人說這世界上有壹種鳥是沒有腳的,它只能壹直飛呀飛呀,飛累了就在風裏面睡覺,這種鳥壹輩子只能下地壹次,那邊壹次就是它死亡的時候。