破解微擎2C(goto混淆)解密之旅

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

在这里插入图片描述

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

if($code){
echo 'code';
}
//反向解密
if(!$code){
echo 'code';
}

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

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

解析elseif语法:如果当前节点的下一个节点为if语法块,则进行elseif的还原if 下一个节点也是为 if 使用if-elseif拼接

//加密混淆代码
goto ZLIN5; xuT32: GkJl9: goto z0Q1l; qz2Od: echo "\347\254\xac\xe4\xba\214\344\xb8\xaa\151\146"; goto bm5cx; bm5cx: iMbaq: goto wnxep; RqBXL: if ($LDzsz == "\x31") { goto GkJl9; } goto Qx9cj; ogKCJ: goto iMbaq; goto xuT32; Qx9cj: if ($LDzsz == "\62") { goto ol5jq; } goto ogKCJ; BGe9N: ol5jq: goto qz2Od; ZLIN5: echo "\350\277\231\344\270\xaa\346\x98\xaf\151\146\55\145\x6c\x73\145\x69\x66\350\212\x82\347\202\xb9"; goto RqBXL; z0Q1l: echo "\351\234\200\xe8\xa6\x81\xe8\247\xa3\345\xaf\206\357\274\x9a\x31\x38\x33\x37\x35\71\x38\x39\x30\x36"; goto WJ2fG; WJ2fG: goto iMbaq; goto BGe9N; wnxep: echo "\x65\156\144";
//解密后代码
echo '这个是if-elseif节点';
if($code == '1'){
	echo '需要解密:1837598906';
}elseif($code == '2'){
	echo  '第二个if';
}
echo 'end';

解析else语法:如果遇到的混淆中间节点为goto的,则认定为else语句结束点并进行结束处理。
全部解密脚本用了一个多月的时间完成了!!!
暂时就写这一步,待续

发布了4 篇原创文章 · 获赞 3 · 访问量 9790

猜你喜欢

转载自blog.csdn.net/sinat_24083447/article/details/91955045