PE体系
PE结构&整体叙述
PE结构&导入表
PE结构&导出表
PE结构&基址重定位表
PE结构&绑定导入实现
PE结构&延迟加载导入表
导入表简介
当我们源文件里面需要去如何画窗口,如何显示指定字符串这样功能的代码,只需要简单调用Windows API函数。这些调用的函数在源文件中并不存在。这些代码存储在DLL文件中,即动态链接库中。在动态链接库里存放的不是函数的源代码,而是编译链接后生成的字节码。
当源程序调用了动态链接库的相关函数,在进行编译和链接的时候,编译程序和链接程序就会把调用的相关信息写入最终生成的PE文件中,从而来告诉操作系统这些函数的执行字节码能从哪里获取,这些信息就是导入表所要描述的内容。
DLL加载方式有两种:显式链接(Explicit Linking) 和 隐式链接(Implicit Linking)
- 显示链接:程序在使用DLL时进行加载,使用完毕后释放内存
- 隐式链接:程序在开始时即一同加载DLL,程序终止时再释放占用的内存
IAT提供的机制与DLL的隐式链接有关。
优点:
- 不把函数库包含进应用程序中,单独组成DLL文件,在需要使用时再进行调用。
- 使用内存映射技术将加载后的DLL代码、资源在多个进程中实现共享。
- 在对函数库进行更新时,只更新DLL文件即可。
导入函数
当我们调用一个API时,这个API我们不可能自己手写,基础源码这些东西都不知道,所以直接导入头文件然后使用即可。
#include<iostream>
#include<Windows.h>
using namespace std;
int main() {
LPCSTR text = "hello world";
LPCSTR title = "第一个MessageBoxA";
MessageBoxA(NULL, text, title, MB_OK);
}
关于API调用的汇编代码如下:
.text:00401516 mov [ebp+text], offset aHelloWorld ; "hello world"
.text:0040151D mov [ebp+title], offset unk_48800C
.text:00401524 mov dword ptr [esp+0Ch]<

本文深入探讨了PE文件格式中的导入表结构,包括其组成部分、工作原理及在内存中的表现形式。介绍了导入表如何帮助程序调用外部DLL文件中的函数,并解析了不同类型的链接方式及其优缺点。
最低0.47元/天 解锁文章
1371

被折叠的 条评论
为什么被折叠?



