GetProcAddress寻找dll导出名称表中函数名称的策略--首项比对+二分法

博客介绍了GetProcAddress在查找DLL导出函数时的策略,首先对比第一项,若未找到则使用二分法。通过实例分析了函数查找顺序,并讨论了该策略对DLL函数名更改的影响。同时提到了隐式调用DLL时相同的行为,并警告了改名操作的注意事项。
摘要由CSDN通过智能技术生成

前言:

之前学完PE结构导出表后,原以为只要是出现在导出名称表中的函数,就可以被其他程序调用。最近研究java的JNI实现,调用dll时也想证明这一点,随便去windows拽了一个dll,随便改了一个导出名称表的函数名,来给java调用,发现竟然不行。而后回到C,写了一个.exe调用这个dll的改之后的方法还是不行,GetProcAddress返回值为0。ollydbg跟汇编跟了好久才发现,问题出在GetProcAddress函数内部的LdrpNameToOrdinal方法。windows在使用这个函数在导出名称表中找函数名时,并非从上到下轮询,而是先比对名称表第一个方法,然后再对其余项进行二分法查找。

正文:

我们编写完一个dll源码,其导出方法由编译器自动安排在导出表中。比如导出了名称为aaa1,aaa2, aaa3, aaa4, aaa5, aaa6,bbb1, bbb2, bbb3, bbb4, bbb5, bbb6,ccc1, ccc2,ccc3,ccc4,ccc5,ccc6的18个方法。无论用.def文件的方式定义导出,还是用__declspec(dllexport)的方式导出,以及无论函数的定义先后、导出序号先后,在导出名称表中,这些函数名称都是按照严格的字母顺序并且大小写敏感的方式排列的:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值