ホームページ >php教程 >php手册 >浅谈PHP神盾的解密过程

浅谈PHP神盾的解密过程

WBOY
WBOYオリジナル
2016-06-06 19:53:101159ブラウズ

欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 前些日子一个朋友丢了个shell给我,让我帮忙解密,打开源码看了下写着是 "神盾加密" , 其实网上早就有人分析过这个了,而且写成了工具、但是我测试了很多个,没一个能用,所以决定自己从头分析一遍。

欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入

  前些日子一个朋友丢了个shell给我,让我帮忙解密,打开源码看了下写着是 "神盾加密" , 其实网上早就有人分析过这个了,而且写成了工具、但是我测试了很多个,没一个能用,所以决定自己从头分析一遍。

  我们来做第一步解密处理吧。

  PS: 这只是我的解密思路,与大家分享一下,也许你有更好的方法还望分享

  

  $str = file_get_contents("1.php");

  // 第一步 替换所有变量

  // 正则 \$[a-zA-Z_\x7f-\xff][\w\x7f-\xff]*

  preg_match_all('|\$[a-zA-Z_\x7f-\xff][\w\x7f-\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][\w\x7f-\xff]*)

  preg_match_all('|function ([a-zA-Z_\x7f-\xff][\w\x7f-\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-\x08\x0e-\x1f\x7f-\xff]|s', "tohex", $str);

  // 写到文件

  file_put_contents("1_t1.php", $str);

  function tolog($str) {

  file_put_contents("replace_log.txt", $str . "\n", FILE_APPEND);

  }

  ?>

  (其中有一个记录到日志的代码,这个在之后的二次解密时有用。)

  执行之后就会得到一个 1_t1.php 文件,打开文件看到类似这样的代码

  找个工具格式化一下,我用的 phpstorm 自带了格式化功能,然后代码就清晰很多了。

  进一步整理后得到如下代码:

  

  //Start code decryption《===

  if (!defined('IN_DECODE_82d1b9a966825e3524eb0ab6e9f21aa7')) {

  define('\xA130\x8C', true);

  function fun1($str, $flg="") {

  if(!$flg) return(base64_decode($str));

  $ret = '?';

  for($i=0; $i

  $c = ord($str[$i]);

  $ret .= $c136 ? chr($c/2) : $str[$i] ) : "";

  }

  return base64_decode($ret);

  }

[1] [2] 

浅谈PHP神盾的解密过程

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。