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

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

经过研究,这种混淆器的混淆点和解决办法主要分以下几点:

if($code){
echo 'code';
}
//反向解密
if(!$code){
echo 'code';
}
$need_to _decode=true;
if($need_to _decode){
echo ‘需要解密,联系 qq 1837598906’;
}

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

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

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

你可能感兴趣的:(解密)