时间:202106
导出表
DESC: 记录本模块导出函数的相关信息, 结构如图所示。
RVA: IMAGE_DATA_DIRECTORY[0].VirtualAddress。
导出函数有两种导出方式:
(1) 序号导出。直接在导出函数地址表通过序号得到函数的 RVA。
(2) 名称导出。先在导出函数名称表中找到该函数位置, 再在导出函数名称序号表对应位置找到该导出函数的序号, 最后在导出函数地址表通过序号得到函数的 RVA。
Name
DESC : 本模块名称字符串的 RVA。
NumberOfFunctions
DESC : 导出函数个数,实际等于导出函数地址表的元素数目。
NumberOfNames
DESC : 以函数名称导出的函数个数。
AddressOfFunctions
DESC : 导出函数地址表的 RVA,存储所有导出函数入口点的 RVA。每项地址大小 4 字节,总大小为NumberOfFunctions * 4。
不一定每一项都表示一个导出函数的地址, 可以为 0x00000000 的填充。
AddressOfNames
DESC : 导出函数名称表的 RVA,存储所有以名称导出的函数名称字符串的地址。每项地址大小 4 字节, 总大小为 NumberOfNames * 4。
AddressOfNameOrdinals
DESC : 以名称导出的函数的序号表的 RVA, 与名称表对应, 存储所有以名称导出的函数的序号。每项序号大小 2 字节, 总大小为 NumberOfNames * 2。
导入表
DESC : 用于记录所有外部导入函数的信息, 由 IMAGE_IMPORT_DESCRIPTOR 结构体数组构成, 最后一个元素以 0x00 填充表示结束。每个结构体描述一个模块被使用的导入函数的相关信息。导入表大小 IMAGE_DATA_DIRECTORY.Size 值包括最后的空结构体大小。
DUMMYUNIONNAME.Characteristics
DESC : 值为 0 表示 IMAGE_IMPORT_DESCRIPTOR 结构体数组终止。
DUMMYUNIONNAME.OriginalFirstThunk
DESC: 该模块导入名称表 (INT) 的 RVA。指向一个 IMAGE_THUNK_DATA32 (32位) 或 IMAGE_THUNK_DATA64 (64位) 结构体数组。
TimeDateStamp
DESC : 时间戳。如果没有绑定, 值为 0。否则为 -1, 且真实时间戳在目录项的绑定导入表 IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 中。
Name
DESC : 模块名称字符串的 RVA。
FirstThunk
DESC: 该模块导入地址表 (IAT) 的 RVA。指向一个 IMAGE_THUNK_DATA32 (32位)或 IMAGE_THUNK_DATA64 (64位)结构体数组。如果绑定了,IAT具有真实的函数地址。
1. INT
DESC : 导入函数名称表, 描述导入函数的导出序号或名称等相关信息。由 IMAGE_THUNK_DATA32 (32位)或 IMAGE_THUNK_DATA64 (64位)结构体数组构成, 最后一个元素以 0x00 填充表示结束, 每个元素描述一个导入函数。
该结构体只有一个成员, 如果值的最高位为 1 表示函数是以序号形式导出的, 剩余 31 位(或 63 位)表示导入函数在其模块导出函数地址表中的序号。如果为 0 则表示函数是以名称形式导出的, 值为一个结构体 IMAGE_IMPORT_BY_NAME 的 RVA, 结构体如下:
2. IAT
DESC : 导入函数地址表, 记录每个导入函数的实际内存地址 (VA)。
由于模块加载基址的不确定, 在加载到内存时 IAT 一般由 PE 加载器依次获取每个函数的实际地址后重新填充。如果使用目录项中的绑定导入表, IAT 的值已经是每个导入函数的实际地址, 可以跳过 IAT 的填充使得装载更快。
由 IMAGE_THUNK_DATA32 (32位)或 IMAGE_THUNK_DATA64 (64位)结构体数组构成, 最后一个元素以 0x00 填充表示结束, 每个元素的值为该导入函数的在该模块中的 RVA。