记录一次PHP使用goto混淆加密的解密之旅

最近有朋友找我修复微擎一个模块小程序的功能,接到文件浏览了一遍,原来是goto混淆,最后我是拒绝了解密。
这种加密方式已经不是第一次见了,以前也有很多人找我弄过这种,当时也尝试过去还原,捣鼓了3天左右,不得不说这种加密看起来很简单,其实还原起来非常吃力,第一次解密以失败告终。后来遇到这种加密的单子也是直接拒绝了,因为太难了,如果按照当时的见识和技术去研究的话,直到解密完成起码要花1-2个月,而且解密这种文件顶多也就收四、五块钱一个,所以没有必要浪费这么多时间去研究。

不过拒绝这个单子后回想,以前看过一些在线的解密,0.3-0.4元/kb,所以过后考虑一天,决定研究去解密。

讲解goto加密之前先上几张样本图:


经过研究,这种混淆器的混淆点和解决办法主要分以下几点:
if($code){
echo 'code';
}


单纯的if语句:这种单一存在的语句在混淆器中处理后,其中的condition会被反向 也就是条件反向的处理,所以处理if语句前需要遍历一次语法树进行condition的反向还原,即de_cond
if(!$code){
echo 'code';
}
复杂的if语句:比如if..else..和if..elseif..else等,这种if语句的处理只需正常处理即可

解析elseif语法:如果当前节点的下一个节点为if语法块,则进行elseif的还原if 下一个节点也是为 if 使用if-elseif拼接
解析else语法:如果遇到的混淆中间节点为goto的,则认定为else语句结束点并进行结束处理。
暂时就完成了这一步,待续

THE END
喜欢就支持以下吧
点赞0
分享
评论 抢沙发
  • 管埋员

    昵称

  • 取消

    请填写用户信息: