当前位置: 移动技术网 > IT编程>开发语言>PHP > 神盾加密解密教程(二)PHP 神盾解密

神盾加密解密教程(二)PHP 神盾解密

2019年06月03日  | 移动技术网IT编程  | 我要评论

南昌县租房,含山房屋出租,莱雅娜的坠饰

其实网上早就有人分析过这个了,而且写成了工具、但是我测试了很多个,没一个能用,所以决定自己从头分析一遍。

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

上面写着广告注释,而且不能删除,因为文件末尾有个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 也是一样的,对吧。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网