PE文件格式(2)
2007-01-14 20:15:04 来源:WEB开发网核心提示: TimeDateStamp32位时间戳,ForwarderChain输入函数第一个转发链的32位索引Name指向DLL名字的32位RVA,PE文件格式(2)(9),FirstThunk指向IMAGE_THUNK_DATAs数组的32位RVA,它是输入地址表的一部分,或者其他任意数字,只是导
TimeDateStamp 32位时间戳。
ForwarderChain输入函数第一个转发链的32位索引
Name指向DLL名字的32位RVA。
FirstThunk指向IMAGE_THUNK_DATAs数组的32位RVA,它是输入地址表的一部分,将发生变化。Thunk的意思就是查找,虚实变换的意思。
IMAGE_THUNK_DATA32STRUCT
unionu1
ForwarderStringdd ?
Functiondd ?
Ordinaldd ?
AddressOfDatadd ?
ends
IMAGE_THUNK_DATA32ENDS
以下是VC98,WINNT.h内的定义:
typedefstruct_IMAGE_THUNK_DATA64{
union{
PBYTE ForwarderString;
PDWORDFunction;
ULONGLONGOrdinal;
PIMAGE_IMPORT_BY_NAME AddressOfData;
}u1;
}IMAGE_THUNK_DATA64;
typedefIMAGE_THUNK_DATA64*PIMAGE_THUNK_DATA64;
于是每个IMAGE_IMPORT_DESCRIPTOR成员给出输出DLL的名字,2个RVAs指向IMAGE_THUNK_DATAs数组,数组的最后一个成员全部填充0表示结束。每个IMAGE_THUNK_DATA成员有一个指向IMAGE_IMPORT_BY_NAME的RVA,用以描述输入函数。有趣的是这些数组并行运行,他们指向相同的
IMAGE_IMPORT_BY_NAMEs(按名输入).
这是IMAGE_IMPORT_DESCRIPTOR必须的内容:
OriginalFirstThunk FirstThunk
| |
| |
| |
V V
0--> func1 <--0
1--> func2 <--1
2--> func3 <--2
3--> foo <--3
4--> mumpitz <--4
5--> knuff <--5
6-->0 0<--6 /*最后的RVA是0*/
IMAGE_IMPORT_BY_NAMESTRUCT
Hintdw ?
Name1db ?
IMAGE_IMPORT_BY_NAMEENDS
中间的名字是要讨论的IMAGE_IMPORT_BY_NAMEs.每个包括一个16位的hint,一个没有确定字节数的name,hint是一个输出DLL函数名字表(见前面输出目录)的索引,索引处的名字被测试,如果不匹配,则用二进制搜索来找到名字。有的链接器只是简单置1,或者其他任意数字。只是导致第一次搜索企图失败,然后强迫使用二进制搜索名字。
更多精彩
赞助商链接