Google

星期三, 一月 23, 2008

PE Format(22)

总结一下:如果你想从“knurr”DLL中查找输入函数“foo”的信息,第一步你先找到数据目录中的 IMAGE_DIRECTORY_ENTRY_IMPORT(输入目录项)项,得到一个RVA,再在原始节数据中找到那个地址,现在你就得到一个 IMAGE_IMPORT_DESCRIPTOR(输入描述结构)数组了。
通过查看根据它们的“名称”被指向的字符串,得到和“knurr”DLL有关的这个数组的成员(即一个输入描述结构)。在你找到正确的IMAGE_IMPORT_DESCRIPTOR(输入描述结构)后,顺着它的“OriginalFirstThunk”(原始第一个换长)得到被指向的IMAGE_THUNK_DATA(换长数据)数组;再通过查询RVA找到“foo”函数。

  好了,为什么我们有“两”列指向IMAGE_IMPORT_BY_NAME(输入名字)的指针呢?这是因为在运行时,应用程序不需要输入函数的名字,只需要地址。在这里输入地址表又出现了。加载器将从相关的DLL文件的输出目录中查找每一个输入符号,并用DLL文件入口点的线性地址替换“FirstThunk”(第一个换长)列表中的IMAGE_THUNK_DATA(换长数据)元素(到现在之前它还是指向 IMAGE_IMPORT_BY_NAME(输入名字)的)。

请记住带有象“__imp__symbol”标签的地址列表;被数据目录IMAGE_DIRECTORY_ENTRY_IAT(输入地址表目录项)所指向的输入地址表,就是被“FirstThunk”(第一个换长)所指向的列表。[在从好几个DLL文件输入的情况下,输入地址表是包含所有DLL文件的“FirstThunk”(第一个换长)数组。目录项 IMAGE_DIRECTORY_ENTRY_IAT(输入地址表目录项)可能会丢失,但输入(函数)仍能工作良好。]

  “OriginalFirstThunk”(原始第一个换长)数组保持不变,因此你总能通过“OriginalFirstThunk”(原始第一个换长)列表查找原始的输入名字列表。

  现在输入已经被用正确的线性地址修正,如下所示:
   原始第一个换长    第一个换长
      |          |
      |          |
      |          |
      V          V
      0-->  函数1    0--> 输出函数1
      1-->  函数2    1--> 输出函数2
      2-->  函数3    2--> 输出函数3
      3-->  foo     3--> 输出函数foo
      4-->  mumpitz   4--> 输出函数mumpitz
      5-->  knuff    5--> 输出函数knuff
      6-->0      0<--6

这是简单情况下的基本结构。现在我们将要学习输入目录中的需细讲的东西。

标签: , ,

0 条评论:

发表评论

<< 主页

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

Powered by Blogger