我认识的PE文件之基地址

末蓝、 2022-08-02 05:48 298阅读 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的搜索神器搜索出的结果:

Center

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

先看看PE结构图吧

Center 1

PE文件的概念

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

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

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

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

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

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

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

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

Center 2

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

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

  1. HMOUDLE GetModule(LPCTSTR lpModuleName)

获取指向DLL 的指针,通过指针访问DLL Module的内容。

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

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

~~~~~~~~~~~~~~~~

发表评论

表情:
评论列表 (有 0 条评论,298人围观)

还没有评论,来说两句吧...

相关阅读

    相关 PE文件

    PE文件全称:Portable Executable,可移植可执行文件 常见PE文件的后缀名:exe、dll PE文件吧可执行文件分成若干个数据节(section):.te

    相关 通过进程ID获取基地

    下面代码是通过进程ID来获取进程的[基地址][Link 1],创建一个进程快照后,读取进程模块,一般情况下第一个模块就是进程的基地址,下面的程序通过模块的字符串匹配来找到基地址