导入表(2)

导入表:

(exe例子为:内存管理-VirtualAlloc)
LordPE查看其导入表RVA:


image.png

010editor中验证:


image.png

导入表位置,落在了.idata段:
image.png

1A000 【7800】

1A1C8 【79C8】

79C8:(这个值为文件中的偏移,就是它在文件中的起始位置,利用79C8在010editor里面可以找到导入表)

在010editor中:


image.png
typedef struct _IMAGE_IMPORT_DESCRIPTOR{
union {
DWORD Characteristics;
DWORD OriginalFirstThunk;//指向一个结构体数组的相对位移,RVA to original unbound IAT (PIMAGE_THUNK_DATA)
}DUMMYUNIONNAME;
DWORD TimeDataStamp;
DWORD ForwarderChain;
DWORD Name;    //导入的PE文件的名字的相对位移(RVA)
DWORD FirstThunk ;//指向一个结构体数组的相对位移(RVA  to IAT)
}
image.png

image.png

18 A2 01 00【OriginalFirstThunk:INT(Import Name Table)导入名称表地址RVA】
00 00 00 00
00 00 00 00
22 A4 01 00【DLL名称的RVA】
00 A0 01 00【IAT(Import Address Table)导入地址表地址RVA】

1.dll的名字【22 A4 01 00(小端)--->0001A422(因为1A000对应7800,故这里dll在文件中偏移为7C22)】

image.png

2.看下INT(OriginalFirstThunk):1A218【7A18】(以全0结尾)


image.png

函数名数组(对应IMAGE_THUNK_DATA32结构体数组,每一个结构体就是一个联合体)

E0 A3 01 00----0001A3E0【7BE0】最高位为0,说明是以名称导入的,不是序号导入的;

一共导入了25个函数,这里只写一个,其他依次类推!
注意:IAT和INT都指向下面的这个数据结构,4Byte

typedef struct  _IMAGE_THUNK_DATA32{
union{
DWORD ForwarderString;
DWORD Function;//导入函数的地址,在加载到内存之后,这里才起作用
DWORD Ordinal;//假如是序号导入的,会用到这里
DWORD AddressOfData;//假如是函数名导入,会用到这里,它指向另外一个结构体PIMAGE_IMPORT_BY_NAME
}u1;
}IMAGE_THUNK_DATA32;
//如果是函数名导入的,AddressOfData会指向下面这个结构体
typedef struct _IMAGE_IMPORT_BY_NAME{
WORD  Hint;//序号
CHAR Name[1];//不定长,字符串

}

由上可知:是按照函数名导入的(大多数都是按名称导入的),故上面的地址值,就会指向一个PIMAGE_IMPORT_BY_NAME的结构体
【7BE0】


image.png

看下IAT(00 A0 01 00->0001A000-->【7800】)


image.png

发现最高位也都是0,所以,也是名称导入的,另外,还可以发现,这个位置的值,和INT的值是一样的,因此,不再赘述了

这里的kernel32.dll里面有25个函数


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容