标签:
工具:
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
标签:
原文地址:http://blog.csdn.net/bcbobo21cn/article/details/51322293