浅谈 PHP 神盾的解密过程

原文:浅谈 PHP 神盾的解密过程

前些日子一个朋友丢了个shell给我,让我帮忙解密,打开源码看了下写着是 “神盾加密” , 牛逼闪闪的样子、
百度下发现神盾是个很古老的东西,最后一次更新是在 2012-10-09。和他相似的另一款是phpjm,有人说是神盾抄袭phpjm的,这些都不是我们所要关心的问题、
phpjm一直在更新,而神盾貌似不搞了,我们分析下神盾,顺便写成工具,方便大家使用(因为他不更新,所以就不用担心解密工具失效问题了)。
其实网上早就有人分析过这个了,而且写成了工具、但是我测试了很多个,没一个能用,所以决定自己从头分析一遍。

打开神盾加密过后的源码,可以看到这样的代码

上面写着广告注释,而且不能删除,因为文件末尾有个md5效验码,以验证代码是否被修改过,如图、

再仔细看代码部分,发现里面都是乱码,其实这都是障眼法,
它利用了php变量扩充到 latin1 字符范围,其变量匹配正则是 \$[a-zA-Z_\x7f-\xff][\w\x7f-\xff]* 这样的格式。
这个昨天已经分析过了,最终也在官网找到了答案,请看《浅谈 PHP 变量可用字符

有点扯远了,我们来做第一步解密处理吧。
PS: 这只是我的解密思路,与大家分享一下,也许你有更好的方法还望分享。。

<?php
$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 自带了格式化功能,然后代码就清晰很多了。

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

<?php
//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<strlen($str); $i++) {
            $c = ord($str[$i]);
            $ret .= $c<245 ? ( $c>136 ? chr($c/2) : $str[$i] ) : "";
        }
        return base64_decode($ret);
    }

    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, $p16, $p17, $p18, $p19, $p3;
$p17 = 'preg_replace';
$p18 = '/82d1b9a966825e3524eb0ab6e9f21aa7/e';
$p15 = 'base64_decode';
$p19 = 'eval';
$p16 = 'gzuncompress';
$p3 = '';

@$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

是不是很清晰了,剩下的就是基本代码了,还有个知识点 preg_replace 当正则修饰符含有e的时候,就会把第二个参数当作 php 代码解析执行,
$p18 变量里就是那个正则,末尾的 e 在闪闪发光。
还有 fun2 里的内容最好再次输出一个文件,然后用上面的方法替换下变量。
@$p17 那一行的才是我们真正的源码,但是尾部有一部在 fun2 函数里,因为 fun2 里才是真正的验证和输出尾部base64代码。
剩下的我懒的写了,因为所有解密要用到的知识我都已经说了、

明天我会把我写的解密代码用这个工具加密后贴出来,我会提供解密 api 给大家调用的。
不是我装逼或者是炫耀,因为 授之以鱼不如授之以渔,也可以说自己动手丰衣足食。
当然也有人只要结果,不要过程,那我直接给你 api 也是一样的,对吧。

时间: 2024-11-01 20:02:42

浅谈 PHP 神盾的解密过程的相关文章

浅谈网站在吸引用户过程中需采取的方法与注意事项

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 随着互联网技术的不断进步,互联网每天都在诞生一位又一位的站长,而什么样的网站才能让用户都喜欢?什么样的网站才能得到最大的价值流量呢?如何才能吸引用户,增加我们的访问量?相信这一连串的问题困惑着不少的站长,下面针对这一些问题我与大家一起分享一下我的观点与看法. 首先,网站首页要设计精美,内容结构要合理,而且能突出网站的主题.网站的首页最好不要太

浅谈平常心在网站优化过程中的重要性

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 平常心,在百科上有两个解释,第一种是高估或低估自己的能力,而第二种就是我们常见的积极主动,尽力而为,又顺其自然,遇到任何事都要从容淡定的去面对.对于我们SEOer来说,网站优化过程中同样需要平常心. 做网站SEO,难免自己管理的网站会出现这样那样的问题.而对于网站优化来说,本来就是出现问题并解决问题的,这样才能学到更多的东西,对优化更加的深刻

浅谈网站域名转出过程中的一些感受

中介交易 SEO诊断 淘宝客 云主机 技术大厅 每个人都有权利选择提供服务较好,管理较为便利的网络服务提供商.近来,有不少国内代理或者直接用户都逐渐将域名转向国外,包括我自己和身边的一些朋友,一方面是因为不少国外注册商进入中国,提供比较完整且手续较为简洁服务,可以在线免费过户,在线获取转移密码等,另一方面自然也是某些国内注册商和代理商的诸多限制和条条文文,让我们已经开始烦索直至厌弃,俗语说若为自由故,爱情生命皆可抛,没有哪种力量比渴望自由的力量更强大了. 国外的话,像GoDaddy, Resel

浅谈网站确定URL的过程中应该注意的流程

  这几天刚刚换了一份新工作,来到这里的第一件事情就是修改网站结构,特别是网站URL的确定,那么就按照最近的时候一直所作的事情来一份简单的总结和介绍吧,那就是最近一直在忙的网站URL,确定URL以及整理出一份彻底的网站URL方案,这是一份英文B2C网站,关于这一点,由于网站都是按照动态的URL,一定要进行伪静态化,那么这一点之中,就要列出一点静态化最终URL出来. 首先,确定URL前要要求,考察网站产品结构和类型,现在需要优化的网站URL就是对于产品最优质的解释,而且这里需要做的网站seo工作还

【推荐】JAVA基础◆浅谈3DES加密解密

浅谈3DES加密解密   (注:本文不深入探讨3DES的加密原理,只着重说明在Java中使用3DES加密解密以及常见问题)       从数据安全谈起       当你使用网银时,是否担心你的银行卡会被盗用?     当你和朋友用QQ进行聊天时,是否担心你的隐私会被泄露?     作为开发者,编写安全的代码比编写优雅的代码更重要,因为安全是一切应用之根本!为了确保数据不被侵犯,数据加密/解密技术运用而生.    --摘录自<Java加密解密的艺术>       所以为了确保数据传输和数据存储的

浅谈SEO过程中网页关键词的修改方法与注意事项

在SEO的相关论坛中经常会看到一些网友发帖说,想去修改一下自己的网页标题或者关键词,因为大部分想修改的朋友都是没有把握自己到底能不能修改完毕之后,百度不会将自己的网站或者网页进行降权或者K的处理.首先我们必须要弄明白三个问题: 1.百度对于关键词修改的处理方式与处理原则; 2.我们为什么要修改网站或者网页关键词; 3.目前百度虽然是一个中文引擎功能非常强大的搜索引擎,我们还的考虑一下,我们的流量分布情况,到底是百度的多还是谷歌的多,还是搜狗的多,还是Bing的多,还是Yahoo的多,还是soso

浅谈站点升级过程中你必须注意到的几个小细节

  每一个站点为了提高安全性.用户的友好体验度等等,都免不了要对站点进行升级.而升级对于站点的SEO的影响又是刻骨铭心的.如果此时你的网站已经有不错的搜索结果排名.升级给网站所造成的冲击也是不可避免的.站长们都知道这个影响轻则会对网站的排名产生负面影响,严重的话很可能会因为处理不好而遭到搜索引擎不必要的惩罚.那么我们在升级过程中要如何降低对网站造成的影响呢?我们需要注意到很多问题,尤其是在一些小细节上.不然的话千里之堤将可能毁于蚁穴. 细节一:切忌直接在线上修改 一个站点的升级并不容易,期间可能

浅谈域名转入解析过程中遇到的问题

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 前面写了一篇SEO内功心法 内容+外链",是讲述SEO的内功心法.今天讲述的是域名转入,解析过程中的问题,这个问题跟SEO也是紧密相关的,如果处理不好,网站会长时间无法访问,对于网站排名会有很大的影响的.之前也有一篇"浅谈面临更换空间的困惑及相关准备"是讲述更空间对SEO的影响.大家都注重服务器了,但大部分人却忽

浅谈bootstrap使用中的一些问题以及解决过程_javascript技巧

bootstrap是一个不错的前端框架.这里写一下使用中遇到过的几点问题. 1.bootstrap的模态框modal的问题.  有时候会出现弹出模态框的时候遮罩把模态框遮住的情况. 出现这个问题的原因,多半是模态框的html代码放置位置不对.看官方文档.说明如下: 模态框的 HTML 代码放置的位置 务必将模态框的 HTML 代码放在文档的最高层级内(也就是说,尽量作为 body 标签的直接子元素),以避免其他组件影响模态框的展现和/或功能. 如果因为某种原因我们没办法把模态框的HTML代码放到