pe文件格式

总的来说 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的重定位表吗,,,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值