PE文件格式(2)
2007-01-14 20:15:04 来源:WEB开发网核心提示: _symbol:jmp[__imp__symbol]_other_symbol:jmp[__imp__other__symbol]...这就是意味着,如果你使用不带声明的输入符号,PE文件格式(2)(8),链接器就产生包含间接跳转的跳板区,如果指定了声明"__declspec(d
_symbol: jmp [__imp__symbol]
_other_symbol: jmp [__imp__other__symbol]
...
这就是意味着,如果你使用不带声明的输入符号,链接器就产生包含间接跳转的跳板区,如果指定了声明"__declspec(dllimport)",编译器就自己做这个工作,跳板区是不必要的。它也意味着,如果你引入变量或其他东西,你必须指定"__declspec(dllimport)",因为带有JMP的STUB只适合于函数,不适合于变量等。
在任何情况下,符号的地址存在于一个地址'__imp_x'.所有这些地址组成所谓的输入地址表,通过DLL的引入库提供给链接器。输入地址表如下:
__imp__symbol: 0xBEFFA100
__imp__symbol2: 0x40100
__imp__symbol3: 0x300100
...
输入地址表是数据目录的一部分,被IMAGE_DIRECTORY_ENTRY_IAT目录指针指向。一些链接器不设置这个目录项,照样工作,显然加载器可以不使用目录IMAGE_DIRECTORY_ENTRY_IAT就可以解决问题。链接器不知道这个表内的地址,链接器插入哑元(即函数名的RVAs),在加载时,加载器用输出DLL的输出目录修补这些哑元。注意这是C规范,有其他程序编译环境不需要输入库。他们需要产生输入地址表,C编译器倾向于使用输入库,方便于它们的链接器。
我们要看一下一个输入目录如何建立,于是加载器才可以使用。
输入目录必须驻留在一个节,该节是初始化的和可读的,输入目录是一个IMAGE_IMPORT_DESCRIPTORs数组,每个DLL都使用一个元素,该列表中止于一个全0的数组元素。
一个IMAGE_IMPORT_DESCRIPTOR是一个具有如下元素的结构:
IMAGE_IMPORT_DESCRIPTORSTRUCT
union
Characteristicsdd ?
OriginalFirstThunkdd ?
ends
TimeDateStampdd ?
ForwarderChaindd ?
Name1dd ?
FirstThunkdd ?
IMAGE_IMPORT_DESCRIPTORENDS
OriginalFirstThunk32位RVA,指向一个以0结尾的IMAGE_THUNK_DATAs数组。每个成员描述一个输入函数。
更多精彩
赞助商链接