前些日子一个朋友丢了个shell给我,让我帮忙解密,打开源码看了下写着是 “神盾加密” , 牛逼闪闪的样子、
百度下发现神盾是个很古老的东西,最后一次更新是在 2012-10-09。和他相似的另一款是phpjm,有人说是神盾抄袭phpjm的,这些都不是我们所要关心的问题、
phpjm一直在更新,而神盾貌似不搞了,我们分析下神盾,顺便写成工具,方便大家使用(因为他不更新,所以就不用担心解密工具失效问题了)。
其实网上早就有人分析过这个了,而且写成了工具、但是我测试了很多个,没一个能用,所以决定自己从头分析一遍。
打开神盾加密过后的源码,可以看到这样的代码
上面写着广告注释,而且不能删除,因为文件末尾有个md5效验码,以验证代码是否被修改过,如图、
再仔细看代码部分,发现里面都是乱码,其实这都是障眼法,
它利用了php变量扩充到 latin1 字符范围,其变量匹配正则是 $[a-zA-Z_x7f-xff][wx7f-xff]* 这样的格式。
这个昨天已经分析过了,最终也在官网找到了答案,请看《浅谈 PHP 变量可用字符》
有点扯远了,我们来做第一步解密处理吧。
PS: 这只是我的解密思路,与大家分享一下,也许你有更好的方法还望分享。。
<?php$str = file_get_contents("1.php");// 第一步 替换所有变量// 正则 $[a-zA-Z_x7f-xff][wx7f-xff]*preg_match_all('|$[a-zA-Z_x7f-xff][wx7f-xff]*|', $str, $params) or die('err 0.');$params = array_unique($params[0]); // 去重复$replace = array();$i = 1;foreach ($params as $v) { $replace[] = '$p' . $i; tolog($v . ' => $p' . $i); // 记录到日志 $i++;}$str = str_replace($params, $replace, $str);// 第二步 替换所有函数名// 正则 function ([a-zA-Z_x7f-xff][wx7f-xff]*)preg_match_all('|function ([a-zA-Z_x7f-xff][wx7f-xff]*)|', $str, $params) or die('err 0.');$params = array_unique($params[1]); // 去重复$replace = array();$i = 1;foreach ($params as $v) { $replace[] = 'fun' . $i; tolog($v . ' => fun' . $i); // 记录到日志 $i++;}$str = str_replace($params, $replace, $str);// 第三步 替换所有不可显示字符function tohex($m) { $p = urlencode($m[0]); // 把所有不可见字符都转换为16进制、 $p = str_replace('%', 'x', $p); $p = str_replace('+', ' ', $p); // urlencode 会吧 空格转换为 + return $p;}$str = preg_replace_callback('|[x00-x08x0e-x1fx7f-xff]|s', "tohex", $str);// 写到文件file_put_contents("1_t1.php", $str);function tolog($str) { file_put_contents("replace_log.txt", $str . "n", FILE_APPEND);}?>