0

有一个用于 64 位 linux 的动态库,它包含许多从 C++ 代码编译的函数。该代码不是开源的,但我知道其中一个功能应该是什么样子。它包含数学表达式,我想更改此表达式中的一个常量。

我有一些编程技能,但从未研究过编译对象和可执行文件。通过objdump -RDC命令获取的汇编代码的相关部分如下。感兴趣的常数应该是类型double,并且它似乎在乘法命令中使用7e1cc

7e1b8:  00 
7e1b9:  f2 0f 59 74 24 78       mulsd  0x78(%rsp),%xmm6
7e1bf:  f2 41 0f 59 f0          mulsd  %xmm8,%xmm6
7e1c4:  f2 0f 58 ce             addsd  %xmm6,%xmm1
7e1c8:  f2 0f 58 ca             addsd  %xmm2,%xmm1
7e1cc:  f2 0f 59 0d fc 0e 0c    mulsd  0xc0efc(%rip),%xmm1        # 13f0d0 <typeinfo name for RestorableCreator<Model>+0x90>
7e1d3:  00 
7e1d4:  48 81 c4 88 00 00 00    add    $0x88,%rsp
7e1db:  66 0f 28 c1             movapd %xmm1,%xmm0
7e1df:  c3                      retq   

我想知道如何找到这个常量在文件中的位置,将我的常量转换为十六进制格式并将文件中的值替换为我的十六进制值。谁能解释如何做到这一点?此外,有关适当工具的建议也非常有价值。

4

1 回答 1

1

常量在 address0xc0efc(%rip)下一%rip条指令的地址,意思是0x7e1d4。所以地址是:0xc0efc + 0x7e1d4 = 0x13F0D0(objdump 甚至会为您打印)。现在,使用 . 检查二进制文件的标头objdump -h。这将列出所有部分以及虚拟地址和文件偏移量。找到地址落入哪个段,计算它在段中的距离,然后加上文件偏移量。现在使用十六进制编辑器从该偏移量中获取代表双精度的 8 个字节。通过任何您想要的方式将其转换为人类可读的形式,例如通过一个简单的 C 程序,它只是将一个字节数组转换为 double 并打印它。

于 2013-10-26T22:21:06.270 回答