web-dev-qa-db-ja.com

実行可能バイナリの文字列はいつ編集できますか?

実行可能なバイナリがあります。 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

これは安全なことのようです。文字列が同じ長さでない場合にもこれは機能しますか?

11
Martin Vegter

お使いのsedのバージョンがバイナリでクリーンになるかどうか、または入力で実際に長い行であると思われるものが詰まるかどうかはわかりませんが、これらの問題を除いて、文字列をインプレースで編集すると機能します。存在するかどうかを確認するには、新旧バージョンをcmp -lと比較します。 2つのファイルの3つの違いだけが3バイトであるかどうかがわかります。

コンパイルされた実行可能ファイル内の文字列の編集は、文字列が同じ長さであれば実際に機能しますが、Cでの文字列の動作方法により、文字列を短くした場合でもほとんど常に機能します。C文字列では、NULターミネータはカウントされないため、新しいNULターミネータを古いターミネータの位置の前に記述すると、文字列を効果的に短縮できます。

一般に、このハックを使用して文字列を長くする方法はありません。

17
Celada