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


12

実行可能なバイナリがあります。それを呼び出しましょう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

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

回答:


17

あなたのバージョンsedがバイナリクリーンになるのか、それとも入力で本当に長い行であると思われるもので窒息するのかわかりませんが、これらの問題がなければ、文字列をインプレースで編集する必要があります。実行されるかどうかを確認するには、古いバージョンと新しいバージョンをで比較しcmp -lます。2つのファイルの違いが3バイトだけであるかどうかがわかります。

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

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


のようなもので文字列を短くするのはどうsed -i 's@longstring@foo@' a.outですか?これにより、バイナリ全体が7バイト小さくなります。これにより、バイナリが破損することはありませんか?
マーティンVegter

はい、バイナリが破損します。そのため、文字列をまったく同じ長さの1つに変換する必要がありますが、NUL説明したようにターミネーターを前の位置に設定する必要があります(ただし、短すぎるかもしれません)。問題はNUL、コマンドラインにバイトを持たせることができないため、sedプログラムをファイルに入れてで参照する必要があること-fです。一方、より安全な方法はsed、テキストデータで動作するように設計されたツールではなく、バイナリデータで動作するように設計されたツールを使用することです。
セラダ

2
いい答えです。sedは多くのことを実行できますが、一般的に、それがバイナリエディターの発明目的です。大きなバイナリファイル内を移動するときに使用するのは難しい場合がありますが、バイトごとに変更することができます。hexeditバイナリファイルを調査または変更する必要がある場合に使用します。strings -t x file | lessエディタにジャンプする前に、変更する(印刷可能な)文字列のオフセットを見つけるために使用できます。
ジョー

Cプログラムに「私の名前はMr Robotでした」という文字列があり、「だった」を「で」に置き換えたい場合、パディング\0は慎重に行う必要があります。 is \ 0 Mr Robot "の場合、文字列で操作を実行しているときに、長さが意図せずに短くなるため、「\ 0」文字が問題を引き起こします。
ネハルJワニ

@NehalJWaniいいえ、その場合は、新しい余分な終了NULが既存のに隣接して最後に行くように、文字列の残り全体を1バイトだけ前方にシフトする必要がありますNUL
セラダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.