记录一次破解微擎2C解密(goto解密)之旅一单if语句的因为被反向所以内部节点实际为外节点对于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等节点的混淆语法树。
THE END
喜欢就支持以下吧