【问题标题】:Addressing data from different sections寻址来自不同部分的数据
【发布时间】:2017-11-12 04:51:10
【问题描述】:

我正在修改一个可执行文件并想将数据添加到.rdata 部分。在调试器中工作时我可以正确读取它,但在运行独立修补的可执行文件时不能。

如果我理解正确,问题是可执行文件可以加载到不同的基地址,这意味着我的MOV 指令中的绝对地址实际上并没有指向我的数据。

如何让加载程序正确翻译附加说明中的地址?或者,如果我知道 RVA,是否可以在运行时计算 VA?

【问题讨论】:

  • 所以您想知道如何添加新的重定位/符号表内容以获取修复或使用新数据地址的新指令所需的任何内容?你能让你的代码 PIC 并使用 RIP 相对寻址吗? (或 32 位模式 PIC hack)只要.rdata 部分和文本部分之间的距离保持不变(我认为应该如此),它就可以工作。
  • 是的。如果部分之间的距离保持不变,我相信使用 RIP 相对寻址应该可以完成工作。我将查看最后一部分并对其进行测试。谢谢。
  • .rdata.text 部分可能在同一个 segment 中,即运行时加载程序的同一连续映射的一部分。对于.rodata 和 Linux 上的 ELF 可执行文件/库中的其他只读部分就是这种情况,Windows 也可以这样做(因此库可以对私有静态数据使用 RIP 相对寻址而无需重定位)。也就是说,它是一个有用的属性,没有缺点,所以有充分的理由希望他们以这种方式实现它。
  • 如果您添加一些代码 - 它必须是基本独立代码。或者您也需要将数据添加到重定位部分。或可选标题中的零重定位部分。完全通常用于添加数据/代码需要完全重建所有 pe 并且对这个主题有完美的了解

标签: assembly x86 portable-executable


【解决方案1】:

您还需要修改可执行文件的重定位部分

.reloc 部分包含一个基本重定位表。基址重定位是对指令或指令的调整 如果加载器无法加载链接器假定的文件,则需要初始化变量值。如果 加载器能够在链接器的首选基地址加载图像,加载器完全忽略重定位 本节中的信息。

你应该如何修改这个部分超出了我的范围,但在这里你可以找到来自 microsoft 的关于 .reloc 部分结构的文档:The .reloc Section

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多