WindowsPE 导入表

导入表在就是在.rdate 节表当然不绝对

WindowsPE 导入表

导入表在 数据目录 第2个 导入函数在第13个  

WindowsPE 导入表

 

 

 可以看到rdata 表 起始2000位置  导入表在2538   iat 在2000

这里的rva 地址都要转换为foa 地址  就是  当前rva-初始rva+foa偏移 就是文件物理偏移位置

通过数据找到导入表位置 就是IMAGE_IMPORT_DESCRIPTOR  结构

 

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 date\time 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;

这里5个值依次对应

WindowsPE 导入表

 

 

 WindowsPE 导入表

 

 OriginalFirstThunk ,指向IMAGE_THUNK_DATA  他是一个连续的

typedef struct _IMAGE_THUNK_DATA32 {
    union {
        DWORD ForwarderString;      // PBYTE 
        DWORD Function;             // PDWORD
        DWORD Ordinal;
        DWORD AddressOfData;        // PIMAGE_IMPORT_BY_NAME
    } u1;
} IMAGE_THUNK_DATA32;
typedef IMAGE_THUNK_DATA32 * PIMAGE_THUNK_DATA32;

WindowsPE 导入表

 

 这是值指向 

typedef struct _IMAGE_IMPORT_BY_NAME {
    WORD    Hint;
    CHAR   Name[1];
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;

WindowsPE 导入表

 

 WindowsPE 导入表

 

 FirstThunk 也是同样指向 

_IMAGE_IMPORT_BY_NAME 

WindowsPE 导入表

 

所以他是一个双桥结构

WindowsPE 导入表

 

 最后指向一样 不过 FirstThunk  在载入内存时会被替换成真正的函数地址 载入od 查看402000地址

WindowsPE 导入表

 

 WindowsPE 导入表

 

上一篇:扩大节、合并节


下一篇:脱壳与加壳-加壳-3-加壳代码实现