回答:
あなたのバージョンsed
がバイナリクリーンになるのか、それとも入力で本当に長い行であると思われるもので窒息するのかわかりませんが、これらの問題がなければ、文字列をインプレースで編集する必要があります。実行されるかどうかを確認するには、古いバージョンと新しいバージョンをで比較しcmp -l
ます。2つのファイルの違いが3バイトだけであるかどうかがわかります。
コンパイルされた実行可能ファイル内の文字列の編集は、文字列が同じ長さであれば実際に機能しますが、文字列がCで機能する方法のため、文字列を短縮する場合もほとんど常に機能します。C文字列では、NUL
ターミネーターの後のすべてはカウントされないためNUL
、古いターミネーターの位置の前に新しいターミネーターを書くと、文字列を効果的に短縮できます。
一般に、このハックを使用して文字列を長くする方法はありません。
NUL
説明したようにターミネーターを前の位置に設定する必要があります(ただし、短すぎるかもしれません)。問題はNUL
、コマンドラインにバイトを持たせることができないため、sed
プログラムをファイルに入れてで参照する必要があること-f
です。一方、より安全な方法はsed
、テキストデータで動作するように設計されたツールではなく、バイナリデータで動作するように設計されたツールを使用することです。
hexedit
バイナリファイルを調査または変更する必要がある場合に使用します。strings -t x file | less
エディタにジャンプする前に、変更する(印刷可能な)文字列のオフセットを見つけるために使用できます。
\0
は慎重に行う必要があります。 is \ 0 Mr Robot "の場合、文字列で操作を実行しているときに、長さが意図せずに短くなるため、「\ 0」文字が問題を引き起こします。
NUL
が既存のに隣接して最後に行くように、文字列の残り全体を1バイトだけ前方にシフトする必要がありますNUL
。
sed -i 's@longstring@foo@' a.out
ですか?これにより、バイナリ全体が7バイト小さくなります。これにより、バイナリが破損することはありませんか?