在逆向中,IDA是经常使用到的工具,在IDA中使用最频繁的就是F5了,能够让我们看到伪C代码,但有时会看到如下语句。
a1 = ( ((v48 * v34)+ (((((v19 * (v2 * v14)) * v34)+ ((v44 * v34)+ ((((v40 * v35)+ ((v35 * v39)+ ((((v32 * v35) + ((v10 * v28) + ((((v10 * v25) + ((v23 * v10) + ((((v9 * ((v2 * v14) * v11 )) + ((((v8 * v9) - (v9 * v12)) - (v9 * v17)) + (v9 * v19))) - (v9 * v20)) - (v22 * v10)))) - (v10 * v26)) - (v10 * v27))))- (v36 * v35))- (v38 * v35))))- (v35 * v41))- (v42 * v34))))- (v46 * v34))- (v47 * v34)))
这时候想理解句子的意思就比较难了,主要问题在于不知道表达式中的小括号是否影响到运算的优先级,以前比较老实,在不影响运算优先级的情况下,手动删除一对对无效的括号。能不能像办法用代码的方式解决呢,这时候编译原理就有用了,编译原理中的语法分析就可以消除所有括号,并且保证运算优先级正确。当然要进行语法分析之前,还要做词法分析,在语法分析完之后会生成一颗抽象语法树,最后用中序遍历的方式遍历以及打印树中节点的内容,就能看到优化后的表达式。