我认识的PE文件之基地址

什么是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 应用程序进行设置。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值