我写了一个简单的C程序,显示“Hello World!”到stdout。然后我编译了它,并删除了源代码。
我已经将自己设置为修补程序的项目,以便显示除“Hello World!”之外的其他内容。为此,我发现存储在二进制文件中的字符串,并使用vi的十六进制编辑器将存储字符串的二进制偏移量(我假设它是数据部分)中的'a'替换为'e'。
我只更改了二进制文件的一个字节,0x65到0x61,'e' - >'a',然而,当我运行程序时,我得到了这个:
./simple: line 1: 0000000:: command not found
./simple: line 2: 0000010:: command not found
./simple: line 3: 0000020:: command not found
./simple: line 4: 0000030:: command not found
./simple: line 5: 0000040:: command not found
./simple: line 6: 0000050:: command not found
./simple: line 7: syntax error near unexpected token `('
./simple: line 7: `0000060: 0000 0000 0000 0000 1900 0000 2802 0000 ............(...'
有谁知道为什么会这样?即为什么单字节替换可以呈现其他可执行的二进制文件(我之前运行得很好)不可执行?该字节只是字符串的一部分 - 它不是指令的一部分 - 所以我不明白为什么会发生这种情况。
感谢所有反馈。
答案 0 :(得分:7)
您的编辑器保存的不是原始字节,而是它们的十六进制表示。该文件的第一行如下所示:
00000000: 45 4C 46 7F ...
这就是shell发出错误消息的原因。它读取该行并尝试将其解释为/bin/sh
的脚本,因为它不是以字节ELF\x7F
开头,而是以字节00000000
开头。
使用正确的十六进制编辑器,你会没事的。
答案 1 :(得分:2)
您需要通过
退出'hexedit mode':%!xxd -r
在使用vi。
保存二进制文件之前答案 2 :(得分:0)
我不确定为什么会发生这种情况,但我首先要确保您只更改了一个字节,并且您没有意外地插入或删除任何内容(文件仍然是相同的大小)。您可以使用像我的Cygnus Hex Editor这样的程序来确定两个文件之间的确切差异。
如果仍然无效,则可能与文件的校验和有关。虽然我不认为它们总是被使用,但我相信EXE确实有校验和。虽然我很惊讶它能够产生你所看到的结果。
答案 3 :(得分:0)
要确切地知道这里发生了什么是困难的,你需要100%确定你改变了正确的字节(并且100%也信任你的十六进制编辑器),因为如果你这样做了,那就没有问题了。 / p>
我刚刚在OSX上使用GCC创建了一个类似的二进制文件,并使用HexFiend.app对其进行了编辑,并获得了所需的结果。
(将文字改为Jello World :))
答案 4 :(得分:0)
听起来vi不是二元清洁的。选择emacs而不是vi的另一个原因..; - )