在反汇编的二进制文件中HIGHLOW的含义是什么?

Wus*_*uhn 2 c++ windows x86 assembly dumpbin

我刚刚第一次使用DUMPBIN,我在输出文件中反复看到术语HIGHLOW:

BASE RELOCATIONS #7
   11000 RVA,       E0 SizeOfBlock
    ...
         3B5  HIGHLOW            2001753D  ___onexitbegin
         3C1  HIGHLOW            2001753D  ___onexitbegin
    ...
Run Code Online (Sandbox Code Playgroud)

我很好奇这个词的意思.我没有在Google或Stackoverflow上找到任何关于它的内容.

use*_*443 6

要应用修正,请将delta计算为首选基址与实际加载图像的基础之间的差异.

基本的想法是,在某个地址进行修正时,我们必须知道

  1. 什么内存必须改变("偏移"字段)
  2. 重定位需要什么值("delta"值)
  3. 要使用的重定位数据和增量值的哪些部分("类型"字段)

以下是"类型"字段的一些可能值

  • HIGH - 在"偏移"处向16位值添加更高字(16位)的delta
  • LOW - 将"delta"的低位字添加到"offset"处的值
  • HIGHLOW - 在"offset"处为32位值添加完整增量

换句话说,HIGHLOW类型告诉程序它正在对此重定位块*的页面偏移"偏移"进行修复,并且需要修改双字以便具有正确工作的可执行文件.

*所有重定位条目都分组为块,每个块都有一个应用其条目的页面

假设你的代码中有这条指令:

section .data
message: "Hello World!", 0

section .code
...
mov eax, message
...
Run Code Online (Sandbox Code Playgroud)

你运行汇编程序,然后运行反汇编程序.现在您的代码如下所示:

mov eax, dword [0x702000]
Run Code Online (Sandbox Code Playgroud)

你现在好奇为什么会这样0x700000,当你调查文件转储时,你会看到它

ImageBase:      0x00700000
Run Code Online (Sandbox Code Playgroud)

现在,您了解此数字的来源,并准备好运行可执行文件.将可执行文件加载到内存并为它们创建地址空间的Loader发现,该内存0x700000不可用,需要将该文件放在其他位置.它决定0xf00000可以,并在那里复制文件内容.

但是,您的程序仅与数据相关联,0x700000并且链接器无法知道其输出将被重定位.因此,装载机必须发挥其魔力.它

  1. 计算delta值 - 旧地址(图像库)是0x700000它想要的0xf00000(首选地址).它从另一个中减去一个并得到0x800000结果.
  2. 到达.reloc文件的部分
  3. 检查是否还有另一个要重新定位的页面(4KB数据).如果不是,它继续调用文件的入口点.4.对于当前页面的每次重定位,它
  4. 获取重定位偏移量的数据
  5. 添加delta值(作为类型字段状态的方式)
  6. 将新值放在重定位偏移处
  7. 继续第3步

还有更多类型的重定位条目,其中一些是特定于体系结构的.要查看完整列表,请阅读"Microsoft可移植可执行文件和通用目标文件格式,第6.6.2节"修复类型".