快捷搜索:

您的位置:澳门新葡4473网站 > 新闻社区 > [PE结构分析] 8.输入表结构和输入地址表(IAT)

[PE结构分析] 8.输入表结构和输入地址表(IAT)

发布时间:2019-10-10 07:07编辑:新闻社区浏览(152)

    在 PE文件头的 IMAGE_OPTIONAL_HEADE昂Cora 结构中的 DataDirectory(数据目录表) 的第三个分子正是指向输入表的。每一种被链接进来的 DLL文件都分别对应八个IMAGE_IMPORT_DESC奥德赛IPTO大切诺基 (简称IID) 数组结构。

    typedef struct _IMAGE_IMPORT_DESCRIPTOR {
        union {
            DWORD   Characteristics;            // 0 for terminating null import descriptor
            DWORD   OriginalFirstThunk;         // RVA to original unbound IAT (PIMAGE_THUNK_DATA)
        } DUMMYUNIONNAME;
        DWORD   TimeDateStamp;                  // 0 if not bound,
                                                // -1 if bound, and real datetime stamp
                                                // in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
                                                // O.W. date/time stamp of DLL bound to (Old BIND)
    
        DWORD   ForwarderChain;                 // -1 if no forwarders
        DWORD   Name;
        DWORD   FirstThunk;                     // RVA to IAT (if bound this IAT has actual addresses)
    } IMAGE_IMPORT_DESCRIPTOR;
    typedef IMAGE_IMPORT_DESCRIPTOR UNALIGNED *PIMAGE_IMPORT_DESCRIPTOR;
    

    在这么些IID数组中,并从未提议有多少个项(就是未有明显指明有稍许个链接文件),但它聊起底是以多少个全为NULL(0) 的 IID 作为实现的标志。

    上边只摘录相比较首要的字段:

    OriginalFirstThunk

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

    Name

    它象征DLL 名称的相对虚地址(译注:相对三个用null作为完成符的ASCII字符串的四个酷威VA,该字符串是该导入DLL文件的名称。如:KELX570NEL32.DLL)。

    FirstThunk

    它包蕴由IMAGE_THUNK_DATA定义的 first thunk数组的虚地址,通过loader用函数虚地址开头化thunk。

    在Orignal First Thunk缺席下,它指向first thunk:Hints和The Function names的thunks。

     

    上边来分解下OriginalFirstThunk和FirstThunk。就个人知道来讲:

    1. 在文书中时,他们都分别指向四个逍客VA地址。那么些地方转换成文件中,分别对应七个以 IMAGE_THUNK_DATA 为要素的的数组,那四个数组是以叁个填写为 0 的IMAGE_THUNK_DATA作为达成标记符。即使他们那八个表地方不一致,但其实内容是大同小异的。此时,每一种IMAGE_THUNK_DATA 成分指向的是多少个记下了函数名和相对应的DLL文件名的 IMAGE_IMPORT_BY_NAME结构体。

    1. 为啥会有四个同样的数组呢?是有缘由的:

    OriginalFirstThunk 指向的数组常常称为  hint-name table,即 HNT ,他在 PE 加载到内部存款和储蓄器中时被保留了下来且长久不会被退换。但是在 Windows 加载过 PE 到内部存款和储蓄器之后,Windows 会重写 FirstThunk 所指向的数组成分中的内容,使得数组中各样 IMAGE_THUNK_DATA 不再代表针对带有函数描述的 IMAGE_THUNK_DATA 成分,而是间接针对了函数地址。此时,FirstThunk 所指向的数组就叫做输入地址表(Import Address Table ,即平时说的 IAT)。

    重写前:

    图片 1

    重写后:

     图片 2

    (以上两张图片源于:)

    typedef struct _IMAGE_THUNK_DATA32 {
        union {
            DWORD ForwarderString;      // PBYTE  指向一个转向者字符串的RVA
            DWORD Function;             // PDWORD 被输入的函数的内存地址
             DWORD Ordinal;              // 被输入的 API 的序数值
             DWORD AddressOfData;        // PIMAGE_IMPORT_BY_NAME   指向 IMAGE_IMPORT_BY_NAME
        } u1;
    } IMAGE_THUNK_DATA32;
    typedef IMAGE_THUNK_DATA32 * PIMAGE_THUNK_DATA32;
    

    根据 _IMAGE_THUNK_DATA32 所指设想地址转到文件地方可以赢得实在的 _IMAGE_IMPORT_BY_NAME 数据

    typedef struct _IMAGE_IMPORT_BY_NAME {
        WORD   Hint;     // 序号 
    
        CHAR   Name[1];  // 实际上是一个可变长的以0为结尾的字符串
    
    } IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
    

     

    譬如说有程序:

    图片 3

    文字版:

    #include <windows.h>
    int WINAPI WinMain(_In_ HINSTANCE hInstance, 
        _In_opt_ HINSTANCE hPrevInstance,
        _In_ LPSTR lpCmdLine,
        _In_ int nShowCmd)
    {
        MessageBoxA(0, "hello", "my message", MB_OK);
        SetWindowTextA(0, "Si Wang");
    
        return 0;
    }
    

    此程序行使了七个 Windows API : MessageBoxA 和 SetWindowTextA

    编写翻译得到程序(为简化表达,区段地方由软件总括出):

    图片 4

    图片 5

    大家试着找寻 Message博克斯A。首先剖析 PE 头文件,找到导出表在文书中的地方:

    图片 6

    输入表地方在 .rdata 区段内, 0x2264 – 0x三千 = 0x0264 获得偏移量。加上文件地点 0x0E00 得到实在文件偏移量(0x0E00 + 0x264 = 0x1064):0x1064。

    接下去查看 0x1064 处:

    图片 7

    能够取得多少个 DLL 的叙说,最终二个_IMAGE_IMPORT_DESC途乐IPTORubicon以0填充表示结束:

    那正是说只要二个个查看各种DLL对应的多少就能够找到,不过在此之前自个儿把装有的数据都看了下,在首先个DLL中

    依附第三个DLL描述的 OriginalFirstThunk 的 0x2350 调换能够理解,_IMAGE_THUNK_DATA32 在文书的 0x1150处,FirstThunk 指向的数量一致:

    图片 8

    于是就收获了文本中的 MessageBoxA 的音讯。

    最后,在内部存储器中 FirstThunk 所指地方上的_IMAGE_THUNK_DATA32 数组被 Windows 加载后被重写后就成了典故中的 IAT ,Import Address Table,输入地址表。使用 OllyDbg 查看运维时意况:

    图片 9

    本文由澳门新葡4473网站发布于新闻社区,转载请注明出处:[PE结构分析] 8.输入表结构和输入地址表(IAT)

    关键词: