关于PE文件——输入表

来源:互联网 发布:中国梦军民融合大数据 编辑:程序博客网 时间:2024/05/29 03:29
什么是输入表?
输入表就相当于exe文件与DLL文件沟通的桥梁,形象的可以比喻成两个城市之间交流的高速公路。在PE文件映射到内存后,windows将相应的DLL文件装入,EXE文件通过“输入表”找到相应的DLL中的导入函数,从而完成程序的正常运行。
输入表的组成与工作原理?
首先大概了解整体的结构:
三个表:
        输入表: 对应IMAGE_IMPORT_DESCRIPTOR结构体。
        ②输入名称表(INT):对应IMAGE_THUNK_DATA结构体。
        ③输入地址表(IAT):也是对应IMAGE_THUNK_DATA结构体。

由1图,输入名称表(INT)和输入地址表(IAT)都是IMAGE_THUNK_DATA结构体的数组。并且这两个数组都是以一个空的结构体作为结束的。
    而IMAGE_THUNK_DATA实质上是四个指针(每个指针四字节,共16字节)组成的结构体。这里理解错了:IMAGE_THUNK_DATA不是四个指针的结构体,而是共用体(关键字:union)共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量union中,所有共用体成员共用一个空间,并且同一时间只能储存其中一个成员的值。结构如下:
    tyepedef struct _IMAGE_THUNK_DATA32

IMAGE_IMPORT_BY_NAME结构体:

以上内容来源:《黑客攻防免杀》作者:任晓珲 机械工业出版社

下面把流程走一下:来源: <http://blog.sina.com.cn/s/blog_3dc2673e010092rr.html>

假设我们要列出某个PE文件的所有引入函数,可以照着下面步骤走:

  1. 校验文件是否是有效的PE。
  2.  DOS header 定位到 PE header。
  3. 获取位于 OptionalHeader 数据目录地址。
  4. 转至数据目录的第二个成员提取其VirtualAddress值。
  5. 利用上值定位第一个 IMAGE_IMPORT_DESCRIPTOR 结构。
  6. 检查 OriginalFirstThunk值。若不为0,顺着 OriginalFirstThunk 里的RVA值转入那个RVA数组。若OriginalFirstThunk 为0,就改用FirstThunk值。有些连接器生成PE文件时会置OriginalFirstThunk值为0,这应该算是个bug。不过为了安全起见,我们还是检查 OriginalFirstThunk值先。
  7. 对于每个数组元素,我们比对元素值是否等于IMAGE_ORDINAL_FLAG32。如果该元素值的最高二进位为1,那么函数是由序数引入的,可以从该值的低字节提取序数。
  8. 如果元素值的最高二进位为0,就可将该值作为RVA转入 IMAGE_IMPORT_BY_NAME 数组,跳过 Hint 就是函数名字了。
  9. 再跳至下一个数组元素提取函数名一直到数组底部(它以null结尾)。现在我们已遍历完一个DLL的引入函数,接下去处理下一个DLL。
  10. 即跳转到下一个 IMAGE_IMPORT_DESCRIPTOR 并处理之,如此这般循环直到数组见底。(IMAGE_IMPORT_DESCRIPTOR 数组以一个全0域元素结尾)



0 0
原创粉丝点击