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_32BIT_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       = $01a4; // SH3E little-endian
  IMAGE_FILE_MACHINE_SH4        = $01a6; // SH4 little-endian
  IMAGE_FILE_MACHINE_SH5        = $01a8; // SH5
  IMAGE_FILE_MACHINE_ARM        = $01c0; // ARM Little-Endian
  IMAGE_FILE_MACHINE_THUMB       = $01c2;
  IMAGE_FILE_MACHINE_ARM33       = $01d3;
  IMAGE_FILE_MACHINE_POWERPC      = $01F0; // IBM PowerPC Little-Endian
  IMAGE_FILE_MACHINE_IA64       = $0200; // Intel 64
  IMAGE_FILE_MACHINE_MIPS16      = $0266; // MIPS
  IMAGE_FILE_MACHINE_ALPHA64      = $0284; // ALPHA64
  IMAGE_FILE_MACHINE_MIPSFPU      = $0366; // MIPS
  IMAGE_FILE_MACHINE_MIPSFPU16     = $0466; // MIPS
// IMAGE_FILE_MACHINE_AXP64       IMAGE_FILE_MACHINE_ALPHA64
  IMAGE_FILE_MACHINE_AMD64       = $0500; // AMD K8
  IMAGE_FILE_MACHINE_TRICORE      = $0520; // Infineon
  IMAGE_FILE_MACHINE_CEF        = $0CEF;
  { 以下是SECTION的属性值具体说明 }
  { Section characteristics }
// IMAGE_SCN_TYPE_REG          = $00000000; // Reserved.
// IMAGE_SCN_TYPE_DSECT         = $00000001; // Reserved.
// IMAGE_SCN_TYPE_NOLOAD        = $00000002; // Reserved.
// IMAGE_SCN_TYPE_GROUP         = $00000004; // Reserved.
  IMAGE_SCN_TYPE_NO_PAD        = $00000008; // Reserved.
// IMAGE_SCN_TYPE_COPY         = $00000010; // Reserved.
  IMAGE_SCN_CNT_CODE          = $00000020; // Section contains code.
  IMAGE_SCN_CNT_INITIALIZED_DATA    = $00000040; // Section contains initialized data.
  IMAGE_SCN_CNT_UNINITIALIZED_DATA   = $00000080; // Section contains uninitialized data.
  IMAGE_SCN_LNK_OTHER         = $00000100; // Reserved.
  IMAGE_SCN_LNK_INFO          = $00000200; 
  // Section contains comments or some other type of information.
// IMAGE_SCN_TYPE_OVER         = $00000400; // Reserved.
  IMAGE_SCN_LNK_REMOVE         = $00000800; 
  // Section contents will not become part of image.
  IMAGE_SCN_LNK_COMDAT         = $00001000; // Section contents comdat.
//                    = $00002000; // Reserved.
// IMAGE_SCN_MEM_PROTECTED - Obsolete  = $00004000;
  IMAGE_SCN_NO_DEFER_SPEC_EXC     = $00004000; 
  // Reset speculative exceptions handling bits in the TLB entries for this section.
  IMAGE_SCN_GPREL           = $00008000; 
  // Section content can be accessed relative to GP
  IMAGE_SCN_MEM_FARDATA        = $00008000;
// IMAGE_SCN_MEM_SYSHEAP - Obsolete  = $00010000;
  IMAGE_SCN_MEM_PURGEABLE       = $00020000;
  IMAGE_SCN_MEM_16BIT         = $00020000;
  IMAGE_SCN_MEM_LOCKED         = $00040000;
  IMAGE_SCN_MEM_PRELOAD        = $00080000;
  IMAGE_SCN_ALIGN_1BYTES        = $00100000; //
  IMAGE_SCN_ALIGN_2BYTES        = $00200000; //
  IMAGE_SCN_ALIGN_4BYTES        = $00300000; //
  IMAGE_SCN_ALIGN_8BYTES        = $00400000; //
  IMAGE_SCN_ALIGN_16BYTES       = $00500000; 
  // Default alignment if no others are specified.
  IMAGE_SCN_ALIGN_32BYTES       = $00600000; //
  IMAGE_SCN_ALIGN_64BYTES       = $00700000; //
  IMAGE_SCN_ALIGN_128BYTES       = $00800000; //
  IMAGE_SCN_ALIGN_256BYTES       = $00900000; //
  IMAGE_SCN_ALIGN_512BYTES       = $00A00000; //
  IMAGE_SCN_ALIGN_1024BYTES      = $00B00000; //
  IMAGE_SCN_ALIGN_2048BYTES      = $00C00000; //
  IMAGE_SCN_ALIGN_4096BYTES      = $00D00000; //
  IMAGE_SCN_ALIGN_8192BYTES      = $00E00000; //
// Unused                = $00F00000;
  IMAGE_SCN_ALIGN_MASK         = $00F00000;
  IMAGE_SCN_LNK_NRELOC_OVFL      = $01000000; // Section contains extended relocations.
  IMAGE_SCN_MEM_DISCARDABLE      = $02000000; // Section can be discarded.
  IMAGE_SCN_MEM_NOT_CACHED       = $04000000; // Section is not cachable.
  IMAGE_SCN_MEM_NOT_PAGED       = $08000000; // Section is not pageable.
  IMAGE_SCN_MEM_SHARED         = $10000000; // Section is shareable.
  IMAGE_SCN_MEM_EXECUTE        = $20000000; // Section is executable.
  IMAGE_SCN_MEM_READ          = $40000000; // Section is readable.
  IMAGE_SCN_MEM_WRITE         = $80000000; // Section is writeable.

时间: 2024-09-30 22:41:30

PE文件格式分析心得的相关文章

ART世界探险(11) - OAT文件格式分析(1) - ELF文件头(上)

ART世界探险(11) - OAT文件格式分析(1) - ELF文件头(上) 既然是要探险,咱们就保持一定的深度,起码将来可以做个基于ART的黑客之类的. 所以我们针对细节多下一些工夫,先仔细分析一下OAT文件的格式. ART的本质上是一个编译器,所以我们需要对编译.链接的主要环节都有一个比较深入的了解.想要绕过编译原理去学好ART,是不太现实的一件事情,我们选择可以让这个过程有趣和好玩. 闲扯不多说了,言归正传. 可执行文件 OAT是一种可执行文件,所以封装在一个ELF格式的可执行文件中. 可

DEX文件格式分析

前段时间忙于破解移动和电信的 apk ,挺久没有更新博客了,最近在写个工具,主要功能是通过配置对 dex 文件中的类型.函数.属性进行隐藏,达到防止被静态分析的效果.所以在写工具前必须对 dex 的文件格式有个清晰的认识,相对于 elf 文件格式 dex 文件格式会简单一些. 原文链接: DEX文件格式分析 0x00 前言 分析 dex 文件格式最好的方式是找个介绍文档,自己再写一个简单的 demo 然后用 010Editor 对照着分析.文档可以参考官方文档http://source.andr

wav文件格式分析详解

wav文件格式分析详解 文章转载自:http://blog.csdn.net/BlueSoal/article/details/932395 一.综述    WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的.RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的头四个字节便是"RIFF".    WAVE文件是由若干个Chunk组成的.按照在文件中的出现位置包括:RIFF WAVEChunk, Format C

网站关键词选择技巧及分析心得分享

"网站关键词"一词,对于每一个站长来说并不陌生,大家也都知道它对网站的重要性.也是每个站长在建站之初所面临的首要挑战.对于一个网站来说,合理的关键词对网站排名有着不可估量的影响,也是网站优化的第一步.网站关键字的好坏将直接影响整个站点后期优化和排名.所以我们必须要慎重选择.那么我们应该如何来确定和选择网站关键词呢? 首先,应学会借助关键词挖掘工具对关键词进行分析,归纳总结得出符合网站主题的关键词.在此我也向大家推荐下几个我常用的工具: 1,百度指数(index.baidu.com) ,

90后小伙网站优化分析心得

接手一个站点,从最开始的流量一天900,到现在一天3000多一点.经历的一些点滴跟大家分享一下. 接手的是一个代订网站.货品资源都是从合作方拿过来的.然后一开始做网站的技术都只是搭建了个最简单的框,产品神马都是通过js写进去的.所以整个站点算下来,就很少的一些页面,而且title很多都是重复的.虽然花了很大力气推广,也没有太多的流量过来. 第一步,内链静态化,我把所有城市都分开做成了独立页面,url规划是最大的难题.一开始想越短越好,技术原因改起来比较费功夫.就折中沿用了一些目录结构(这是我现在

PE文件格式文档

NT头---可选头---IMAGE_DATA_DIRECTORY---IMAGE_DIRECTORY_ENTRY_RESOURCE---> IMAGE_SECTION_HEADER[](节头/表) -- 节n---->IMAGE_RESOURCE_DIRECTORY_ENTRY[]---IMAGE_RESOURCE_DIRECTORY[] -----------------0:DOS头 -----------------1:NT头 typedef struct _IMAGE_NT_HEADER

视频文件格式分析(1):avi格式

近日某网盘对用户保存其中的部分私人视频进行篡改,使得这部分视频无论是在线或者下载后均无法播放.我们借着研究对应方法,修复被非法篡改的视频数据,恢复正常使用的机会,研究一下avi的数据格式. avi视频的格式分析 avi是"音视频交错(Audio-Video Interlance)"的缩写,是非常常见的视频文件封装格式.avi是一种适用于采集.编辑.播放的RIFF格式,对不同的编码标准和播放工具具有很强的适应性. 1.文件主体结构 RIFF文件的组成方式由多个chuck组成,组成方式为:

mpeg文件格式分析

MPEG-1流比特层次结构分析总结 1.简要介绍Mpeg 2.Mpeg-1数据流分析 2.1视频序列层(VideoStream) 2.2画面组层(GOP) 2.3画面层(Pictures) 2.4片层(Slice) 2.5宏块层(Macroblock) 2.6块层(Block) 3.加密位置的思考 附录 MPEG-1流比特层次结构分析总结 1.简要介绍Mpeg Mpeg是Motion Picture Expert Group的缩写.活动图像专家组是在1988年由ISO和IEC联合成立的专家组,负

PHP 5.3.0 安装分析心得_php文摘

整个过程,可以这么说,惊异大于惊喜.并且我感受到了我第一次在Windows配置PHP时的那种脆弱无知感觉-- 首先...PHP Team首次分离出了一个Windows团队.Windows的下载也挪到了windows.php.net.一个大进步. 其次...最大的惊异,PHP 5.3开始,居然没有了ISAPI支持--可以参看这里:ISAPI support, do we need it? 从没见PHP Team动作这么迅速.PHP 4停止支持还有一年的过渡期,ISAPI说没就没了--嗯,这个策略我