有一个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
我想知道如何在文件中找到此常量的位置,将我的常量转换为十六进制格式,并将文件中的值替换为我的十六进制值。任何人都可以解释如何做到这一点?关于适当工具的建议也很有价值。
答案 0 :(得分:1)
常量位于地址0xc0efc(%rip)
,其中%rip
是下一条指令的地址,意思是0x7e1d4
。所以地址是:0xc0efc + 0x7e1d4 = 0x13F0D0
(objdump甚至为你打印)。
现在,使用objdump -h
检查二进制文件的标题。这将列出所有部分以及虚拟地址和文件偏移。找到地址所属的部分,并计算它所在的部分的距离,然后添加文件偏移量。现在使用十六进制编辑器从该偏移量中获取表示double的8个字节。通过你想要的任何方式将它变成人类可读的形式,例如通过一个简单的C程序,只需将一个字节数组转换为双倍并打印它。