如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留链接信息。

苏南大叔挑选wordpress皮肤的时候,发现了个挺精致小巧的皮肤。不过里面有一些不太和谐的地方,想给它修改掉,这个时候,按着既往经验,居然搜索关键词语时全部失败没找到。我忽然意识到,这是个加密的wordpress皮肤。虽然对于php程序来说,加密的代码并不多见。90%以上的php都不是加密的,但是并不排除存在加密的php的可能性。

基本文件描述

究竟是那些文件是加密过的呢?NetBeans非常“智能”的出卖了那些加密的PHP文件。

enphp2算法加密的php代码的解密思路 - netbeans_spy

经验上来说,只要这个php不是必须在某个dll或者so扩展下面才能运行的话,那么这个php就存在着手工解开的可能性。按理说,php解密和js解密一样,都不外乎eval的那些思路。不过,今天看到的这个加密,却非常特别,猛一看上去,和仔细看上去,都觉得这段代码绝无解密的可能性。但是确实正确执行了,这个就让人十分不解了。这代码加密的原理究竟是什么呢?

enphp2算法加密的php代码的解密思路 - notepadpp_enphp2

折腾了好半天,得出了一些结论。不过我要事先声明一下:

首先,我并没有解开这个加密(请该算法作者和该皮肤作者放心)。其次,仅仅为学习的目的,分析了该代码的加密方式。这些加密算法都会有一些奇淫异巧的技能点的。苏南大叔在这里,就get到了好几个罕见的php技能。关键技能点如下:

解压缩

据说gzinflatesubstr在一定组合下就相当于gzdecode函数。 。

if (!function_exists('gzdecode')) {
    function gzdecode($data)
    {
        return gzinflate(substr($data,10,-8));
    }
}

这2个函数的功用就是解压缩专用的函数,用函数gzencode压缩的数据,使用gzdecode或者gzinflate进行反向操作。说白了,就是大家常用的gzip功能。

十六进制

十六进制是这个加密程序的最大掩护之一。绝大多数编辑器打开这个php文件后,都是不能正确理解的。连php的语法都不能符合。但是请注意,php正确执行了这段php代码,那么就说明,它肯定是符合php语法逻辑的。所以,苏南大叔利用世界上最厉害的notepad++来完成这个转化过程。

enphp2算法加密的php代码的解密思路 - enphp2-compare

enphp2算法加密的php代码的解密思路 - notepadcpp

经过notepad++的“照妖镜”功能后,我们看出了符合php语法的雏形。但是在最后一个箭头处,似乎还是不符合php中的语法。这里是如何理解呢?那么就引出下面一下个技能点。

error_reporting(E_ALL^E_NOTICE);

没错,你没有看错。就是这句每天你都会看到的函数。写在每个php文件顶部的函数,就是它,给加密的代码提供了温床。如何理解?这段代码的意思是提示所有的错误,但是不提示notice类型错误。每天都这么写,从来没有深究过,这句话到底是什么意思。不提示notice类型,而上图中最后一个箭头位置,触发的就是个notice类型的错误。为什么这么写,就明白了吧?

关于函数error_reporting的说明见这里: https://doc.php.sh/zh/function.error-reporting.html

那段百思不得解的不符合php语法的乱码,确实是不符合语法,确实是个错误。但是,php并没有提示这个“notice”。这段乱码就成功的成为了这个加密功能里面的盐(障眼法)。如果不信,你可以去掉“^E_NOTICE”试试看,你就能明白我说的是什么了。

{0x001}

这个如何理解?很好理解,调试过js加密解密的话,你就会明白。很多我们常写的语句,是有特殊的写法的。{0x001}其实就是“[1]”,就是数组的1号元素的另外一个写法。是不是够“奇淫异巧”的吧?你绝对想不到吧?没有天马行空的想象力,这些乱码是无法理解的。

notepad++

在所有现有的编辑器全部沦陷的情况下,notepad++胜利完成了任务。通过“编码=>以utf8 noboom编码”实现了“照妖镜”的功效。然后,这种情况下,任何复制粘贴功能也全部失效。复制粘贴得到的东西,已经物似人非。这个时候,notepad++的hex editor插件,十六进制编辑器,完美的完成了任务。(听上去非常像软件破解了吧?软件破解找到爆破点之后,就是编辑十六进制,用同等数量的字符进行填充。)

notepad++的安装及插件安装的教程,请点击这里:

enphp2算法加密的php代码的解密思路 - notepad

上述这些技能点get到之后,这段看似不可能完成的任务,也就变得可以完成了。不过,我没有破解掉它。大家都是程序员,程序员何苦要为难程序员呢?对吧?

题外话:

去这个enphp2加密算法的作者的开源代码git上面,仔细翻了翻。以为里面会有它加密的算法在里面,结果...... 果然,他的思路是saas。赞,苏南大叔在这里只能给他狂点赞了,一万个赞奉上。

enphp2算法加密的php代码的解密思路 - enphp2

本站采用创作共用版权协议, 要求署名、非商业用途和相同方式共享。
转载本站内容必须也遵循“署名-非商业用途-相同方式共享”的创作共用协议。
程序如此灵动~》下所有原创文章,如被用于商业用途,请您按规定支付稿费。