Hook是什么?
Hook能够改变软件的功能,比如添加新功能和修改原功能的执行流程。
使用Hook是针对于没有源码的情况下才使用的,如果有源码,就没必要Hook了。
Hook是如何改变程序的流程的
程序块
程序块结构(program block struction)是一种程序结构形式。这种结构将整个程序分为若干个信息快或子程序块,使程序变得清晰,便于阅读和修改。
所以程序中的每一块,都是Hook的一个点。
作业
通过在网上搜索的一些资料,整理如下:
一、IAT是什么?
IAT的全称Import Address Table,即导入地址表。
IAT是一个IMAGE_THUNK_DATA(分为IMAGE_THUNK_DATA32和IMAGE_THUNK_DATA64,两者的区别在于DWORD长度的不同,一个是32位的,另一个是64位的)类型数组。可执行文件中有多少个函数被导入,这个数组就有多少个成员,该数组以0结尾。
IMAGE_THUNK_DATA32的结构体如下所示:
typedef struct _IMAGE_THUNK_DATA32
{
union
{
DWORD ForwarderString; // 一个RVA地址,指向forwarder string
DWORD Function; // PDWORD,被导入的函数的入口地址
DWORD Ordinal; // 该函数的序数
DWORD AddressOfData; // 一个RVA地址,指向IMAGE_IMPORT_BY_NAME
} u1;
} IMAGE_THUNK_DATA32;
IMAGE_THUNK_DATA64的结构体如下所示:
typedef struct _IMAGE_THUNK_DATA64
{
union
{
ULONGLONG ForwarderString; // PBYTE
ULONGLONG Function; // PDWORD
ULONGLONG Ordinal;
ULONGLONG AddressOfData; // PIMAGE_IMPORT_BY_NAME
} u1;
} IMAGE_THUNK_DATA64;
typedef IMAGE_THUNK_DATA64 * PIMAGE_THUNK_DATA64;
从这个结构体可以看出,无论是32位还是64位,它的大小就是一个指针的大小,它实际上就是导入函数地址(Import Address,IA)。
二、IAT属于哪个结构
IAT属于PE文件的PE文件头结构。
在PE文件头当中,有一个数据目录表,在这个表中,定义了导入表、导出表、资源表等的其实RVA与大小。
三、IAT如何定位
定位IAT的方法分为两类:分别是PE装载器已经装载的可执行文件和通过内存映射方法读取的可执行文件。
使用PE装载器已经装载的可执行文件方法定位IAT的步骤:
①获取已经运行的可执行文件在内存中的基地址,也就是通常所说的IMAGEBASE。
②进程的基地址就是PE的IMAGE_DOS_HEADER结构体的首地址。
③定位到PE文件头。基址hMod加上IMAGE_DOS_HEADER结构的e_lfanew成员到达IMAGE_NT_HEADERS,NT文件头的前4字节是文件签名(“PE00” 字符串),然后是20字节的IMAGE_FILE_HEADER结构,即到达IMAGE_OPTIONAL_HEADER结构的地址,获取了一个指向IMAGE_OPTIONAL_HEADER结构体的指针。
④定位到导入表。通过IMAGE_OPTIONAL_HEADER结构中的DataDirectory结构数组中的第二个成员中的VirturalAddress字段定位到IMAGE_IMPORT_DESCRIPTOR结构的起始地址,即获得导入表中第一个IMAGE_IMPORT_DESCRIPTOR结构的指针(导入表首地址) 。