zoukankan      html  css  js  c++  java
  • PE结构学习笔记(八)

    Chinese:

    1、输入表是以一个IMAGE_IMPORT_DESCRIPTOR(简称IID)的数组开始。每个被PE文件链接进来的dll文件都分别对应一个IID数组结构。在这个IID数组中,并没有指出有多少个项(就是没有明确指明有多少个链接文件),但它最后是以一个全为NULL(0)的IID作为结束的标志。

    IMAGE_IMPORT_DESCRIPTOR结构定义如下:

    IMAGE_IMPORT_DESCRIPTOR STRUCT
        union
            Characteristics    DWORD    ?
            OriginalFirstThunk    DWORD    ?
        ends
        TimeDateStamp    DWORD    ?
        ForwarderChain    DWORD    ?
        Name    DWORD    ?
        FirstThunk    DWORD    ?
    IMAGE_IMPORT_DESCRIPTOR ENDS

    成员介绍:

    OriginalFirstThunk

    它指向first thunk, IMAGE_THUNK_DATA,该thunk拥有Hint和Function name的地址。

    TimeDateStamp

    该字段可以忽略。如果那里有绑定的话它包含时间/数据戳(time/data stamp)。如果它是0,就没有绑定在被导入的dll中发生。在最近,它被设置为0xFFFFFFFF以表示绑定发生。

    ForwardChain

    一般情况下可忽略。在老版的绑定中,它引用api的第一个forwarder chain(传递器链表)。它可被设置为0xFFFFFFFF以代表没有forwarder。

    Name

    它表示dll名称的相对虚地址(相对一个用null作为结束符的ASCII字符串的一个RVA,该字符串是该导入dll文件的名称,如kernel32.dll)

    FirstThunk

    它包含由IMAGE_THUNK_DATA定义的first thunk数组的虚地址,通过loader用函数虚地址初始化thunk。在Orignal First Thunk缺席下,它指向first thunk: Hints和The Function names的thunks。

    2、IMAGE_THUNK_DATA结构

    IMAGE_THUNK_DATA STRUCT
        union u1
            ForwarderString    DWORD    ?    ;指向一个转向者字符串的RVA
            Function    DWORD    ?    ;被输入的函数的内存地址
            Ordinal    DWORD    ?    ;被输入的api的序数值
            AddressOfData    DWORD    ?    ;指向IMAGE_IMPORT_BY_NAME
        ends
    IMAGE_THUNK_DATA ENDS

    IMAGE_THUNK_DATA值的最高位为1时,表示函数以序号方式输入,这时候低31位被看作一个函数序号。

    IMAGE_THUNK_DATA值得最高位为0时,表示函数以字符串类型的函数名方式输入,这时双字的值是一个RVA,指向一个IMAGE_IMPORT_BY_NAME结构。

    3、IMAGE_IMPORT_BY_NAME结构

    IMAGE_IMPORT_BY_NAME STRUCT
        Hint    WORD    ?
        Name    BYTE    ?
    IMAGE_IMPORT_BY_NAME

    Hint字段表示函数的序号,不过这个字段是可选的,有些编译器总是将它设置为0。

    Name字段定义了导入函数的名称字符串,这是一个以0为结尾的字符串。

     

    4、输入地址表(IAT)

    为什么有两个并行的指针数组同时指向IMAGE_IMPORT_BY_NAME结构呢?第一个数组(由OriginalFirstThunk所指向)是单独的一项,并且不能被改写,称为INT。第二个数组(由FirstThunk所指向)事实上是由PE装载器重写的。

    5、PE装载器首先搜索OriginalFirstThunk,找到之后加载程序迭代搜索数组中的每个指针,找到每个IMAGE_IMPORT_BY_NAME结构所指向的输入函数的地址,然后加载器用函数真正入口地址来替代由FirstThunk数组中的一个入口,因此我们称为输入地址表(IAT)

    此时输入表的其他部分就不重要的,程序依靠IAT提供的函数地址就可正常运行。

  • 相关阅读:
    ssm框架配置文件
    接口调用post请求参数在body中
    mysql三种连接方式
    jwt认证登录
    JWT工具类
    token的创建及解析
    IIS目录
    C# 增加多个分部类
    计算机知识
    Kibana 的安装(Windows版本)
  • 原文地址:https://www.cnblogs.com/maplewan/p/3235431.html
Copyright © 2011-2022 走看看