您的位置:首页 > 其它

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

2016-05-05 14:12 281 查看
工具:

PETool,MiniHex,PEViewer

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

1 用peviewer打开

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



2 DOS头

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

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

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

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



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文件的创建时间,一般有连接器填写。

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







4 导入表

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

0x00000178



peviewer给出的导入表内容;



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



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

5 导入表中的函数名

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



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

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



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



链接
http://www.pediy.com/kssd/tutorial/chap8-1-6.htm http://blog.csdn.net/evileagle/article/details/11693499
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息