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

能够发现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

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

能够发现:

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. python学习笔记(五岁以下儿童)深深浅浅的副本复印件,文件和文件夹

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

  2. 5岁自学python编程-python学习笔记(五岁以下儿童)深深浅浅的副本复印件,文件和文件夹...

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

  3. 斗争程序猿(四十一)——历史朝代大学(五岁以下儿童)——我的娱乐

    文/温国兵 忙碌的大学生活总要有属于自己的娱乐方式.琴棋书画也好,游戏运动也罢. 上大学开通了人人网.新浪微博.腾讯微博.再到后来的微信.陌陌.来往.易信.米聊.Line.WhatsAPP,加上最開始 ...

  4. 阐述linux IPC(五岁以下儿童):system V共享内存

    [版权声明:尊重原创.转载请保留源:blog.csdn.net/shallnet 要么 .../gentleliu,文章学习交流,不用于商业用途]         system V共享内存和posix ...

  5. 开玩笑html5(五岁以下儿童)---绕地球月球,地球绕太阳运动(canvas实现,同样可以移动哦)...

    请珍惜劳动小编成果,这篇文章是原来小编,转载请注明出处. 速度的參数与真实速度有点差距.大家能够自行调整 <!DOCTYPE html> <html> <head> ...

  6. Cocos2d-X中国象棋的发展《五岁以下儿童》摆棋

    在博客上,以实现创建的游戏场景.而一些button,因为button落实到事件作出详细答复,需要使用一些功能摆棋.为此我特意button上的背面的具体实施, 在摆棋前先理清一下摆棋的思路: 1.创建一 ...

  7. NGUI 3.5课程(五岁以下儿童)button-图片切换

    然后,我们去了一个样本,做一个button画面切换. 特征,像球员"开始"和"暂停". 写TestButton.cs脚本: using UnityEngine; ...

  8. 计算4000000000内的最大f(n)=n值---字符串的问题python实现(五岁以下儿童)

    问题: 写一个函数,计算4 000 000 000 以内的最大的那个f(n)=n的值,函数f的功能是统计全部0到n之间全部含有数字1的数字和.比方:f(13)= 6,由于"1"在& ...

  9. 用html5画地球椭圆绕太阳,开玩笑html5(五岁以下儿童)---绕地球月球,地球绕太阳运动(canvas实现,同样可以移动哦)...

    请珍惜劳动小编成果,这篇文章是原来小编,转载请注明出处. 速度的參数与真实速度有点差距.大家能够自行调整 地球绕着太阳转,月球绕着地球转 您的浏览器不支持canvas //获取画布 var canva ...

最新文章

  1. 软件测试2019:第二次作业
  2. 可能是基于 Hooks 和 Typescript 最好的状态管理工具
  3. sysbench测试mysql性能(TPS、QPS、IOPS)(重要)
  4. 我所了解的Chrome
  5. Yahoo网站性能最佳体验的34条黄金守则
  6. 如何在 Entity Framework 中计算 时间差 ?
  7. 成中集团线下IDC迁移上云
  8. Shell-删除误解压的文件
  9. 电商促销类插画素材,适合各种活动banner设计
  10. mave构建docker镜像Dokerfile,上传华为云镜像服务器CCE
  11. Flutter — 实现验证码倒计时功能
  12. springboot 集成 freemarker
  13. ext renderto
  14. ShadowGun Deadzone 放出 GM Kit Mod 包
  15. WINDOWS XP 桌面主题的安装制作
  16. RS485总线典型电路介绍
  17. button 和 input 的submit ,reset的区别
  18. CATIA二次开发开源项目—CATSearch
  19. socket(java) 搭建一个多人在线聊天室
  20. RobotStudio 项目移植问题——无法创建系统

热门文章

  1. 一些常用黑客工具的初步使用
  2. MyEclipse Web 项目的图标和右键New菜单
  3. Python 实例方法、类方法、静态方法的区别与作用
  4. 设计模式学习笔记-状态模式
  5. Linux操作_常用命令操作练习
  6. 跨域,json与jsonp格式
  7. java基础篇7----java.util中的Scanner类的使用
  8. iOS学习之Runtime(二)
  9. 【学习/研发】嵌入式Linux/Android开发有它就够了——迅为4412开发板
  10. SuperMap 房产政务协同管理平台