关于php 魔方加密的的一些分析

大兄弟 2017年12月24日0   432

 最近各个解密平台都已经推出了解密魔方的工具,解密效果还是比较可观的。

但无论出于个人兴趣还是生意争夺,各个开发者都不愿意透露一丝半点的思路。

而我也在用我仅有的知识对魔方二代进行研究以及破解,以下内容仅代表个人的技术思路。

首先,魔方加密的最大特点在于他的自解密算法非常复杂,加密后的代码都是不可读的,最重要的是他的自解密是把源代码分开一句一句地执行的。这就造成解密算法的解剖不像以前的混淆那么顺理成章了,所以我们第一步要做的就是把他的自解密改成不需要一步一步执行的。

通过变量的还原和代码的调试,自解密过程中最重要的是一个存储着整个自解密过程的内存变量。它负责调度自解密的运行顺序。

通过对比,魔方加密拥有一段公开并附带在加密文件中的自解密代码,并且每一个加密文件中,这段代码都是固定的

所以我们从魔方加密代码里提取自解密的源代码,并尝试修复与改动,把所有含有$指针变量=0x000xx;的代码都执行,其他不包含该语句的代码都忽略不执行,这样我们调试起来就变得简单很多了。QQ图片20171224184523.png

通过提取自解密代码的调试,我们可以构造一个运行顺序的数据表格

上图就是通过自解密代码调试出来的,相信具备一点解密技术的人都不难看出,这是一个通过解剖原代码的自解密过程,执行的时候从数据段中一块一块地提取数据拼凑成需要执行的代码段。别看魔方加密很高大上,其实他的核心还是eval函数,目前为止没有哪一家可以做到不通过扩展而且又摆eval函数的加密。既然有eval函数,就意味着他的加密不具备完全不可解的能力。

如果做不到自动还原,那只能对照数据表格来一句一句地还原了,并且你需要具备很高的php编码能力。下面说一下魔方的变量名的还原方法。

图一的d7行,这在自解密的内部是这样的QQ图片20171224190048.png

这里看到了php里面很罕见的引用符,明眼人都知道原理了,其实这就是这个加密的一个变量保存与赋值的中转站。

然后我们看cb行的rundata1列框里有个islogin,不难猜到,这是个自定义的标识而下一行开始就执行了变量引用,说明变量islogin开始被引用了。即f2行的代码可以还原为$islogin==1。



下面重点讲一下if语句的还原。QQ图片20171224191405.png

图中22a到285是一个完整的判断过程,但看到285下一行并没有转到0x000002E1,所以判断是false的,所以我们要手动转到0x000002E1中看一下QQ图片20171224191729.png看来这个地址的确是存在的,并且里面很多需要执行的php语句块,但问题是我要怎么知道这是要执行到哪里才为一个if语法块呢。通过观察

QQ图片20171224192016.png670行的时候转向了一个地址0x000001FB,但再往下看的时候会发现我们又回到了我说的那个完整的判断过程(可以与以上的图对比22a到285),也就是说到670的时候if的语句块就开始结束了,这时候我们很容易联想到php中另一个罕见的语句,叫做goto。即在1fb处就是一个goto语法块。


if语句的分析就这么多了。目前在线解密的工具出来了,说明自解密是相对安全的,我的方法估计也是可行的。