我认识的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 应用程序进行设置。
~~~~~~续~~~~~~~~~~
还没有评论,来说两句吧...