神盾加密解密教程(二)PHP 神盾解密
前端之家收集整理的这篇文章主要介绍了
神盾加密解密教程(二)PHP 神盾解密,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_3010@其实网上早就有人分析过这个了,而且写成了工具、但是我测试了很多个,没一个能用,所以决定自己从头分析一遍。
@H
301_0@打开神盾加密过后的源码,可以看到这样的
代码
@H_
301_0@
<IMG src="https://files.jb51.cc/file_images/article/201406/201468123602893.jpg?201458123615">
@H_
301_0@上面写着广告注释,而且不能
删除,因为
文件末尾有个md5效验码,以验证
代码是否被
修改过,如图、
@H_
301_0@
<IMG id=theimg onclick=window.open(this.src) src="https://files.jb51.cc/file_images/article/201406/201468123631178.jpg?201458123645">
@H_
301_0@再仔细看
代码部分,发现里面都是乱码,其实这都是障眼法,
它利用了
PHP变量扩充到 latin1 字符范围,其变量匹配正则是 \$[a-zA-Z_\x7f-\xff][\w\x7f-\xff]
这样的格式。
这个前几天天已经分析过了,最终也在官网找到了答案,请看《神盾加密解密教程(一)PHP变量可用字符》
@H_301_0@有点扯远了,我们来做第一步解密处理吧。
PS: 这只是我的解密思路,与大家分享一下,也许你有更好的方法还望分享。。
@H_301_0@<div class="codetitle"><a style="CURSOR: pointer" data="32073" class="copybut" id="copybut32073" onclick="doCopy('code32073')"> 代码如下: <div class="codebody" id="code32073">
<?
PHP$str = file_get_contents("1.
PHP");
@H_
3010@// 第一步 替换所有变量
// 正则 \$[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 = strreplace($params,$replace,$str);
@H301_0@
// 第二步 替换所有函数名
// 正则 function ([a-zA-Z_\x7f-\xff][\w\x7f-\xff])
preg_match
all('|function ([a-zA-Z\x7f-\xff][\w\x7f-\xff]
)|',$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 = strreplace($params,$str);
@H301_0@// 第三步 替换所有不可显示字符
function tohex($m) {
$p = urlencode($m[0]); // 把所有不可见字符都转换为16进制、
$p = str_replace('%','\x',$p);
$p = str_replace('+',' ',$p); // urlencode 会吧 空格转换为 +
return $p;
}
$str = preg_replacecallback('|[\x00-\x08\x0e-\x1f\x7f-\xff]|s',"tohex",$str);
@H301_0@// 写到文件
file_put_contents("1_t1.PHP",$str);
@H_301_0@function tolog($str) {
file_put_contents("replace_log.txt",$str . "\n",FILEAPPEND);
}
?>
@H
301_0@(其中有一个记录到日志的
代码,这个在之后的二次解密时有用。)
执行之后就会得到一个 1_t1.
PHP 文件,打开
文件看到类似这样的
代码
@H_
301_0@
<IMG id=theimg onclick=window.open(this.src) src="https://files.jb51.cc/file_images/article/201406/201468123701422.jpg?201458123712">
@H_
301_0@找个工具格式化一下,我用的
PHPstorm
自带了格式化
功能,然后
代码就清晰很多了。
@H_
301_0@
<IMG id=theimg onclick=window.open(this.src) src="https://files.jb51.cc/file_images/article/201406/201468123723146.jpg?201458123740">
@H_
301_0@进一步整理后得到如下
代码:
@H_
301_0@<div class="codetitle">
<a style="CURSOR: pointer" data="23787" class="copybut" id="copybut23787" onclick="doCopy('code23787')"> 代码如下: <div class="codebody" id="code23787">
<?
PHP//Start code decryption<<===
if (!defined('IN_DECODE_82d1b9a966825e3524eb0ab6e9f21aa7')) {
define('\xA130\x8C',true); function fun1($str,$flg="") {
if(!$flg) return(base64
decode($str));
@H301_0@ $ret = '?';
for($i=0; $i<strlen($str); $i++) {
$c = ord($str[$i]);
$ret .= $c<245 ? ( $c>136 ? chr($c/2) : $str[$i] ) : "";
}
return base64
decode($ret);
}
@H301_0@ function fun2(&$p14)
{
global $p15,$p16,$p17,$p18,$p19,$p3;
@$p17($p18,$p19 . '(@$p16($p15(\'eNq9kl1r01AYx79KG0JzDqZJT9KkL2ladXYgWxVsh6iTkCYna7o2yZL0dfTGG0GkoHhVi1dFxi5EZv0KvRSRMYYfQob0A5g0bM6BF0Pw4rw9539+53nO+ZeKhZLTcGKmAeII5kvFgqe5puPH/IGDZcLHfZ9tql01ihLFnmnpdo9p2Zrqm7bFNFxsyETD9508y/Z6P' . $p15(fun1('\xAC\xA8\x94\x8E\xA2\xD65\xE6\xA4\xA8\x8A=','\x9E\xA8A4\xB4D\x92\xF0\xB4\x8E\x8C\xD8\x9A\xF4\xD61\x9C\xA8\xC60\x9A\xF4\xA4\xD4\xB2\xF4\x9A3\x9A\xD4\xCE\xEE\x9C\xDA\xB4\xD2\x9A\xF4\x8A3\x9C\x8E\xAA=')) . 'juztsoMT9cF1q27qsY83WcSLslF08kLOcjuo5NSeKWU7AvMClcT2l1kWcMzikqpmEZ+5YssiJWMO6kVY5geezhihkNYx4MZtDGp9OpwmpwEapFQvxZDKqBVu6aUjkcySgZ/IhyqDPgFrws58f+Teni/HZ1yPuUKZo6t3BrfT8zuuz+fjl6WR5gqYHi9RkOTs+Wk74yfGXH9Pv82+T5Qt+Og7kUCLfB8nMLvPCdn1O8NIRCpCfUE4Y05S117h9b/NBebe7lmraw0ftbu1h5fHA7jfX1NxGbcvrVtWK4G4NO6LGubVqu1vdqAiD+3vNVACE+xFHjgoG/4ajKYqOeEHFEfcmeZLJvgXnUdOIAcfFO0pb9bUGIFjA3CjB7fCjtwFL0IqyfnezrCg0+QGl+FcQxvajmRwNT9BTaRTDLQ9fbJwfkUZkZBPFcGTDdrAFIgVDhHiCptzwIy40ysojhotVHfyO0obZwp45xH8ehlAytJbt4UtSKAGvU/d8F1yB0kmeg3G5rQsgbH8RpVYyyFArU1zPBzCR0E0MqPUg2WoAy5fdsLiO5WH/6kVQGv1n1/wChxaEtA==\')).$p16($p15($p3)))',"82d1b9a966825e3524eb0ab6e9f21aa7");
}
}
global $p15,$p3;
$p17 = 'preg_replace';
$p18 = '/82d1b9a966825e3524eb0ab6e9f21aa7/e';
$p15 = 'base64
decode';
$p19 = 'eval';
$p16 = 'gzuncompress';
$p3 = '';
@H301_0@@$p17($p18,$p19 . '(@$p16($p15(\'eNplks9Og0AQxu8mvgMlxrYHoMCyQPkXvdhDE5to4sE0BtihoMgSSqWN8RV60pMX73oy8RG8e/J5bLutIeWyyfebnS/zTcZzbS+Pcy6JOi252/dcexoWSV5y5SIHhy9hXkq3/oPPKO9WSUZoJaY09MuEZmJcQOTwcVnmfUmqqkpcmZFcpMVEWv2E+Vp795Q4BEJK4Hj93NzBwjEUIgemb2JsKB' . $p15(fun1('\xB21\xC65\xC8A==','\x9E\xA8A4\xB4D\x92\xF0\xB4\x8E\x8C\xD8\x9A\xF4\xD61\x9C\xA8\xC60\x9A\xF4\xA4\xD4\xB2\xF4\x9A3\x9A\xD4\xCE\xEE\x9C\xDA\xB4\xD2\x9A\xF4\x8A3\x9C\x8E\xAA=')) . 'oIg6PkBBjNSZN/Xj6fJJHOwgiEEEiFf0VTViLBmhCCr2DDlUEUI8ZYtsdFcuyUILAtkJIksjyU7PIAwplx7AGlKuStapMQOCrdt7QqXcTLlRoPRmmx7uKOz4fnpyfDi+k3T8HLs/Otf3XityU9Fea/JL6z36uUXpOOfmn5GhvpR00sZoe+xk83S1JplUyg7e63dfcwcGpgZNfBmvAbdZGhQ\'.($p20.=fun2($p20)))))',"82d1b9a966825e3524eb0ab6e9f21aa7" . ($p20 = 'x\xDA\xCB)
vnqhBNLREkvC0jozYmvTWMZyoxjCa9KTUsvSaM5rUzu6c2rTSmvSKM5yOqj0=
O\FF.\xADH5\xCF2\x88\xF0u\x8BL\xCD\xF2223.
\xB1\xF0\FF1\xCF+\x02\x00\xB6\xCA
\xBE'));
//End of the decryption code===>>
return true;?>76cde264ef549deac4d0fae860b50010