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;

 

上一篇:Docker进阶


下一篇:SAR信号处理基础——脉冲压缩/匹配滤波