程序调用导入函数过程详解

在日常的程序开发中共享库的使用非常普遍,是代码重用非常重要的技术。那么程序是如何调用共享库中的代码段的呢?首先看一段汇编代码如下图,其中调用了两个导入函数MessageBoxA(user32.dll)和ExitProcess(kernel32.dll),以第一个函数为例进行分析,其中非常关键的一行代码是:JMP NEAR DWORD PTR DS:[BD2008],无条件转移指令跳转到0XBD2008所存放地址的位置,那么问题是0XBD2008处的值是多少呢?

通过od的Memory Map窗口可以找到此位置,具体值如下图所示,可以看到我们其实JMP指令最终会跳转到0X76D6FF46处。

好的,用od执行相关代码并按F7进入跳转地址内部:

那么这里的问题是之前的地址0XBD2008是什么呢?其实是IAT中被调用函数地址所对应的项的地址。Windows加载器在将PE文件加载到内存中时其首先会解析导入表,首先解析每一个IMAGE_IMPORT_DESCRIPTOR结构根据Name1指向的dll的名称将对应的共享库加载进入内存,接着由桥1指向的INT对应共享库中的函数名称得到内存中实际函数代码的VA并填充到对应IAT的相应项(注意:导入函数地址表地和导入函数名称表是一一对应的)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值