Executable
什麼時候可以編輯可執行二進製文件中的字元串?
我有一個可執行的二進製文件;讓我們稱之為
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 來延長字元串。