我有一个可执行的二进制文件;我们就这么称呼它吧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
在旧终止符的位置之前写一个新的终止符,你将有效地缩短字符串。
一般来说,您无法使用此技巧来延长字符串。