导入表:
(exe例子为:内存管理-VirtualAlloc)
LordPE查看其导入表RVA:
![](https://img.haomeiwen.com/i5676193/2ad1959ec8d29b9f.png)
010editor中验证:
![](https://img.haomeiwen.com/i5676193/62ba05fb2b1b19e0.png)
导入表位置,落在了.idata段:
![](https://img.haomeiwen.com/i5676193/f17a06269eebcd0b.png)
1A000 【7800】
1A1C8 【79C8】
79C8:(这个值为文件中的偏移,就是它在文件中的起始位置,利用79C8在010editor里面可以找到导入表)
在010editor中:
![](https://img.haomeiwen.com/i5676193/abd9c8df4a47fadd.png)
typedef struct _IMAGE_IMPORT_DESCRIPTOR{
union {
DWORD Characteristics;
DWORD OriginalFirstThunk;//指向一个结构体数组的相对位移,RVA to original unbound IAT (PIMAGE_THUNK_DATA)
}DUMMYUNIONNAME;
DWORD TimeDataStamp;
DWORD ForwarderChain;
DWORD Name; //导入的PE文件的名字的相对位移(RVA)
DWORD FirstThunk ;//指向一个结构体数组的相对位移(RVA to IAT)
}
![](https://img.haomeiwen.com/i5676193/794c8c5275e08db9.png)
![](https://img.haomeiwen.com/i5676193/a616b5b147334e38.png)
18 A2 01 00【OriginalFirstThunk:INT(Import Name Table)导入名称表地址RVA】
00 00 00 00
00 00 00 00
22 A4 01 00【DLL名称的RVA】
00 A0 01 00【IAT(Import Address Table)导入地址表地址RVA】
1.dll的名字【22 A4 01 00(小端)--->0001A422(因为1A000对应7800,故这里dll在文件中偏移为7C22)】
![](https://img.haomeiwen.com/i5676193/2d60d51951b4afb9.png)
2.看下INT(OriginalFirstThunk):1A218【7A18】(以全0结尾)
![](https://img.haomeiwen.com/i5676193/43949829397d47a0.png)
函数名数组(对应IMAGE_THUNK_DATA32结构体数组,每一个结构体就是一个联合体)
E0 A3 01 00----0001A3E0【7BE0】最高位为0,说明是以名称导入的,不是序号导入的;
一共导入了25个函数,这里只写一个,其他依次类推!
注意:IAT和INT都指向下面的这个数据结构,4Byte
typedef struct _IMAGE_THUNK_DATA32{
union{
DWORD ForwarderString;
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];//不定长,字符串
}
由上可知:是按照函数名导入的(大多数都是按名称导入的),故上面的地址值,就会指向一个PIMAGE_IMPORT_BY_NAME的结构体
【7BE0】
![](https://img.haomeiwen.com/i5676193/bf6865be1685deaa.png)
看下IAT(00 A0 01 00->0001A000-->【7800】)
![](https://img.haomeiwen.com/i5676193/d1ca820598085ddd.png)
发现最高位也都是0,所以,也是名称导入的,另外,还可以发现,这个位置的值,和INT的值是一样的,因此,不再赘述了
这里的kernel32.dll里面有25个函数
![](https://img.haomeiwen.com/i5676193/48eb6b6a86b7b5cc.png)
网友评论