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

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

程序调用导入函数过程详解_第1张图片

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

程序调用导入函数过程详解_第2张图片

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

程序调用导入函数过程详解_第3张图片

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

你可能感兴趣的:(PE)