2012-03-27 21 views
-2

私は攻撃を受け、マルウェアに感染したウェブサイトをいくつか持っています。Linuxは文字列を含むファイルを検索して置き換えます

更新が必要なファイルが800以上あり、文字列は各ファイルでまったく同じです。

私がしたいことは、マルウェアを持つすべてのファイルを見つけて、そのファイルから問題の文字列を削除することです。

基本的な文字列に対して試験したとき、私は正常に動作し、いくつかのコマンドラインスクリプトを発見した:

perl -pi -w -e 's/string_to_find//g;' test-file.php 

とfindコマンドに統合:

発見。タイプf | xargs grep 'string_to_find' -sl | xargs perl -pi -w -e/string_to_find // g; '

が今私の問題は、それが非常に長く、かつ複雑な文字列である文字列で動作するようになっている:私は、検索を試してみて、完全な文字列に置き換えたときに、今

<?php @error_reporting(0); if (!isset($eva1fYlbakBcVSir)) {$eva1fYlbakBcVSir = "random_string_7365_characters_long";$eva1tYlbakBcVSir = "string_of_encoded_characters";$eva1tYldakBcVSir = "string_of_encoded_characters";$eva1tYldakBoVS1r = "string_of_encoded_characters";$eva1tYidokBoVSjr = "string_of_encoded_characters";$eva1tYldokBcVSjr=$eva1tYldakBcVSir($eva1tYldakBoVS1r);$eva1tYldakBcVSjr=$eva1tYldakBcVSir($eva1tYlbakBcVSir);$eva1tYidakBcVSjr = $eva1tYldakBcVSjr(chr(2687.5*0.016), $eva1fYlbakBcVSir);$eva1tYXdakAcVSjr = $eva1tYidakBcVSjr[0.031*0.061];$eva1tYidokBcVSjr = $eva1tYldakBcVSjr(chr(3625*0.016), $eva1tYidokBoVSjr);$eva1tYldokBcVSjr($eva1tYidokBcVSjr[0.016*(7812.5*0.016)],$eva1tYidokBcVSjr[62.5*0.016],$eva1tYldakBcVSir($eva1tYidokBcVSjr[0.061*0.031]));$eva1tYldakBcVSir = "";$eva1tYldakBoVS1r = $eva1tYlbakBcVSir.$eva1tYlbakBcVSir;$eva1tYidokBoVSjr = $eva1tYlbakBcVSir;$eva1tYldakBcVSir = "string_of_encoded_characters";$eva1tYlbakBcVSir = "string_of_encoded_characters";$eva1tYldakBoVS1r = "string_of_encoded_characters";$eva1tYldakBcVSir = "";$eva1tYldakBoVS1r = $eva1tYlbakBcVSir.$eva1tYlbakBcVSir;$eva1tYidokBoVSjr = $eva1tYlbakBcVSir;} ?> 

(すべてが特別なエスケープ

Possible unintended interpolation of @error_reporting in string at -e line 1. 
Name "main::error_reporting" used only once: possible typo at -e line 1. 

それは私がやろうとしていますか、文字列をキャプチャすることは不可能である何をすることは可能です:文字)私はこの結果を得ますか? @記号を別の方法でエスケープする必要がありますか?

どれでも助けを(私は、\でエスケープし、それは動作しませんでした) - 私はあなたがおそらく、コマンドラインにバックアウトとsedを使用したいのbashとperlの

+0

よくある質問http://learn.perl.org/faq/perlfaq6.html#How-can-I-quote-a-variable-to-use-in-a-regex- – daxim

+0

ありがとうdaxim - 私はしませんperlを学びたい –

答えて

0

私はそれを理解しました。ステートメントは正しい、私はちょうどいくつかの文字をエスケープしていた欠場していた。

は私の質問への答えで、答えは:

はい - 使用方法が正しく、望ましい結果 はい達成することで動作します - @記号もエスケープしなければなりません

文字列をエスケープします正しく、ステートメントは正常に動作します。

0

と初心者です。このタイプの問題のために作られています。ここで始めるのに良い場所です: IBM Developerworks SED by example

+0

sedを試しました - 文字列が長すぎると言われました –

1

\@が動作するはずが、あなたはあまりにも他の問題を持っている:<?はないシーケンス<?、例えば、オプションの<と一致します。 man perlreによると、以下が動作するはず:

perl -pi -w -e 's/\Q<?php \[email protected]\Qerror_reporting...//g' 

\Qあなたは、すべてのメタ文字を引用することなく、正確な文字列を検索することができ、すべての特別な正規表現の意味をオフにします。 \ Eは特別な意味を一時的に復元しますが、@は分離されているため、配列名の先頭には解釈されません。同じ方法でそれぞれ@$を囲む必要があります。そして、もちろん、これが正しく動作することを確認してください!がんばろう。

編集:実際、私はあなたの1ライナーを簡単なスクリプトで置き換えることをお勧めします。検索したい文字列を定義し、不要な変数の置換が発生しないようにします(確実に出力する)。正規表現の意味を無効にするには、すべての特殊文字をquotemeta()で無効にします。入力に適用されます。文字列が本当に正確に同じであれば"random_string ..."が場所によって異なる場合は、REをより慎重に構築する必要があります。いずれにしても、5行のperlスクリプトを作成して1つのファイルで作業し、find/xargsメソッドを使用してどこにでも適用すれば、あなたの人生が楽になります。

+0

だから、\ Q ... \ Eで文字列全体を囲むことはできますか? @ –

+0

の1つの出現を除いて、いいえ、あなたはできません。 '$'もエスケープする必要があります。マンページを参照してください。 – alexis

0

正規表現には、このタスクを容易にする他の機能があります。

.*?」は、次の発生までの任意の文字と一致します
perl -pi -w -e \ 
's/<\?php \@error_reporting\(0\);if \(!isset(\$evalYl.*?} \?>//g' \ 
test-file.php 

を:あなたは$evalfYlで始まる変数を持つ任意の有効なコードを持っていない場合、あなたは脱出するために少ないとはるかに簡単な正規表現を使用することができます}?> "という文字列を返します。

+0

しかし、それが@error_reporting(0)の前に置かれる必要があるので、私がした場合は、とにかく問題ではありません...とにかくそうではありませんか?また、@をエスケープしたので、これをperlでエスケープする必要がありますか? –

関連する問題