Executable

什麼時候可以編輯可執行二進製文件中的字元串?

  • March 8, 2015

我有一個可執行的二進製文件;讓我們稱之為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

這看起來是一件安全的事情。當字元串長度不同時,這也可以嗎?

我不知道您的版本sed是否是二進制干淨的,或者是否會因為它認為輸入中真正長的行而窒息,但除非出現這些問題,就地編輯字元串應該可以工作。要查看是否存在,請將舊版本和新版本與cmp -l. 它應該告訴您兩個文件之間唯一的三個區別是否是這 3 個字節。

如果字元串的長度相同,則在已編譯的執行檔中編輯字元串確實可以工作,但如果您縮短字元串,它幾乎總是可以工作,因為字元串在 C 中的工作方式。在 C 字元串中,NUL終止符之後的所有內容不算,所以如果你NUL在舊的位置之前寫一個新的終止符,你將有效地縮短字元串。

通常,您無法使用此 hack 來延長字元串。

引用自:https://unix.stackexchange.com/questions/188820