PE文件格式(2)
2007-01-14 20:15:04 来源:WEB开发网核心提示: 下面是指向其成员为指向符号名的32位RVA的数组'AddressOfNames',和一个指向16位序数的数组的32位RVAAddressOfNameOrdinals'.两个数组都含有'NumberOfNames'个元素.符号名可能全部丢失,所以
下面是指向其成员为指向符号名的32位RVA的数组'AddressOfNames',和一个指向16位序数的数组的32位RVAAddressOfNameOrdinals'.两个数组都含有'NumberOfNames'个元素.符号名可能全部丢失,所以'AddressOfNames'是0.否则被指向的数组并行运行,'AddressOfNames'数组包含指向0结尾的输出名的RVAs。名字都按照字母顺序保存,便于高效检索名字。根据PE规范,AddressOfNameOrdinals数组含有相应名字的序数,但实际上含有AddressOfFunctions数组的索引。序数=BASE+INDEX。
上述3表的示意图:
AddressOfFunctions 函数地址指向一个地址数组
|
|
v
exportedRVAwithordinal'Base' //带有序号的输出函数的RVA
exportedRVAwithordinal'Base'+1
...
exportedRVAwithordinal'Base'+'NumberOfFunctions'-1
AddressOfNames AddressOfNameOrdinals
| |
| |
v v
RVAtofirstname <->Indexofexportforfirstname
RVAtosecondname <->Indexofexportforsecondname
... ...
RVAtoname'NumberOfNames'<->Indexofexportforname'NumberOfNames'
名字地址指向名字RVA数组 “名字序数地址”指向名字序数数组
要按照序数找出输出符号:减去'Base'得到索引,跟随AddressOfFunctionsRVA找到输出数组,用索引定位输出符号RVA所在元素。如果没有指向输出节,你就完成任务了。否则,如果指向一个描述输出DLL名字和序数的串,你必须查找被转发的输出项。
更多精彩
赞助商链接