PE学习(9) 用名称序号找导出函数地址

导出表的结构

该表项中的值是RVA(加上ImageBase才是函数真正的地址)

以上部分字段对应的关系

对于AddressOfNameOrdinals表来说:存储的内容 + Base = 函数的导出序号

函数的真正的名字在文件中位置是不确定的,在AddressOfNames中记录了函数名地址,是有序的

用函数名找地址

如何根据函数名字获得函数的地址

AddressOfNamesAddressOfNameOrdinals是相互对应的。搜索的函数名在AddressOfNames中的位置是第i 个,那么该名称对应的AddressOfNameOrdinals中的位置也是第i个,即两个数组下标是对应相同的

例如图中的红色高亮,索引为2表示第3个元素,根据记下的下标,找该函数的索引值,也就是寻址到AddressOfNameOrdinals的第3个元素

将记下的值4作为AddressOfFunctions数组的下标,找出该函数的RVA再进行转换得到VA

 

解析PE头部代码不变

通过数据目录记录的导出表RVA,找到对应的FOA地址

RVA转FOA核心代码如下:

参考上图,拿到导出表FOA后即可获得其中的三张表:

根据函数序号表索引和函数地址表对应的规律,遍历两个表进行搜索

得到当前索引i在函数名称表中的偏移

拿到当前索引在函数名称表中具体的值

保存的值是一个RVA字符串地址,转为FOA

如果与我们需要的字符串相等,跳出

对于隐藏函数来说,是找不到函数名序号的

 

参考图片,此时的索引i在序号表中对应的值,是函数地址表的索引

拿到序号表中保存的值(注意序号表宽度是WORD

通过序号拿到函数地址RVA

 

到此为止代码就完成了

运行测试

 

用序号找函数地址

如何通过函数的导出序号获取函数的地址

假设导出序号是10,导出表的Base是5,那么函数地址数组下标应该是10-5

用下标5去AddressOfFunctions找到RVA再进行转换得到VA

 

于是记录在序号表中的内容为

拿到函数地址表FOA

函数地址表第Sequence个是输入序号对应的函数地址

 

完整代码