码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-05-06 15:17:50      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

工具:

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

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

标签:

原文地址:http://blog.csdn.net/bcbobo21cn/article/details/51322293

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!