我认识的PE文件之基地址

原创 2015年07月10日 20:02:55

什么是PE文件?摆个连接吧,人家比我专业呢

PE文件:http://baike.baidu.com/view/1087038.htm

------------------------------------------------------------------------------------------------------------------------------------------------

EXE和DLL文件之间的区别完全是语义上的,英文他们使用完全伤痛的PE文件格式,而唯一的区别是就是用一个字段标识出这个文件是EXE还是DLL,

有必要知道:

64位Windows中只是度PE文件格式做了一些简单的修改,新的格式叫做PE32+。并没有任何新的结构加进去,改变的只是简单的将32位字段扩展成64位。


PE格式定义的主要地方位于我们的头文件: winnt.h 。这个头文件中几乎能找到关于PE文件的所有定义。 

这个是一款名为:everything的搜索神器搜索出的结果:


========================================================================================

先看看PE结构图吧


PE文件的概念

PE文件使用的是一个平面地址控件,所有的代码和数据被合并在一起,组成一个很大的结构。

文件的内容被分割为不同的区块,块中包含代码和数据,各个区块按页边界来对齐,区块段没有大小限制,是一个连续的结构。

认识PE文件不是作为单一内存映射文件被装如内存是很重要的。

Windows加载器(俗语PE装载器)遍历PE文件并决定文件的哪一部分被映射,这种映射方式是将文件较高的偏移位置映射到较高的内存地址中。

当磁盘文件一旦被装入内存中,磁盘上的数据结构布局和内存中的数据结构布局是一致的。

这样,如果知道在磁盘的数据结构中寻找一些内容,那么几乎都能被装入到内存映射文件中找到相同的信息。

但是,数据之间的相对位置可能改变,其某项的偏移地址可能区别于原始的偏移位置,不管怎样,所有表现出来的信息都允许从磁盘偏移到内存偏移的转换。

------------------------------  再来看一张图  --------------------------

PE文件通过Windows加载器加载到内存后,内存中的版本称为模块。映射文件的起始地址被称为模块的句柄,可以用过句柄访问内存其他的数据结构。这个初始内存地址也称为基地址,。准确的说,对于WindowsCE,这是不成立的。一个模块的句柄在WindowsCE下并不等于安装的起始地址。

在32位系统中,我们可以用下面的这个函数:

HMOUDLE GetModule(LPCTSTR lpModuleName)
获取指向DLL 的指针,通过指针访问DLL Module的内容。

当调用该函数的时候,传递一个可执行文件或者DLL文件名字字符串,如果找到系统文件则返回该可执行文件或者DLL文件映像加载到的基地址,也可以调用函数:GetModuleHandle,传递NULL参数,则返回调用的可制行文件的基地址。

基地址的值是由PE文件本身设定的,按照默认的设置,用visual c++建立的EXE文件,基地址是00400000h,DLL文件的基地址是10000000h。但是,可以在创建应用的时候改变这个地址,方法是在连接应用时使用连接程序的 / BASE 选项,或者链接后通过REBASE 应用程序进行设置。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~续~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

版权声明:欢迎转载,转载请标明出处! ^_^

相关文章推荐

【EXE PE】了解pe段--PE结构详解

来源:看雪论坛http://bbs.pediy.com/showthread.php?t=145912 1 基本概念 下表描述了贯穿于本文中的一些概念: 名称 描述 地址 是“虚拟地址...

PE文件地址与内存地址

1.      VC中可以通过#pragmadata_seg()可以将代码中的任意部分编译到PE的任意节中,节名也可以自己定义。如果文件经过了加壳处理,那么PE的节的信息就会变的非常“古怪”。 2....

逻辑地址、线性地址和物理地址的关系

、首先不得不提的历史          许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小...
  • prike
  • prike
  • 2016年10月02日 10:03
  • 1467

逻辑地址、线性地址、物理地址和虚拟地址理解

  逻辑地址(Logical Address) 是指由程式产生的和段相关的偏移地址部分。例如,你在进行C语言指针编程中,能读取指针变量本身值(&操作),实际上这个值就是逻辑地址,他是相对于你当前进程数...
  • do2jiang
  • do2jiang
  • 2009年09月02日 17:41
  • 22162

绕过PE文件地址随机化

  • 2017年11月21日 16:29
  • 2KB
  • 下载

[PE文件结构学习]1.相对虚拟地址(RVA)与物理地址的转换

正在学习PE文件结构,本人小菜鸟一个,如有不正确,欢迎指正。   PE结构即可执行文件的硬盘存储结构,Windows系统下面有exe dll等格式,PE结构先不介绍了,网上资料很多,看雪的文库里面...
  • sryan
  • sryan
  • 2012年09月06日 15:40
  • 4391

基地址和偏移地址的概念

首先必须明白 cpu和内存的区别 cpu 中央处理器 内存是物理数据存放的地方 cpu不直接存放数据而是通过内存来存放数据 cpu和内存之间通过20条地址总线相连接,地址总线就是cpu通过地址找...

PE文件的相对虚拟地址(RVA)和文件偏移地址(FOA)的转换

RVA(相对虚拟地址)和FOA(文件偏移)的具体含义大家可以看看《Windows PE 权威指南》或者是小甲鱼的PE结构详解视频,我相信大家看完之后一定会理解的,我这里就不写这些概念了。之所以会产生两...

认识PE文件格式 - 输出表(Export)

当一个dll中的函数能被exe文件、或其他dll调用时,这样的函数称为“输出函数”。创建一个dll,实际上创建了一组能被exe或其他dll调用的函数,当该dll被装入内存时,PE装载器根据该dll中的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:我认识的PE文件之基地址
举报原因:
原因补充:

(最多只允许输入30个字)