WEB开发网
开发学院网络安全黑客技术 PE文件格式(2) 阅读

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数组。每个成员描述一个输入函数。

上一页  3 4 5 6 7 8 9 10  下一页

Tags:PE 文件 格式

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接