关闭

我认识的PE文件之基地址

标签: PE文件基地址
909人阅读 评论(0) 收藏 举报
分类:

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

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:652898次
    • 积分:9306
    • 等级:
    • 排名:第2040名
    • 原创:375篇
    • 转载:99篇
    • 译文:0篇
    • 评论:64条
    最新评论