当前位置:主页   - 电脑 - 程序设计 - C/C++
PE文件格式分析心得
来源:网络   作者:   更新时间:2012-08-24
收藏此页】    【字号    】    【打印】    【关闭

  PE文件格式最近好像炒得沸沸扬扬,由于我正在做一个这样的程序,索性将自己的心得写出来与大家同享。

  PE文件头分两大部分:

  1:DOS ‘MZ’ HEADER

  2:IMAGE_NT_HEADERS

  其中IMAGE_NT_HEADERS中包含

  PE signature

  IMAGE_FILE_HEADER

  IMAGE_OPTIONAL_HEADER(其中包含Data Direcotry)

  文件头后紧跟着为

  Section Table (array of IMAGE_SECTION_HEADERs)

  在DELPHI的windows.pad中已经有定义的有:

  TImageDosHeader;

  TImageNtHeaders;

  TImageSectionHeader; { size of TIm..der is $28 }

  定义变量后按住Ctrl可以察看具体的项目,这里我就不多说了,这方面的东西也很多。

  而其他的如TImageResourceDirectory等,在DELPHI中却没有定义,察看其他资料,我在这里给出他们的结构和简单说明:

  以下是我写的PEDump.exe的类型说明:

  type
  PIMAGE_RESOURCE_DIRECTORY = ^TImageResourceDirectory;
  _IMAGE_RESOURCE_DIRECTORY = packed record
   Characteristics:DWORD;
   TimeDateStamp:DWORD;
   MajorVersion:WORD;
   MinorVersion:WORD;
   NumberOfNamedEntries:WORD;
   NumberOfIdEntries:WORD;
  end;
  TImageResourceDirectory = _IMAGE_RESOURCE_DIRECTORY;
  { 资源目录的格式说明 }
  PIMAGE_RESOURCE_DIRECTORY_ENTRY = ^TImageResourceDirectoryEntry;
  _IMAGE_RESOURCE_DIRECTORY_ENTRY = packed record
   Name:DWORD;     { NameOffset:31,NameIsString:1 }
//  Id:WORD;
   OffsetToData:DWORD; { OffsetToDirectory:31,DataIsDirectory:1 }
  end;
  TImageResourceDirectoryEntry = _IMAGE_RESOURCE_DIRECTORY_ENTRY;
  { 资源目录进入点的格式说明 }
  PIMAGE_RESOURCE_DIRECTORY_STRING = ^TImageResourceDirectoryString;
  _IMAGE_RESOURCE_DIRECTORY_STRING = packed record
   Length:WORD;
   NameString:CHAR;
  end;
  TImageResourceDirectoryString = _IMAGE_RESOURCE_DIRECTORY_STRING;
  { 资源目录名的格式说明 }
  PIMAGE_RESOURCE_DIR_STRING_U = ^TImageResourceDirStringU;
  _IMAGE_RESOURCE_DIR_STRING_U = packed record
   Length:WORD;
   NameString:WCHAR;
  end;
  TImageResourceDirStringU = _IMAGE_RESOURCE_DIR_STRING_U;
  { unicode形式的资源目录名的格式说明 }
  PIMAGE_RESOURCE_DATA_ENTRY = ^TImageResourceDataEntry;
  _IMAGE_RESOURCE_DATA_ENTRY = packed record
   OffsetToData:DWORD;
   Size:DWORD;
   CodePage:DWORD;
   Reserved:DWORD;
  end;
  TImageResourceDataEntry = _IMAGE_RESOURCE_DATA_ENTRY;
  { 资源目录数据进入点的格式说明 }
const
  IMAGE_RESOURCE_NAME_IS_STRING = $80000000;
  { 检测TImageResourceDirectoryEntry.Name的最高为是否设立,
   是则说明剩下的31位指向IMAGE_RESOURCE_DIR_STRING_U的偏移,
   否则说明剩下的31位为一个整数ID。 }
  IMAGE_RESOURCE_DATA_IS_DIRECTORY = $80000000;
  { 检测TImageResourceDirectoryEntry.OffsetToData的最高为是否设立,
   是则说明剩下的31位指向另一个IMAGE_RESOURCE_DIRECTORY的偏移,
   否则说明剩下的31位指向IMAGE_RESOURCE_DATA_ENTRY的偏移。 }
  { 以下是文件属性具体值常量说明 }
  { File Characteristics }
  IMAGE_FILE_RELOCS_STRIPPED      = $0001; // Relocation info stripped from file.
  IMAGE_FILE_EXECUTABLE_IMAGE     = $0002; // File is executable.
  IMAGE_FILE_LINE_NUMS_STRIPPED    = $0004; // Line nunbers stripped from file.
  IMAGE_FILE_LOCAL_SYMS_STRIPPED    = $0008; // Local symbols stripped from file.
  IMAGE_FILE_AGGRESIVE_WS_TRIM     = $0010; // Agressively trim working set
  IMAGE_FILE_LARGE_ADDRESS_AWARE    = $0020; // App can handle >2gb addresses
  IMAGE_FILE_BYTES_REVERSED_LO     = $0080; /

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明