"Windows环境下32位汇编语言程序设计,着重讲解了导入表在PE文件被装入内存后的变化,以及导入地址表(IAT)的概念。"
在Windows操作系统中,PE(Portable Executable)文件格式是用于存放可执行程序、动态链接库(DLL)等的二进制文件格式。导入表是PE文件的一个关键组成部分,主要用于记录程序依赖的外部函数。当一个PE文件被Windows装载器加载到内存中时,导入表经历一系列的转换以确保程序能够正确调用这些外部函数。
图17.5展示了函数导入的方法,通常包括两个相同结构的IMAGE_THUNK_DATA数组,即OriginalFirstThunk和FirstThunk。在原始的PE文件中,FirstThunk字段的值通常是一个IMAGE_IMPORT_BY_NAME结构的数组,这些结构包含了函数的名称RVA(相对于节区的虚拟地址)。而OriginalFirstThunk字段则保留了原始的函数名称引用。
在内存中,如图17.6所示,Windows装载器会将FirstThunk数组中的每个双字(DWORD)替换为对应的函数实际入口地址。这样,当程序执行时,例如一条`call`指令调用`ExitProcess`函数,实际上会跳转到`ExitProcess`函数的入口地址,而不是之前的名称引用。这种转换过程使得程序能够在运行时找到并调用所需的库函数。
导入地址表(IAT,Import Address Table)就是FirstThunk字段所指向的数组,在PE文件加载到内存后,它被装载器更新为包含实际的函数入口地址。这是为了确保程序运行时能直接调用到正确的函数,而不是查找函数名。同时,OriginalFirstThunk字段保持不变,允许在运行时反向查询函数地址对应的导入函数名。
在《Windows环境下32位汇编语言程序设计》这本书中,作者详细阐述了如何在Windows环境下使用汇编语言进行编程,包括如何处理导入表和IAT,以实现对Windows API的调用。书中通过70多个实例,从基础到高级,逐步引导读者掌握Win32汇编语言编程技术,涵盖了从简单的“Hello,World!”程序到复杂如多线程、注册表操作和网络通信等内容。
通过学习这本书,读者不仅能了解Windows环境下的汇编语言编程,还能深入理解操作系统的工作原理,特别是与程序加载和执行相关的细节。对于那些希望使用汇编语言编写高效、低级别控制的Windows程序的开发者来说,这是一本宝贵的参考资料。