目录
IAT(Import Address Table)、INT(Import Name Table)、IDT(Import Directory Table)
对一个动态链接库里导出的函数的调用,既可以通过函数名称来进行,也可以通过函数在导出表的索引来进行。
前言:
可以从这里入门https://www.cnblogs.com/milantgh/p/3953713.html
配合这个博客查找上面不懂的https://www.cnblogs.com/bokernb/articles/6116512.html
开始需要大概了解一些名词:
关于地址和一些名词的理解,这个博客非常细致:https://blog.csdn.net/hguisu/article/details/5713099
需要知道的一些地址(后面会再来分析):
- VA:virtrual address 虚拟地址,也就是内存中的地址:
- RVA:relative virtrual address 相对虚拟地址,等于VA-ImageBase
- ImageBase:基地址
虚拟内存不考虑物理内存的大小和信息存放的实际位置,只规定进程中相互关联信息的相对位置。每个进程都拥有自己的虚拟内存,且虚拟内存的大小由处理机的地址结构和寻址方式决定。
关于程序如何运行
- 首先是要编译,由编译程序(Compiler)将用户源代码编译成cpu可执行的目标代码,产生了若干个目标模块(Object Module)(即若干程序段),
- 其次是链接,由链接程序(Linker)将编译后形成的一组目标模块(程序段),以及它们所需要的库函数链接在一起,形成一个完整的装入模块(Load Module);
- 最后是装入,由装入程序(Loader)将装入模块装入内存
程序的装入(地址的变换)
绝对装入方式:程序中的逻辑地址与实际内存地址完全相同
静态地址重定位(可重定位装入方式) :多道程序环境下,编译程序不可能预知所编译的目标模块应放在内存的何处,所得到的目标模块的起始地址通常是从 0 开始的,程序中的其它地址也都是相对于起始地址计算的,根据内存的当前情况,将装入模块装入到内存的适当位置。 静态地址重定位即在程序开始运行前,程序中指令和数据的各个地址均已完成重定位,即完成虚拟地址到内存地址映射。地址变换通常是在装入时一次完成的,以后不再改变。 采用可重定位装入程序将装入模块装入内存后, 会使装入模块中的所有逻辑地址与实际装入内存的物理地址不同
可以看个例题: