PE文件格式(2)
2007-01-14 20:15:04 来源:WEB开发网核心提示: 如果想从DLL"knurr"查找输入函数"foo"的信息,首先数据目录内找到IMAGE_DIRECTORY_ENTRY_IMPORT项,得到RVA,在rawsectiondata找到那个地址,PE文件格式(2)(10),现在我们有了一个数组IMAGE
如果想从DLL"knurr"查找输入函数"foo"的信息,首先数据目录内找到IMAGE_DIRECTORY_ENTRY_IMPORT项,得到RVA,在rawsectiondata找到那个地址,现在我们有了一个数组IMAGE_IMPORT_DESCRIPTORs.通过检查由NAME指向的的字符串,得到与DLL"knurr"有关的数组成员。当你发现了正确的IMAGE_IMPORT_DESCRIPTOR,沿着它的OriginalFirstThunk得到一个指针指向一个IMAGE_THUNK_DATAs数组;检查每个RVAs找到"foo".
为什么有两个指针列表指向IMAGE_IMPORT_BY_NAMEs?因为运行时,程序不需要输入函数名,需要的是地址,这里是地址表再次出现的地方,加载器在每个涉及的DLL输出目录内查找输入符号,使用DLL入口点的线性地址替换掉FirstThunk列表内的IMAGE_THUNK_DATA元素。记住带有标号"__imp__symbol的地址列表、被数据目录项
IMAGE_DIRECTORY_ENTRY_IAT指向的输入地址表,也确切地被'FirstThunk'指向.(假如输入来自几个不同的DLL,输入地址表由所有DLL的'FirstThunk'数组构成,目录项IMAGE_DIRECTORY_ENTRY_IAT可能丢失,输入依然工作的很好。'OriginalFirstThunk'数组保持不变,可以通过它查找输入名的的原始列表。
现在输入已经用正确线性地址打了补丁,如下所示:
OriginalFirstThunk FirstThunk
| |
| |
| |
V V
0--> func1 0--> exportedfunc1
1--> func2 1--> exportedfunc2
2--> func3 2--> exportedfunc3
3--> foo 3--> exportedfoo
4--> mumpitz 4--> exportedmumpitz
5--> knuff 5--> exportedknuff
6-->0 0<--6
这是最简单情况的基本结构,下面学习输入目录。
更多精彩
赞助商链接