图解用工具对PE文件格式做初步研究

工具:

PETool,MiniHex,PEViewer

以本机notepad.exe为研究对象。本机64位,该notepad.exe是64位应用程序。

1 用peviewer打开

PE文件大体包括四部分,DOS头,NT头,节表以及具体的节。下图展示的是前三部分。

图解用工具对PE文件格式做初步研究_第1张图片

2 DOS头

e_magic:一个WORD类型,值是一个常数0x4D5A,用文本编辑器查看该值位‘MZ’,可执行文件必须都是'MZ'开头。

e_lfanew:为32位可执行文件扩展的域,用来表示DOS头之后的NT头相对文件起始地址的偏移。

看下图左方给出的e_lfanew为0x000000E8,在下图右方找到此地址,如右方000000E0所示行的光标处;

起始四个字节是50 45 00 00,和右图的PE头的Signature相符合;

图解用工具对PE文件格式做初步研究_第2张图片


3 文件头

PE文件头的定义:

typedef struct _IMAGE_FILE_HEADER {  
    WORD    Machine;  
    WORD    NumberOfSections;  
    DWORD   TimeDateStamp;  
    DWORD   PointerToSymbolTable;  
    DWORD   NumberOfSymbols;  
    WORD    SizeOfOptionalHeader;  
    WORD    Characteristics;  
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;  

Machine:该文件的运行平台,是x86、x64还是I64等等,可以是下面值里的某一个。
NumberOfSections:该PE文件中有多少个节,也就是节表中的项数。
TimeDateStamp:PE文件的创建时间,一般有连接器填写。

对照下图左方显示和右方光标处,其内容相符合;



图解用工具对PE文件格式做初步研究_第3张图片


图解用工具对PE文件格式做初步研究_第4张图片


4 导入表

自己算下导入表的起始地址,比较难算;用工具看下,如下图;导入表起始地址是

0x00000178

图解用工具对PE文件格式做初步研究_第5张图片

peviewer给出的导入表内容;

图解用工具对PE文件格式做初步研究_第6张图片

看16进制文件中的00000178,与peviewer给出的似乎不符,不过此处还不太理解;

图解用工具对PE文件格式做初步研究_第7张图片

16进制文件和PETool给出的内容是相符合的;

5 导入表中的函数名

试着找下导入的SetWindowText函数的名字在16进制文件中的位置;

图解用工具对PE文件格式做初步研究_第8张图片

什么是Thunk RVA,对相关计算尚不太熟悉;

直接找到0000D640处看看,不是SetWindowText;

图解用工具对PE文件格式做初步研究_第9张图片

用搜索功能找SetWindowText;在如下位置;这个RVA的计算是比较复杂;以后再搞;



链接

http://www.pediy.com/kssd/tutorial/chap8-1-6.htm
http://blog.csdn.net/evileagle/article/details/11693499

你可能感兴趣的:(pe,导入表,PE文件格式,petool,PE头)