您的位置:澳门新葡8455最新网站 > 澳门新葡8455最新网站 > 输入表结构和输入地址表

输入表结构和输入地址表

发布时间:2019-11-04 10:57编辑:澳门新葡8455最新网站浏览(128)

    在 PE文件头的 IMAGE_OPTIONAL_HEADE奥迪TT RS 结构中的 DataDirectory(数据目录表) 的第二个成员正是指向输入表的。每种被链接进来的 DLL文件都各自对应三个IMAGE_IMPORT_DESC汉兰达IPTOKoleos (简单的称呼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文件的称谓。如:KERAV4NEL32.DLL卡塔尔。

    FirstThunk

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

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

     

    上边来表明下OriginalFirstThunk和FirstThunk。就个人知道来说:

    1. 在文件中时,他们都分别针对叁个福特ExplorerVA地址。这么些地址转换来文件中,分别对应四个以 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

    咱俩试着寻觅 MessageBoxA。首先深入分析 PE 头文件,找到导出表在文书中之处:

    图片 6

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

    接下去翻看 0x1064 处:

    图片 7

    能够获取多少个 DLL 的陈说,最终叁个_IMAGE_IMPORT_DESC奥迪Q5IPTOCRUISER以0填充表示甘休:

    那么生龙活虎旦三个个查看种种DLL对应的数码就能够找到,可是在此之前本人把富有的数额都看了下,在首先个DLL中

    基于第三个DLL描述的 OriginalFirstThunk 的 0x2350 转换能够理解,_IMAGE_THUNK_DATA32 在文件的 0x1150处,FirstThunk 指向的多少生龙活虎致:

    图片 8

    于是乎就拿到了文本中的 MessageBoxA 的信息。

    最后,在内部存款和储蓄器中 FirstThunk 所指地点上的_IMAGE_THUNK_DATA32 数组被 Windows 加载后被重写后就成了传说中的 IAT ,Import Address Table,输入地址表。使用 OllyDbg 查看运维时情状:

    图片 9

    本文由澳门新葡8455最新网站发布于澳门新葡8455最新网站,转载请注明出处:输入表结构和输入地址表

    关键词: