目录
预备知识
一、相关实验
本实验要求已经认真学习和完成了《IMAGE_DOS_HEADER解析》、《PE头之IMAGE_FILE_HEADER解析》、《PE头之IMAGE_OPTIONAL_HEADER解析》、《节表头解析以及RVA与文件偏移地址的转换》。
二、输入表简介
可执行文件在调用来自其他DLL模块的函数的时候,称为输入,例如当EXE程序弹出一个消息框时,是通过调用User32.dll的MessageBoxA(或者MessageBoxW)来实现的,称该EXE程序输入了User32.dll的MessageBoxA(或者MessageBoxW)函数。不仅仅是EXE,PE文件(如DLL)都可以输入其他模块中的函数。
三、API版本
Win32 API是区分字符集的,对于有字符串参数的API而言,其通常存在两个版本:ANSI版本与Unicode版本,前者使用A后缀,后者使用W后缀。如MessageBox在MSDN中的声明如下:
其中参数lpText以及lpCaption都是字符串,其类型为LPCTSTR。事实上LPCTSTR是一个宏,根据编译器的设置选项的不同,其可以表示不同的含义(根据编译器的设置,LPCTSTR可以解释成LPCSTR或者LPCWSTR):
因此,编程时使用的MessageBox也是一个宏,根据编译字符集的设定,这个宏最终被转换为MessageBoxA或者MessageBoxW,这才是Win32提供的API,如下图所示:
如果一个PE文件中存在对MessageBox的调用,那么PE文件的输入表中存在的API将是MessageBoxA或者MessageBoxW。
实验目的
1)了解PE文件的输入表结构;
2)手工解析PE文件的输入表;
3)编程实现PE文件输入表的解析。
实验环境
服务器:Windows XP,IP地址:随机分配
辅助工具:C32Asm、LordPE、Python
实验步骤一
输入表结构分析。
从本实验开始将陆续对PE文件中数据目录表的重要表项进行介绍,本实验将介绍数据目录表的第二个成员——输入表。
PE文件中存在一个叫做输入表的结构,这个表保存了PE文件的所有输入信息,包括输入了哪个DLL文件的哪个函数、函数是以名称还是以序号的方式输入、被输入函数在内存中的地址等。数据目录表的第二个成员指向输入表,输入表是一个类型为IMAGE_IMPORT_DESCRIPTOR(简称IID)的数组,每一个DLL都对应有一个IID结构,由于没有字段指明这个IID数组的长度,所以通过在末尾添加一个空的IID结构来表示数组的结束,IID结构体在WinNT.h头文件中的定义如下所示:
<