Google

星期三, 一月 23, 2008

PE Format(21)

ForwarderChain(中转链)

  它是输入函数列表中第一个中转的、32位的索引。中转也是高级的东东。对初学者先将所有位设为-1。

  Name(名称)

  它是一个DLL文件的名称(0结尾的ASCII码字符串)的、32位的RVA。

  FirstThunk(第一换长)

  它也是一个RVA(32位),指向一个0结尾的、由IMAGE_THUNK_DATA(换长数据)的RVA构成的数组,其每个IMAGE_THUNK_DATA(换长数据)元素都描述一个函数。此数组是输入地址表的一部分,并且可以改变。

  因此,数组中的每个IMAGE_IMPORT_DESCRIPTOR(输入描述结构)结构体都给出输出DLL文件的名称,并且,除了中转和时间日期戳,它还给出2个指向IMAGE_THUNK_DATA(换长数据)的数组的RVA,都是32位。(每个数组的最后一个成员都全部填充为0字节,以标志结尾。)

  目前看来,每个IMAGE_THUNK_DATA(换长数据)都是一个RVA,指向一个描述输入函数的IMAGE_IMPORT_BY_NAME(输入名字)项。

  现在,有趣的是两个数组并行运行,也就是说:它们指向同一组IMAGE_IMPORT_BY_NAME(输入名字)。

  没有必要失望,我将再画一图。这里是IMAGE_IMPORT_DESCRIPTOR(输入描述结构)的关键内容:
   原始第一个换长    第一个换长
       |          |
       |          |
       |          |
       V          V
       0-->  函数1  <--0
       1-->  函数2  <--1
       2-->  函数3  <--2
       3-->  foo   <--3
       4-->  mumpitz <--4
       5-->  knuff  <--5
       6-->0      0<--6   /*最后的RVA是0!*/

  图当中的名字就是尚未讨论的IMAGE_IMPORT_BY_NAME(输入名字)。每一个都是一个16位的数字(一个提示)跟着一些数量未定的字节,它们都是以0结尾的、输入符号的ASCII码名字。

  提示就是指向输出DLL文件名字表的索引(参见上面的输出目录)。那个索引中的名字将被一一尝试,如果没有相符的,再使用二进制搜索来寻找名字。

  (有些链接器不愿意查找正确的提示,总是只简单的将其指定为1,或者其它的随意数字。这并无大害,只是使解决名字的第一次尝试总是失败,并迫使每个名字都使用二进制搜索来进行。)

标签: , ,

0 条评论:

发表评论

<< 主页

辽ICP备05003652号
流风洄雪听天籁,轻云蔽日看落花

Powered by Blogger