PE文件结构(五岁以下儿童)

參考

书:《加密与解密》

视频:小甲鱼 解密系列 视频

基址重定位

链接器生成一个PE文件时,它会如果程序被装入时使用的默认ImageBase基地址(VC默认exe基地址00400000h。dll基地址10000000h),而且会把代码中全部指令中用到的地址都使用默认的基地址(比如 程序代码中 push 10001000,就是把10000000h当做了基地址,把push 10001000写入到文件里)。如果一个exe程序中一个dll装载时的地址与其他dll地址发生冲突(由于windows程序是虚拟地址空间,exe一般不会有地址冲突,载入dll时可能会有地址冲突),就须要改动代码中的地址,如push
10001000。call 10002000等。

这时就须要用进行基址重定位。而基址重定位表中存放了,假设默认地址被改。须要改动的代码的地址。在PE文件里。基址重定位表一般放在一个单独的 ".reloc" 区。能够通过IMAGE_OPTIONAL_HEADER 中 的DataDirectory[5] 查看 基址重定位表 的RVA。

比如:

用W32Dasm 查看 Demo.dll  (下载地址:http://pan.baidu.com/s/1qWDepo4)

图片1

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmlsbHZzbWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

能够发现MyMessageBox 这个函数,看看它的代码中的push 10006040 。 push 10006030 中的地址是指向字符串的。

假设一个程序在载入Demo.dll时由于Demo.dll 默认的地址被占用了。而使用其他的基地址,比如使用20000000h作为基地址,Demo.dll就从20000000h開始装载。这样字符串“Demo”和“Hello World!” 就不是在10006040h跟10006030h中了,这时就须要把push 10006040 。 push 10006030改成push
20006040 , push 20006030 。

基址重定位表是由一个一个IMAGE_BASE_RELOCATION结构  构成的。

图片2

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmlsbHZzbWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" height="455" width="587" alt="">

IMAGE_BASE_RELOCATION 结构:

typedef struct _IMAGE_BASE_RELOCATION {
DWORD VirtualAddress;
DWORD SizeOfBlock;
// WORD TypeOffset[];
} IMAGE_BASE_RELOCATION;
typedef IMAGE_BASE_RELOCATION UNALIGNED * PIMAGE_BASE_RELOCATION;

当中 VirtualAddress  表示 这一组地址的起始RVA。

SizeOfBlock表示当前这个IMAGE_BASE_RELOCATION 结构的大小。TypeOffset是一个数组,它的元素个数就是( SizeOfBlock - 8 ) / 2 ,TypeOffset 每个元素占用两个字节即16位。当中高4位表示重定位类型(一般都为3)。低12位表示重定位地址。



实例分析:

查看Demo.dll的第一个 IMAGE_BASE_RELOCATION 结构

图片3

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmlsbHZzbWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

能够发现:

VirtualAddress  为1000h

SizeOfBlock      为 0164h

TypeOffset[0]   0333h  即 3是重定位类型  33h为重定位地址

TypeOffset[1]   0338h

TypeOffset[2]   0340h

........

通过Type低12位+VirtualAddress 能够知道前三个的地址为1033h,1038h。1040h 。

再来看看图片1中Demo.dll的代码,能够发现1033h就是图片1中的push 10006040中的10006040,1038h就是push 10006030中的10006030 。

假设载入dll,发现不是使用默认的基地址,PE载入器就会把基址重定位表中所写的地址的值改掉。

改掉方法是把原先的值加上 实际基地址 - 默认基地址 的值。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

PE文件结构(五岁以下儿童)基地搬迁的更多相关文章

  1. (五岁以下儿童)NS3样本演示:桥模块演示样品csma-bridge.cc凝视程序

    (五岁以下儿童)NS3:桥模块演示样品csma-bridge.cc凝视程序 1.Ns3 bridge模csma-bridge.cc演示示例程序的目光 // Network topology // // ...

  2. linux下一个Oracle11g RAC建立(五岁以下儿童)

    linux下一个Oracle11g RAC建立(五岁以下儿童) 四.建立主机之间的信任关系(node1.node2) 建立节点之间oracle .grid 用户之间的信任(通过ssh 建立公钥和私钥) ...

  3. python学习笔记(五岁以下儿童)深深浅浅的副本复印件,文件和文件夹

    python学习笔记(五岁以下儿童) 深拷贝-浅拷贝 浅拷贝就是对引用的拷贝(仅仅拷贝父对象) 深拷贝就是对对象的资源拷贝 普通的复制,仅仅是添加了一个指向同一个地址空间的"标签" ...

  4. ExtJs4得知(五岁以下儿童)主要的Ext分类

    Ext类是ExtJs最常见的.最基本的类,它是一个全局对象,它封装了全班.辛格尔顿和 Sencha 该方法提供了一种有用的库. 嵌套在该命名空间中一个较低的水平最用户界面组件. 但是提供了很多有用的功 ...

  5. Scrapy研究和探索(五岁以下儿童)——爬行自己主动多页(抢别人博客所有文章)

    首先.在教程(二)(http://blog.csdn.net/u012150179/article/details/32911511)中,研究的是爬取单个网页的方法.在教程(三)(http://blo ...

  6. nagios二次开发(五岁以下儿童)---nagios和nagiosql关系

    基于nagios和nagiosql理解.这将是这两个梳理比较粗糙的简单关系,有关详细信息,请参阅下面的图如:      从上面的关系图中能够看出,nagios与nagiosql共享了主机.主机组.服务 ...

  7. 开玩笑Web它servlet(五岁以下儿童)---- 如何解决servlet线程安全问题

    servlet默认值是安全线的存在,但说白,servlet安全线实际上是一个多线程线程安全问题.因为servlet它正好是一个多线程的安全问题出现. 每次通过浏览器http同意提交请求,将一个实例se ...

  8. Lichee (五岁以下儿童) sysconfig1.fex 配置系统

    sysconfig配置系统,作为一个通用的软件平台,还希望通过它.能够适应用户不同的方案.通过给出一个相应的配置.用户的方案就能够自己主动执行,而不须要改动系统里面的代码,或者又一次给出參数. 一. ...

  9. nyoj 228 士兵杀死(五岁以下儿童)【树状数组】

    分析:这个问题问的是,因为它是一个单独的更新.因此,让我们更新,然后在c[i]表现为1~i之间,还原之后看起来像一个. #include <cstdio> #include <cst ...

随机推荐

  1. 【本·伍德Lua专栏】补充的基础09:使用table.concat将一个大的字符串

    近期2天都没有写新的文章了.主要是近期的内容没有特别有意思的. 之前的协同程序也临时没有感觉到特别适用的地方.今天在看数据结构的部分,也是没多大意思(不代表没用). 但是突然发现了一个有意思的地方,那 ...

  2. 【从零学习openCV】IOS7根据人脸检测

    前言: 人脸检測与识别一直是计算机视觉领域一大热门研究方向,并且也从安全监控等工业级的应用扩展到了手机移动端的app.总之随着人脸识别技术获得突破,其应用前景和市场价值都是不可估量的,眼下在学习ope ...

  3. 有意练习--Rails RESTful(一)

    书要反复提及<哪里有天才>在说,大多数所谓的天才是通过反复刻意练习获得. 当你的练习时间达到10000几个小时后,.你将成为该领域的专家. 近期在学习rails怎样实现RESTful We ...

  4. JavaScript之三:jQuery插件开发(一)

    在早期的开发中,正如前面闭包中所提到的那样,人们一开始并没有意识到要开发出插件这么个玩意儿,都是遇到啥写啥.在长期的工作中,人们发现很多代码是重复的,写了一遍又一遍,以登录页面为例,每写一次都需要重新 ...

  5. DBA查询命令积累——不断更新

    原文:DBA查询命令积累--不断更新 一.服务器配置: 1.兼容级别:兼容级别只影响指定数据库中的行为,而不会影响整个服务器上的行为. 1.1.查看数据库兼容级别及更改兼容级别: SELECT com ...

  6. 实例教程Unity3D单例模式(一)通经常使使用方法

    unity3d教程 中的单例模式通经常使使用方法 通经常使使用方法是在相关类增加GetInstance()的静态方法,检查实例是否存在.假设存在,则返回.假设不存在.则返回一个"须要用游戏元 ...

  7. tomcat配置sqlserver数据库

    1. 首先确保Tomcat安装文件夹中的\common\lib(对于Tomcat5.5)或者是\lib(Tomcat6.0)文件夹中已包括JDBC连接数据库所必须的三个.jar文件(msbase.ja ...

  8. iphone手机版降级

    想减少移动版本号.你能下载下来你想要的版本在苹果开发者网站,或"信誉"或可以下载到其他网站的iPhone下载固件固件网站.然后打开iTunes,进入 然后按着(alt).同一时候用 ...

  9. freemarker 空白处理

    1 一个简短的引论 HTML 和 XML 都不是对空白敏感的,可是这么多多余的空白是非常令人头疼的,并且添加处理后的 HTML 文件大小也是不是必需的.当然,对于空白敏感的方式的输出这依然是个大问题. ...

  10. React.js终探(五)

    在React中,一切都是看做组件. 而组件的嵌套也是十分常见的. 所以有的组件就作为容器组件 容器组件 React元素可以包含子元素 如 //JSX <ezpanel title="t ...