我有一个已经感染了成千上万的文件在我的客户的服务器之一的病毒。
幸运的是,我已经处理了这个家伙的服务器上的大量其他恶意软件,并且这个看起来容易做简单的regex(他把他同一个帐户的所有网站:(但我和他一起工作,以解决)。
基本上虽然不像大多数的恶意软件我已经看到它注入PHP结束前?>良好的代码(因而很难确定什么码好/坏的代码),该电流恶意软件总是添加一个新的<?php ... malware ... ?>
。
所以基本上,这里说有很好的代码:
<?php
require('./wp-blog-header.php');
?>
取而代之的将某种BASE64_DECODE的EVAL后,立即要求发言,但之前?>(可尽遣困难时,页面发生在有条件的/复杂的语句来结束),这将始终用新添加以下代码<?php ... ?>
像这样:
<?php
require('./wp-blog-header.php');
?><?php ... malware ...?>
我不想把这里的任何恶意代码了,但,这是恶意代码怎么总是开始:
<?php @error_reporting(0); if (!isset($eva1fYlbakBcVSir)) {$eva1fYlbakBcVSir = "tons and tons of characters";$eva1tYlbakBcVSir = "\x6335\1443\3x6f\1534\x70\170\x65";$SNIPSNIPSNIPSNIP;} ?>
我喜欢会寻找每一个文件<?php @error_reporting(0); if (!isset
<?php @error_reporting(0); if (!isset
,如果它在页面上的最后一个PHP语句,则内删除一切
这里是你如何清洁用纯PHP整个项目。
无论在哪一方面,我将招致任何损失,包括任何赔偿责任,但不限于直接的,间接的,特别的,或引起的,从产生,间接损害或连接到使用的代码提供的任何方式,无论是否基于在保修期内,合同,侵权,或以其他方式; 不论是否已经受到损伤的人或财产或以其他方式维持; 不论是否损失是由持续的,或产生出的,结果,使用如果这个代码。 ,p
<?php
//Enter it as it is and escape any single quotes
$find='<?php @error_reporting(0); if (!isset($eva1fYlbakBcVSir)) {$eva1fYlbakBcVSir =\'\';?>';
echo findString('./',$find);
function findString($path,$find){
$return='';
ob_start();
if ($handle = opendir($path)) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
if(is_dir($path.'/'.$file)){
$sub=findString($path.'/'.$file,$find);
if(isset($sub)){
echo $sub.PHP_EOL;
}
}else{
$ext=substr(strtolower($file),-3);
if($ext=='php'){
$filesource=file_get_contents($path.'/'.$file);
$pos = strpos($filesource, $find);
if ($pos === false) {
continue;
} else {
//The cleaning bit
echo "The string '".htmlentities($find)."' was found in the file '$path/$file and exists at position $pos and has been removed from the source file.<br />";
$clean_source = str_replace($find,'',$filesource);
file_put_contents($path.'/'.$file,$clean_source);
}
}else{
continue;
}
}
}
}
closedir($handle);
}
$return = ob_get_contents();
ob_end_clean();
return $return;
}
?>
祝好运。
UPDATE(有正则表达式):
<?php
error_reporting(E_ALL);
$find='<\?php @error_reporting\(0\); if \(!isset\((.*?)\?>';
echo findString('./',$find);
function findString($path,$find){
$return='';
ob_start();
if ($handle = opendir($path)) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
if(is_dir($path.'/'.$file)){
$sub=findString($path.'/'.$file,$find);
if(isset($sub)){
echo $sub.PHP_EOL;
}
}else{
$ext=substr(strtolower($file),-3);
if($ext=='php'){
$filesource=file_get_contents($path.'/'.$file);
//The cleaning bit
echo "The string '".htmlentities($find)."' was found in the file '$path/$file and has been removed from the source file.<br />";
$clean_source = preg_replace('#'.$find.'#','',$filesource);
// $clean_source = str_replace($find,'',$filesource);
file_put_contents($path.'/'.$file,$clean_source);
}else{
continue;
}
}
}
}
closedir($handle);
}
$return = ob_get_contents();
ob_end_clean();
return $return;
}
?>
到目前为止,这是最接近(谢谢MVDS)
sed -e "s/<?php @error_reporting.*?>//g" --in-place=_cleaned *
虽然--in就地= _cleaned是给错误sed: illegal option -- -
文章来源: PHP/SSH regex script/command to delete identical malware code from many files