如何在linux动态库中更改常量值?

时间:2013-10-26 21:28:14

标签: linux assembly reverse-engineering x86-64

有一个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   

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

1 个答案:

答案 0 :(得分:1)

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