Google

星期三, 一月 23, 2008

PE Format(18)

符号名称可能会全部丢失,此时“AddressOfNames”(名字的地址)为0;否则,被指向的数组并行运行,这意味着它们的每个索引中的元素共同拥有。
“AddressOfNames”(名字的地址)数组由以0结尾的输出名称的RVA组成;这些名称以一个分类的列表排列(即:数组的第一个成员是按照字母顺序排列的最小的名称的RVA;这使当按名称查找一个输出符号时,搜索的效率更高。)

  根据PE规范,“AddressOfNameOrdinals”(名字序数的地址)数组每个名称拥有一个相应的序数,然而,我发现这个数组却将实际的索引包含到“AddressOfFunctions”(函数地址)数组中去。

  我将画一个有关这三个表的图:
    函数地址
       |
       |
       |
       v
   带序数‘基址’的输出RVA
   带序数‘基址+1’的输出RVA
   ...
   带序数‘基址+函数数-1’的输出RVA
    名字地址           名字序数地址
      |               |
      |               |
      |               |
      v               v
    第一个名字的RVA   <->  第一个名字的输出索引
    第二个名字的RVA   <->  第二个名字的输出索引
    ...              ...
   第‘名字数’个名字的RVA <-> 第‘名字数’个名字的输出索引

  举一些例子是适宜的。

  为按序数找到一个输出符号,先减去“Base”(基址)值以得到索引值,再根据“AddressOfFunctions”(函数地址)的RVA得到输出项数组,并用索引值去找到数组中的输出RVA。如果结果没有指向输出节中,你就完了。否则,它就指向那里的一个描述输出DLL和(输出项)名称或序数的字符串,之后你就得在那里查找中转输出。

  为按名称找到一个输出符号,先跟随“AddressOfNames”(名字的地址)的RVA(如果是0就没有名称)找到输出名称的RVA数组。在列表中搜寻你要找的名称。用该名称在“AddressOfNameOrdinals”(名字序数的地址)数组中的索引,得到和找到的名称相应的16位数字。根据 PE规范,这是一个序数,你需先减去“Base”(基址)值以得到输出索引值;但依据我的经验,这就是输出索引值,你不需要再减了。使用输出索引值,你就能在“AddressOfFunctions”(函数地址)数组中找到输出RVA了,要么是输出RVA本身,要么是一个描述中转输出的字符串的RVA。

标签: , ,

0 条评论:

发表评论

<< 主页

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

Powered by Blogger