首页 > 其他分享 >P50重定位表

P50重定位表

时间:2023-05-08 18:56:25浏览次数:34  
标签:定位 IMAGE RELOCATION 地址 P50 VirtualAddress 加载

程序加载的过程:
1、一般情况下,EXE都是可以按照ImageBase的地址进行加载的.因为Exe拥有自己独立的4GB 的虚拟内存空间
但DLL 不是 DLL是有EXE使用它,才加载到相关EXE的进程空间的.
2、为了提高搜索的速度,模块间地址也是要对齐的 模块地址对齐为10000H 也就是64K


打开一个程序,观察一下全局变量的反汇编

00401D58 A1 44 CA 42 00 mov eax,[x (0042ca44)]
00401D5D 50 push eax
00401D5E 68 EC 91 42 00 push offset string "%d\n" (004291ec)
00401D63 E8 28 62 00 00 call printf (00407f90)

 

编译时生成的地址 = ImageBase + RVA
这个地址在程序编译完成后,已经写入文件了。
那假设,程序在加载的时候,没有按照预定的400000 载入到指定的位置,但程序执行的时候,仍然会按照0042ca44 和 004291ec 的地址去使用这个值!
1、也就是说,如果程序能够按照预定的ImageBase来加载的话,那么就不需要重定位表
这也是为什么exe很少有重定位表,而DLL大多都有重定位表的原因
2、一旦某个模块没有按照ImageBase进行加载,那么所有类似上面中的地址就都需要修正,否则,引用的地址就是无效的.
3、一个EXE中,需要修正的地方会很多,那我们如何来记录都有哪些地方需要修正呢?
答案就是重定位表


重定位表的定位:
数据目录项的第6个结构,就是重定位表.

typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress;
DWORD Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

RVA转FOA

typedef struct _IMAGE_BASE_RELOCATION {
DWORD VirtualAddress;
DWORD SizeOfBlock;
} IMAGE_BASE_RELOCATION;
typedef IMAGE_BASE_RELOCATION ,* PIMAGE_BASE_RELOCATION; 

解析说明:

1、通过IMAGE_DATA_DIRECTORY结构的VirtualAddress
属性 找到第一个IMAGE_BASE_RELOCATION
2、判断一共有几块数据:
最后一个结构的VirtualAddress与SizeOfBlock都为0
3、具体项 宽度:2字节
内存中的页大小是1000H 也就是说2的12次方 就可以表示
一个页内所有的偏移地址 具体项的宽度是16bit 高四位
代表类型:值为3 代表的是需要修改的数据 值为0代表的是
用于数据对齐的数据,可以不用修改.也就是说 我们只关注
高4位的值为3的就可以了.

4、VirtualAddress 宽度:4字节

当前这一个块的数据,每一个低12位的值+VirtualAddress 才是
真正需要修复的数据的RVA

真正的RVA = VirtualAddress + 具体项的低12位

5、SizeOfBlock 宽度:4字节

当前块的总大小
具体项的数量 = (SizeOfBlock - 8)/2

标签:定位,IMAGE,RELOCATION,地址,P50,VirtualAddress,加载
From: https://www.cnblogs.com/cspecialr/p/17382828.html

相关文章

  • python selenium 元素定位方法
    1.通过元素的id属性进行元素定位,在html中元素的id是唯一的定位方法:find_element_by_id(id)fromseleniumimportwebdriver#创建WebDriver对象,指明使用chrome浏览器驱动wd=webdriver.Chrome()#调用WebDriver对象的get方法可以让浏览器打开指定网址wd.get('ht......
  • playwright中定位元素的方法
    playwright中定位元素的方法1.page.$(selector)该方法接受一个CSS选择器作为参数,并返回与选择器匹配的第一个元素。如果不存在匹配的元素,则返回null。该方法常常用于选取指定ID或class的元素。constbutton=awaitpage.$('#myButton');//通过ID选取按钮元素cons......
  • 固定定位
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><metahttp-equiv="X-UA-Compatib......
  • Linux系列---【如何根据端口号确定应用是否已启动?并根据端口号定位到程序所在的目录?】
    如何根据端口号确定应用是否已启动?并根据端口号定位到程序所在的目录?方法一(lsof命令)#注意:没有该命令先执行安装命令yuminstalllsof#查看端口是否被占用lsof-i:7080如图,输完没有反应,说明端口未被占用,即应用未启动如图,输完如果有反应,寿命端口已占用,使用pwdx+pid命令即可......
  • 2022最简单方法更新华为鸿蒙3.0系统HarmonyOS 3.0安装谷歌服务框架GMS谷歌应用商店Goo
    原视频:https://www.youtube.com/watch?v=AsAiuMKXOQYGbox谷歌框架官方下载地址:https://www.gboxlab.com/Gbox谷歌框架带谷歌应用商店的旧版本下载:https://www.mediafire.com/file/sj0l50pogpjwjnb/GBox-release-1.3.20.apk/file......
  • js 打印页面局部区域(指定位置)
    1.情景展示在浏览器的网页上,我们可以通过window.print()实现网页的打印功能。但是,该方法打印的是当前网页上面所有展示的内容,如何只打印指定区域内容呢?如下图所示,只将送检申请单所在区域打印出来,其它位置不用管,如何实现?2.具体分析window.print()打印的是全部内容,那我们就......
  • (原创第一篇,踩坑无数得来的,对Ai自动化测试框架很有帮助)appium自动化测试时遇到不能使用
     现在开发的前端界面使用vue或者更牛逼技术,导致使用appium或者uiautomator2做自动化测试时不能识别到元素,无法使用传统的id,name或者xpath,这时我们需要使用坐标点击文本框。有获取坐标方法,下期写一篇文章,可以在评论区提醒瑞克。fromappiumimportwebdriverimporttimeimport......
  • WPF项目中使用WInform版本的 ChromiumWebBrowser控件嵌套网页 解决中文输入法候选框定
    创建一个用户控件,后台代码:publicpartialclassCefControl:UserControl{ChromiumWebBrowserwebView=null;publicCefControl(){InitializeComponent();if(!CefSharp.Cef.IsInitialized){......
  • 医院信息集成平台基本目标与定位
    满足以病人为中心的信息资源整合与利用 医院信息化建设经历了20多年的发展历程,财务、管理、医疗等部门陆续建立了各自的信息系统。但是,由于缺乏统一规划,这些系统大多数为分散建设,信息不能充分共享和交换,形成大量“信息烟囱”和“信息孤岛”。 随着医院信息化建设......
  • ekf 扩展卡尔曼滤波定位 qt仿真程序
    ekf扩展卡尔曼滤波定位qt仿真程序粒子滤波定位YID:6830622857944996......