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

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

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

こうするのが安全なようです。文字列の長さが異なる場合でも機能しますか?

ベストアンサー1

sedあなたのバージョンがバイナリクリーンであるか、入力の長い行のために窒息しているかどうかはわかりませんが、これらの問題を除いて、文字列を所定の位置に編集するのは問題ありません。このような場合であることを確認するには、古いバージョンと新しいバージョンをcmp -l。 2つのファイル間の唯一の3つの違いがこの3バイトであることをお知らせします。

コンパイルされた実行可能ファイルで文字列を編集することは、文字列の長さが同じ場合は機能しますが、Cで文字列がどのように機能するかによって文字列を減らすと、ほとんど常に機能します。 C 文字列では、終端子の後ろの内容はすべてNUL計算されないため、NUL前の終端位置の前に新しい終端子を作成すると、文字列が効果的に短縮されます。

通常、このトリックを使用して文字列を増やすことはできません。

おすすめ記事