wangchao.org
添加收藏 | 博客
 
购物视频论坛IT业界自然风光美女图片王朝网络小游戏BT下载生活百科编程设计手机图铃小说
 
笑话 | 水库 | 娱乐 | 体育 | 英语 | 宠物 | 美食 | 旅游 | 养生 | 手机 | 数码 | 汽车 | 珠宝 | 美容 | 装修 | 厨房 | 科普 | 动物 | 植物 | 影音 | 百科 | 知道 | 词典
  
 
 您好! 您现在位于: 王朝网络 → 编程设计 → 《PE文件格式分析心得返回上一页 
 
1楼 

PE文件格式分析心得

  网上购物、在线购物、购物搜索 欢迎光临本站购买图书、影视、音乐、数码、百货,手机等商品。

  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; // Bytes of machine word are reversed.
   IMAGE_FILE_32B99v_MACHINE = $0100; // 32 bit word machine.
   IMAGE_FILE_DEBUG_STRIPPED = $0200;
   // Debugging info stripped from file in .DBG file
   IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = $0400;
   // If Image is on removable media, copy and run from the swap file.
   IMAGE_FILE_NET_RUN_FROM_SWAP = $0800;
   // If Image is on Net, copy and run from the swap file.
  
  
   IMAGE_FILE_SYSTEM = $1000; // System File.
   IMAGE_FILE_DLL = $2000; // File is a DLL.
   IMAGE_FILE_UP_SYSTEM_ONLY = $4000; // File should only be run on a UP machine
   IMAGE_FILE_BYTES_REVERSED_HI = $8000; // Bytes of machine word are reversed.
  
   { 以下是文件头机器属性值的具体说明 }
   { Machine }
   IMAGE_FILE_MACHINE_UNKNOWN = $0;
   IMAGE_FILE_MACHINE_I386 = $014c; // Intel 386.
   IMAGE_FILE_MACHINE_R3000 = $0162; // MIPS little-endian, $160 big-endian
   IMAGE_FILE_MACHINE_R4000 = $0166; // MIPS little-endian
   IMAGE_FILE_MACHINE_R10000 = $0168; // MIPS little-endian
   IMAGE_FILE_MACHINE_WCEMIPSV2 = $0169; // MIPS little-endian WCE v2
   IMAGE_FILE_MACHINE_ALPHA = $0184; // Alpha_AXP
   IMAGE_FILE_MACHINE_SH3 = $01a2; // SH3 little-endian
   IMAGE_FILE_MACHINE_SH3E

  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; // Bytes of machine word are reversed. IMAGE_FILE_32B99v_MACHINE = $0100; // 32 bit word machine. IMAGE_FILE_DEBUG_STRIPPED = $0200; // Debugging info stripped from file in .DBG file IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = $0400; // If Image is on removable media, copy and run from the swap file. IMAGE_FILE_NET_RUN_FROM_SWAP = $0800; // If Image is on Net, copy and run from the swap file. IMAGE_FILE_SYSTEM = $1000; // System File. IMAGE_FILE_DLL = $2000; // File is a DLL. IMAGE_FILE_UP_SYSTEM_ONLY = $4000; // File should only be run on a UP machine IMAGE_FILE_BYTES_REVERSED_HI = $8000; // Bytes of machine word are reversed. { 以下是文件头机器属性值的具体说明 } { Machine } IMAGE_FILE_MACHINE_UNKNOWN = $0; IMAGE_FILE_MACHINE_I386 = $014c; // Intel 386. IMAGE_FILE_MACHINE_R3000 = $0162; // MIPS little-endian, $160 big-endian IMAGE_FILE_MACHINE_R4000 = $0166; // MIPS little-endian IMAGE_FILE_MACHINE_R10000 = $0168; // MIPS little-endian IMAGE_FILE_MACHINE_WCEMIPSV2 = $0169; // MIPS little-endian WCE v2 IMAGE_FILE_MACHINE_ALPHA = $0184; // Alpha_AXP IMAGE_FILE_MACHINE_SH3 = $01a2; // SH3 little-endian IMAGE_FILE_MACHINE_SH3E

 
标签: PE  分析  心得  文件格式  
 
您可以将本页贴到其他网站
UBB代码HTML代码
 
 
 
 
 
 
 更多内容
 ·OpenBSD 可加载内核模块编程完全 ·POSIX 线程详解(1) ·C 编程最佳实践 ·C++中禁止异常信息传递到析构函数
 ·S-DES ·在DBGrid中实现Copy、Paste功能 ·控制C++的内存分配 ·Processes (进程)
 ·Python与C++ 程序的简单实例对比 ·QQ本地密码验证破解 ·References and arrays ·Scheduling (调度)
 ·Socket的地址结构 ·C++消息连接的一种系统方法 ·C语言程序开发经典实例之四 ·C++箴言:用传引用给const取代传
 ·用C++访问SQL Server 2000 ·C语言:黑客学员必修课(二) ·C++中的struct专题研究 ·Stan Lippman:C++/CLI全景体验(
 ·1.4 Turbo C 2.0的安装和启动 ·使用多线程实现数据实时采集 ·在Visual C++中如何利用UDL文件来 ·SQL SERVER与ACCESS,EXCEL的数据
 
 
最新评论  点此查看所有评论
 
 
 
 
发表评论(支持UBB码)


验证码:  
 
 
 
© 2005- 王朝网络 版权所有