基础知识

二进制文件概述

PE文件格式,是win32平台下可执行文件遵守的数据格式,常见的可执行文件exe,dll都是典型的pe文件

PE文件规定了所有信息在可执行文件中如何组织,相当于一种约定

PE文件格式把可执行文件分成若干个数据节,不同的资源被放在不同的节中

一个典型的pe文件包含的节如下:

.text 由编译器产生,存放着二进制的机器代码,是反汇编和调试的对象

.data 初始化的数据块,如宏定义,全局变量,静态变量等

.idata 可执行文件所使用的动态链接库等外来函数与文件的信息

.rsrc 存放程序的资源,如图标,菜单等

除此之外,还可能包括.reloc,.edata,.tls,.rdata等

 

虚拟内存

Windows系统的内存被分为两个层面,物理内存和虚拟内存

物理内存较为复杂,需要进入内核R0层才能看到

通常,在用户模式下,调试器看到的内存地址都是虚拟内存

 

windows可以让所有进程都相信自己拥有独立的4GB内存空间,但是计算机实际的内存条可能只有512MB

这一切都是通过虚拟内存管理器的映射来做到的

虽然每个进程都相信自己拥有4GB的空间,但是实际上他们运行起来时真正能用到的空间根本没有4GB

内存管理器只是分给了进程一些虚拟地址,可以说是假地址,让程序认为自己有4GB的空间可以运行

当程序实际需要进行内存操作时,内存管理器才会把虚拟地址和实际的的物理地址联系起来

进程所拥有的4GB虚拟内存中包含了程序运行时所需要的资源

 

操作系统中也存在虚拟内存的概念,那个是指当实际物理内存不够时,有时操作系统会把部分硬盘空间当作内存使用从而让程序运行

这里的虚拟内存与硬盘虚拟内存不同

 

PE文件与虚拟内存之间的映射

静态反汇编调试工具中看到的PE文件中某条指令的位置是相对于磁盘文件而言的,即所谓的文件偏移

我们在某些情况下可能还需要知道这条指令在内存中的地址,即虚拟内存地址(VA)

反之,在调试时看到的某条指令的地址是虚拟内存地址,也需要经常返回PE文件中找到这条指令对应的机器码

 

概念:

文件偏移地址

数据在PE文件中的地址叫文件偏移地址(或者说是文件地址),这是文件在磁盘上存放时相对于文件开头的偏移

 

装载基址

PE装入内存时的基地址,默认情况下,EXE文件在内存中的基地址是0X00400000,DLL文件是0X10000000

(位置可以通过修改编译选项变更)

 

虚拟内存地址

PE文件中的指令被装入内存后的地址

 

相对虚拟地址

相对虚拟地址是内存地址相当于映射基址的偏移量

 

虚拟内存地址,映射基址,相对虚拟内存地址三者关系:

虚拟内存地址 = 装载基址 + 相对虚拟地址

 

 

 

 

posted @ 2022-09-20 21:44  溪辰  阅读(26)  评论(0)    收藏  举报