我什么时候可以编辑可执行二进制文件中的字符串?

我什么时候可以编辑可执行二进制文件中的字符串?

我有一个可执行的二进制文件;我们就这么称呼它吧a.out。我可以看到二进制文件包含字符串

$ strings a.out
...
/usr/share/foo
....

我需要将字符串更改/usr/share/foo/usr/share/bar.我可以将字符串替换为 吗sed?:

sed -i 's@/usr/share/foo@/usr/share/bar@' a.out

这看起来是一件安全的事情。当字符串长度不同时,这也能起作用吗?

答案1

我不知道你的版本sed是否是二进制干净的,或者是否会因为它认为输入中的长行而窒息,但除非出现这些问题,就地编辑字符串应该可以。要查看是否如此,请将新旧版本与 进行比较cmp -l。它应该告诉您两个文件之间唯一的三个区别是否是这 3 个字节。

如果字符串长度相同,则在已编译的可执行文件中编辑字符串确实可以工作,但是如果您缩短字符串,则几乎总是可以工作,这是由于字符串在 C 中的工作方式。在 C 字符串中,终止符之后的所有NUL内容不算,所以如果你NUL在旧终止符的位置之前写一个新的终止符,你将有效地缩短字符串。

一般来说,您无法使用此技巧来延长字符串。

相关内容