PE Format(21)
ForwarderChain(中转链)
它是输入函数列表中第一个中转的、32位的索引。中转也是高级的东东。对初学者先将所有位设为-1。
Name(名称)
它是一个DLL文件的名称(0结尾的ASCII码字符串)的、32位的RVA。
FirstThunk(第一换长)
它也是一个RVA(32位),指向一个0结尾的、由IMAGE_THUNK_DATA(换长数据)的RVA构成的数组,其每个IMAGE_THUNK_DATA(换长数据)元素都描述一个函数。此数组是输入地址表的一部分,并且可以改变。
因此,数组中的每个IMAGE_IMPORT_DESCRIPTOR(输入描述结构)结构体都给出输出DLL文件的名称,并且,除了中转和时间日期戳,它还给出2个指向IMAGE_THUNK_DATA(换长数据)的数组的RVA,都是32位。(每个数组的最后一个成员都全部填充为0字节,以标志结尾。)
目前看来,每个IMAGE_THUNK_DATA(换长数据)都是一个RVA,指向一个描述输入函数的IMAGE_IMPORT_BY_NAME(输入名字)项。
现在,有趣的是两个数组并行运行,也就是说:它们指向同一组IMAGE_IMPORT_BY_NAME(输入名字)。
没有必要失望,我将再画一图。这里是IMAGE_IMPORT_DESCRIPTOR(输入描述结构)的关键内容:
原始第一个换长 第一个换长
| |
| |
| |
V V
0--> 函数1 <--0
1--> 函数2 <--1
2--> 函数3 <--2
3--> foo <--3
4--> mumpitz <--4
5--> knuff <--5
6-->0 0<--6 /*最后的RVA是0!*/
图当中的名字就是尚未讨论的IMAGE_IMPORT_BY_NAME(输入名字)。每一个都是一个16位的数字(一个提示)跟着一些数量未定的字节,它们都是以0结尾的、输入符号的ASCII码名字。
提示就是指向输出DLL文件名字表的索引(参见上面的输出目录)。那个索引中的名字将被一一尝试,如果没有相符的,再使用二进制搜索来寻找名字。
(有些链接器不愿意查找正确的提示,总是只简单的将其指定为1,或者其它的随意数字。这并无大害,只是使解决名字的第一次尝试总是失败,并迫使每个名字都使用二进制搜索来进行。)
它是输入函数列表中第一个中转的、32位的索引。中转也是高级的东东。对初学者先将所有位设为-1。
Name(名称)
它是一个DLL文件的名称(0结尾的ASCII码字符串)的、32位的RVA。
FirstThunk(第一换长)
它也是一个RVA(32位),指向一个0结尾的、由IMAGE_THUNK_DATA(换长数据)的RVA构成的数组,其每个IMAGE_THUNK_DATA(换长数据)元素都描述一个函数。此数组是输入地址表的一部分,并且可以改变。
因此,数组中的每个IMAGE_IMPORT_DESCRIPTOR(输入描述结构)结构体都给出输出DLL文件的名称,并且,除了中转和时间日期戳,它还给出2个指向IMAGE_THUNK_DATA(换长数据)的数组的RVA,都是32位。(每个数组的最后一个成员都全部填充为0字节,以标志结尾。)
目前看来,每个IMAGE_THUNK_DATA(换长数据)都是一个RVA,指向一个描述输入函数的IMAGE_IMPORT_BY_NAME(输入名字)项。
现在,有趣的是两个数组并行运行,也就是说:它们指向同一组IMAGE_IMPORT_BY_NAME(输入名字)。
没有必要失望,我将再画一图。这里是IMAGE_IMPORT_DESCRIPTOR(输入描述结构)的关键内容:
原始第一个换长 第一个换长
| |
| |
| |
V V
0--> 函数1 <--0
1--> 函数2 <--1
2--> 函数3 <--2
3--> foo <--3
4--> mumpitz <--4
5--> knuff <--5
6-->0 0<--6 /*最后的RVA是0!*/
图当中的名字就是尚未讨论的IMAGE_IMPORT_BY_NAME(输入名字)。每一个都是一个16位的数字(一个提示)跟着一些数量未定的字节,它们都是以0结尾的、输入符号的ASCII码名字。
提示就是指向输出DLL文件名字表的索引(参见上面的输出目录)。那个索引中的名字将被一一尝试,如果没有相符的,再使用二进制搜索来寻找名字。
(有些链接器不愿意查找正确的提示,总是只简单的将其指定为1,或者其它的随意数字。这并无大害,只是使解决名字的第一次尝试总是失败,并迫使每个名字都使用二进制搜索来进行。)

0 条评论:
发表评论
<< 主页