PhpParser还可以用来解密

接了一个解密的单子,看了下程序代码,有大量的goto语句。刚开始以为可以用正则匹配并还原代码位置,就解决问题了,到了真正处理的时候,发现这样根本行不通。网上查了很多,都没有现成的解密工具。

这种其实也不算是加密,只是打乱了代码的顺序,理论上是可以手动还原的,但实际上,手动的话,会让你感到怀疑人生,因为代码量太大了。

发现有人用PhpParser来解密,这个工具本来是用来格式化php代码的。

以下内容来自网络:

单纯的if语句:这种单一存在的语句在混淆器中处理后,其中的condition会被反向 也就是条件反向的处理,所以处理if语句前需要遍历一次语法树进行condition的反向还原,即de_cond

复杂的if语句:比如if..else..和if..elseif..else等,这种if语句的处理只需正常处理即可

嵌套if语句:编程过程中,语句的嵌套是不可少的,而在混淆器处理过的代码中是没有嵌套可言的,一切都是在外层存在的,在处理if过程中,加入一个节点嗅探,如果嗅探到所嵌套的节点有if语法,则让本次混淆节点再走一遍综合if解析 ([funcion parse_if_stmt])

正常stmt混淆:比如echo "hello world";会被混淆成label xxxx: echo "hello world"; goto next_label;,也就是三个语法块为一条语句,然后使用这三个语法点构成一个混淆节点,类似$tunk[] = array($label,$stmt,$goto),其他语句相同

这里还原难度最大的还是if语句的还原,以为还涉及嵌套的if。下面是if语句的语句处理点:

解析elseif语法:如果当前节点的下一个节点为if语法块,则进行elseif的还原

解析else语法:如果遇到的混淆中间节点为goto的,则认定为else语句结束点并进行结束处理。

检测是否为跳点:由于混淆器内部会有多余的label进行干扰,需要构建一个跳点检测器进行跳点处理,处理foreach等loop语句的干扰节点,遇到这些节点后将跳过一个混淆节点。

建立节点监听器:最后需要有一个语法树的traverse,你可以建立一个自己的节点监听器,监听过来的语法,然后处理如function、ClassMethod、TryCatch等节点的混淆语法树。

最后说说我写解密脚本过程遇到的问题吧。

对于上面提到的正常的stmt混淆的还原还是比较简单的,写脚本的第一天就完成了这一步。

最让人头疼的还是处理if语句,外层的还原还是很简单的,但是遇到嵌套的处理时就非常头大了,我一共用了3天写这个脚本,其中两天都是在处理if语句。

Mine吧 » PhpParser还可以用来解密

2 评论

  1. 希望大神能提供个解密脚本研究一下,万分感谢502080116@qq.com

    1. 有两篇xend解密小记,可以翻看一下博客文章。

发表评论