
実行可能なバイナリがあります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
前の終端位置の前に新しい終端子を作成すると、文字列が効果的に短縮されます。
通常、このトリックを使用して文字列を増やすことはできません。