【发布时间】: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