Answers:
我不知道您的版本sed
是否为二进制清除,或者是否会阻塞输入中认为很长的行,但是除非存在这些问题,否则就地编辑字符串应该行得通。要查看是否可以,请将旧版本和新版本与进行比较cmp -l
。它应该告诉您两个文件之间仅有的三个差异是否就是这三个字节。
如果字符串的长度相同,则确实可以在已编译的可执行文件中编辑字符串,但是由于字符串在C中的工作方式,因此如果缩短字符串,几乎也可以使用。在C字符串中,NUL
终止符之后的所有内容不算在内,因此,如果您NUL
在旧的位置之前写一个新的终止符,则可以有效地缩短字符串。
通常,没有办法使用此技巧来延长字符串。
NUL
按照我的解释将终止符设置在更早的位置(尽管可能太简短了)。问题是您NUL
在命令行上没有字节,因此必须将sed
程序放入文件中并使用进行引用-f
。另一方面,更安全的做法是使用设计用于二进制数据的工具,而不是sed
设计用于文本数据的工具。
hexedit
必须检查或更改二进制文件时使用。您可以strings -t x file | less
在跳转到编辑器之前,找到要更改的(可打印)字符串的偏移量。
\0
必须仔细进行填充,因为如果替换是这样的话:“我的名字is \ 0 Mr Robot”,然后在执行字符串操作时,“ \ 0”字符会产生问题,因为其长度会意外减小。
NUL
在末尾并与现有相邻NUL
。
sed -i 's@longstring@foo@' a.out
呢?这将使整个二进制文件减小7个字节,这不会破坏二进制文件吗?