是否可以修改精灵的 .rodata 部分中 char* 的值?

Is it possible to modify the value of a char* in .rodata section of an elf?

我知道您可以轻松地用相同大小的值修补 ELF。 但是,如果我想将其更改为更大的值怎么办?有没有办法解包和重新打包 ELF?

我对修补内存中的二进制文件不感兴趣。

But, what if I want to change it for a bigger value?

您显然想要一个 更长的 字符串,而不是更大的值。

is there a way to un-pack and re-pack the ELF?

取决于您询问的 ELF 类型。如果你有一个 ET_REL 类型的可重定位 object 文件(通常是 .o),那么修改是相当简单的:你只需将一个新的部分附加到文件的末尾(通常是字符串内容驻留在 .rodata 部分,所以你会制作它的(更大的)副本,然后更新相应部分 header 的 .sh_offset.sh_size 以指向正确的位置文件。

另一方面,对于 linked ELF 二进制文件(ET_DYNET_EXEC),任务非常复杂,以至于很难(几乎不可能),因为需要更新多个指针,并且内存中的位置不是任意的。