总的来说 pe文件结构 比elf全面多了 dos头 pe nt头 file头 可选头, 区块表
开头
IMAGE_DOS_HEADER_STRUCT{
+0 e_imagic "MZ"
+2 e_cblp
+4 e_cp
+6 e_crlc
+8 e_cparhdr
+0a e_minalloc
+0c e_maxalloc
+0e e_ss
+10 e_sp
+12 e_csum
+14 e_ip
+16 e_cs
+18 e_lfarlc
+1a e_ovno
+1c e_res
+24 e_oemid
+26 e_oeminfo
+28 e_res2
+3c e_lfanew //pe的相对偏移
}
接着是pe文件头
IMAGE_NT_HEADERS_STRUCT{
+0h Signature "PE\0\0"
+4h FileHeader IMAGE_FILE_HEADER
+18h optionalHeader IMAGE_OPTIONAL_HEADER
}
其中的FileHeader
IMAGE_FILE_HEADER_STRUCT{
+04 Machine //运行平台
+06 NumberOfSections //文件的区块数? 块表紧跟在nt_headers后
+08h TimeDateStamp //文件的创建日期和时间
+0ch PointerToSymbolTable //指向符号表
+10h NumberOfSymbols //符号表中符号的个数
+14h SizeOfOptionalHeader //IMAGE_OPTIONAL_HEADER32结构的大小
+16h Characteristics //文件属性
}
其中DataDirectory是指向输出表,输入表,资源块等资源
IMAGE_DATA_DIRECTORY_STRUCT{
VirtualAddress //数据块的起始RVA
Size //数据块的长度
}
区块
紧跟在IMAGE_NT_HEDERS的区块表,IMAGE_SECTION_HEADER结构数组 (相对于elf的programheader 不过更加全面)
IMAGE_SECTION_HEADER_STRUCT{
name //8字节的块名
VitrtualAddress // 区块的rva地址
SizeOfRawData //在文件中对齐的尺寸
PointerToRawData //在文件中的偏移
PointerToRelocations // 在OBJ文件中使用,重定位的偏移
PointerToLinenumbers //行号表中的偏移
NumberOfRelocations //在OBJ文件中使用,重定位数目
NumberOfLinenumbers
Characteristics //区块的属性
}
输入表
是一个IMAGE_IMPORT_DESCRIPTOR(iid)数组开始
IMAGE_IMPORT_DESCRIPTOR_STRUCT{
union
Characteristics
OriginalFirstThunk //指向INT数组
ends
TimeDateStamp //不重要
ForwarderChain //不重要
Name // Dll名字的指针
FirstThunk// 指向iat的rva
}
int和iat都是IMAGE_THUNK_DATA结构数组
```c
IMAGE_THUNK_DATA_STRUCT{
union u1
ForwarderString //指向一个转向者字符串的rva
Function //被输入的函数的内存地址
Ordinal //被输入的api的序数值
AddressOfData //指向IMAGE_IMPORT_BY_NAME
end
}
iat和got表还满像的,。。。
还有就是输出表,资源,基址重定位(.reloc)这和linux下的静态链接满像的,,
Image_base_relocation{
virtualAddress //重定位数据的开始rva地址
sizeOfBlock .//重定位块的长度
TypeOffset //重定位项数组
}
不就是elf的重定位表吗,,,