输入表
输入函数,表示被程序调用但是它的代码不在程序代码中的,而在dll中的函数。对于这些函数,磁盘上的可执行文件只是保留相关的函数信息,如函数名,dll文件名等。在程序运行前,程序是没有保存这些函数在内存中的地址。当程序运行起来时,windows加载器会把相关的dll装入内存,并且将输入函数的指令与函数真在内存中正的地址联系起来。输入表(导入表)就是用来保存这些函数的信息的。
结构体
typedef struct _IMAGE_IMPORT_DESCRIPTOR {
_ANONYMOUS_UNION union { //00h
DWORD Characteristics;
DWORD OriginalFirstThunk;
} DUMMYUNIONNAME;
DWORD TimeDateStamp; //04h
DWORD ForwarderChain; //08h
DWORD Name; //0Ch
DWORD FirstThunk; //10h
} IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR;
typedef struct _IMAGE_THUNK_DATA32 {
union {
DWORD ForwarderString;
DWORD Function;
DWORD Ordinal;
DWORD AddressOfData;
} u1;
} IMAGE_THUNK_DATA32,*PIMAGE_THUNK_DATA32;
两个结构体的作用是一样的,都是为了方便寻找DLL的函数。
IMT是文件在磁盘中的指向的位置
IAT是文件加载进内存后指向的位置
我们使用Stud_PE进行查看
程序hello的作用紧紧是弹出一个对话框
由此我们判断使用了MessagesBox
使用该工具打开程序副本
在文件头部,可以查看出来了输入表的信息
我们打开“在16进制位编辑器中视图文件头树”
我们查看数据的目录
可以看到文件中的输入表位置
有两个数组,两个函数,因为是8个字节
在282acH中
下面我们使用OD进行实例分析
我们准备一个hello文件
该程序的功能只是弹出一个对话框。
我们使用OD软件调试程序
在call函数中发现问题
发现了MessageBoxA
F7进入
在高地址位发现messageBoxtimeoutA
那就可以知道,前面的一段都是这个函数的内容了。
导出表
导出表的结构较为简单。