• WinPE基础知识之导入表


    // 导入表 (结构体数组,以一个全零元素为结尾,每一个数组元素,代表一个PE文件导入信息)
    // 导入表存储的是从其它PE文件导入过来的函数名、序号,加载到内存之后,还存储这些函数的地址
    typedef struct _IMAGE_IMPORT_DESCRIPTOR {
        union {
            DWORD   Characteristics;            // 0 for terminating null import descriptor
            DWORD   OriginalFirstThunk;         // (重要)指向一个结构体数组的相对虚拟地址(RVA),即INT
        } DUMMYUNIONNAME;
        DWORD   TimeDateStamp;                  // 时间戳
        DWORD   ForwarderChain;                 // 链表的前一个结构
        DWORD   Name;                           // (有用)指向链表库名字的指针(RVA)
        DWORD   FirstThunk;                     // (重要)指向一个结构体数组的相对虚拟地址(RVA),即IAT
    } IMAGE_IMPORT_DESCRIPTOR;
    
    // INT与IAT所指的数据类型(结构体数组 以全零为结尾)
    // 在磁盘文件中他们存储的数据是相同的,在加载到内存后,加载器把相应PE文件的函数地址覆盖到这里
    // 在磁盘文件中,起作用的只有后面两个成员
    // 这个结构占据四个字节,假如最高位为1,那么序号导入起作用,假如最高位为0,那么是最后一个成员起作用
    // 判断最高位是否为1使用系统提供的宏IMAGE_SNAP_BY_ORDINAL(),参数就是这个结构体
    typedef struct _IMAGE_THUNK_DATA32 {
        union {
            DWORD ForwarderString;      // PBYTE 
            DWORD Function;             // 导入函数的地址,在加载到内存后,这里才起作用
            DWORD Ordinal;              // 假入是序号导入的用到这里
            DWORD AddressOfData;        // 假入是函数名导入的用到这里,它指向一个PIMAGE_IMPORT_BY_NAME结构体
        } u1;
    } IMAGE_THUNK_DATA32;
    
    // 上面结构体AddressOfData 指向的结构体
    typedef struct _IMAGE_IMPORT_BY_NAME {
        WORD    Hint;    // 函数编号
        CHAR   Name[1];  // 表示函数名的字符串
    } IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
  • 相关阅读:
    期末考试结束啦!!!
    【sdut2878】Circle
    【HDU4035】Maze
    【ZOJ3329】One Person Game
    【POJ2151】Check the difficulty of problems
    【CodeForces148D】Bag of mice
    【POJ2096】Collecting Bugs
    【HDU3853】LOOPS
    【HDU4405】Aeroplane_chess
    「Luogu P5826 【模板】子序列自动机」
  • 原文地址:https://www.cnblogs.com/duxie/p/10848262.html
Copyright © 2020-2023  润新知