PE头里的东西更多。。。越看越恶心了,我都不想看了
winnt.h
中,定義的PE頭結構體
typedef struct _IMAGE_NT_HEADERS
{
DWORD Signature;//PE文件頭標志:PE\0\0。在開始DOS header的偏移3CH(e_lfanew)處所指向的地址開始
IMAGE_FILE_HEADER FileHeader;//PE文件物理分布的信息
IMAGE_OPTIONAL_HEADER32 OptionalHeader;//PE文件邏輯分布的信息
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
?
PE文件的物理分布信息,結構體
?
typedef struct _IMAGE_FILE_HEADER
{
WORD Machine;//該文件運行所需要的CPU,對于Intel平臺是14Ch
WORD NumberOfSections;//文件的節(jié)數(shù)目
DWORD TimeDateStamp;//文件創(chuàng)建日期和時間
DWORD PointerToSymbolTable;//用于調試
DWORD NumberOfSymbols;//符號表中符號個數(shù)
WORD SizeOfOptionalHeader;//OptionalHeader 結構大小
WORD Characteristics;//文件信息標記,區(qū)分文件是exe還是dll
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
重要的 Characteristics值
#define IMAGE_FILE_RELOCS_STRIPPED 0001h // 文件中是否存在重定位信息
#define IMAGE_FILE_EXECUTABLE_IMAGE 0002h // 文件是可執(zhí)行的
#define IMAGE_FILE_LARGE_ADDRESS_AWARE 0020h // 程序可以觸及大于2G的地址
#define IMAGE_FILE_BYTES_REVERSED_LO 0080h // 保留的機器類型低位
#define IMAGE_FILE_32BIT_MACHINE 0100h // 32位機器
#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP 0400h // 不可在可移動介質上運行
#define IMAGE_FILE_NET_RUN_FROM_SWAP 0800h // 不可在網(wǎng)絡上運行
#define IMAGE_FILE_SYSTEM 1000h // 系統(tǒng)文件
#define IMAGE_FILE_DLL 2000h // 文件是一個DLL
#define IMAGE_FILE_UP_SYSTEM_ONLY 4000h // 只能在單處理器計算機上運行
#define IMAGE_FILE_BYTES_REVERSED_HI 8000h //保留的機器類型高位
?
PE文件的邏輯分布信息,結構體
typedef struct _IMAGE_OPTIONAL_HEADER
{
WORD Magic;//標志字(總是010bh)
BYTE MajorLinkerVersion;//連接器高版本號
BYTE MinorLinkerVersion;//連接器低版本號
DWORD SizeOfCode;//代碼段大小
DWORD SizeOfInitializedData;//已初始化數(shù)據(jù)塊大小
DWORD SizeOfUninitializedData;//未初始化數(shù)據(jù)塊大小
DWORD AddressOfEntryPoint;//PE裝載器準備運行的PE文件的第一個指令的RVA,若要改變整個執(zhí)行的流程,
可以將該值指定到新的RVA,這樣新RVA處的指令首先被執(zhí)行。DWORD BaseOfCode;//代碼段起始RVA
DWORD BaseOfData;//數(shù)據(jù)段起始RVA
DWORD ImageBase;//PE文件的裝載地址
DWORD SectionAlignment;//塊對齊因子
DWORD FileAlignment;//文件塊對齊因子
WORD MajorOperatingSystemVersion;//所需操作系統(tǒng)高位版本號
WORD MinorOperatingSystemVersion;// 所需操作系統(tǒng)低位版本號
WORD MajorImageVersion;//用戶自定義高位版本號
WORD MinorImageVersion;//用戶自定義低位版本號
WORD MajorSubsystemVersion;//win32子系統(tǒng)版本。若PE文件是專門為Win32設計的
WORD MinorSubsystemVersion;//該子系統(tǒng)版本必定是4.0否則對話框不會有3維立體感
DWORD Win32VersionValue;//保留值,系統(tǒng)沒用到的,一般被作為是否感染的標志
DWORD SizeOfImage;//內存中整個PE映像體的尺寸
DWORD SizeOfHeaders;//所有頭+節(jié)表的大小
DWORD CheckSum;//校驗和
WORD Subsystem;//NT用來識別PE文件屬于哪個子系統(tǒng)
WORD DllCharacteristics;// 用來表示一個DLL映像是否為進程和線程的初始化及終止包含入口點的標記
DWORD SizeOfStackReserve;//
DWORD SizeOfStackCommit;//
DWORD SizeOfHeapReserve;//
DWORD SizeOfHeapCommit;//
//堆棧大小 這些域控制要保留的地址空間數(shù)量,并且負責棧和默認堆的申請。在默認情況下,
棧和堆都擁有1個頁面的申請值以及16個頁面的保留值
DWORD LoaderFlags;// 告知裝載器是否在裝載時中止和調試,或者默認地正常運行
DWORD NumberOfRvaAndSizes;// 該字段標識了接下來的DataDirectory數(shù)組個數(shù)。
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
//IMAGE_DATA_DIRECTORY 結構數(shù)組。每個結構給出一個重要數(shù)據(jù)結構的RVA,比如引入地址表等
}IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
?
?
轉載于:https://www.cnblogs.com/suanguade/p/4038271.html
總結
以上是生活随笔為你收集整理的PE头里的东西更多。。。越看越恶心了,我都不想看了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: apk修改strings.xml后重新打
- 下一篇: 算法积累之算法时间复杂度