我有一些(像往常一样非常模糊)关于语义混淆的思考,这来自这个问题以及@RolfRolles 和@Andrew 的出色回答。据我了解,在作者的观点。本文对基于语义的代码混淆是研究的混淆程序的语义端,而不是语法端。这意味着,对程序代码的修改可能导致对抽象语义的修改,这里的抽象语义不是指称语义,而是程序的抽象表示,从抽象解释程序接收到的——作为系统静态——分析方法。
为了更清楚,我们考虑一个例子:让 P 是一个程序,t 是一个保留 P 的指称语义的变换,它将 P 修改为
P' = t(P)
并将 P 的抽象语义 S 上的修改 t' 导出为
S' = t'(S)
现在我们将说 t 是有效的,如果 P 的某些属性 Prop 与 S 的相应语义属性 SProp 相同,则: SProp 不被 t' 保留。换句话说,即使通过静态分析,Prop 也会丢失。我们也可以看到,这里我们考虑的是对抽象语义的修改,而不是对代码的修改。
代码转换(混淆器)t的强度由t未保留的属性集O(t)计算,即
t1 < t2 仅当 O(t1) 属于 O(t2)
但是(据我所知)隐含地假设 O(t1) 和 O(t2) 是可比的,我不是说 O(t1) 和 O(t2) 不属于彼此的情况,而是O(t1) 和 O(t2) 的每个元素在理性意义上不可比的情况。
例如,我们可以想象在 1960 年之前的某个时期,没有人知道快速排序,而每个人都知道布尔排序。假设有人写了一个 bublesort B 和(偶然地)一个将 bublesort 修改为快速排序 Q 的转换,因为没有人知道这种奇怪的排序算法,那么他们会(理性地)说它是一个模糊版本的 bublesort。然而,当我们将这种情况应用于上述语义框架时,我们可以看到 B 和 Q 的抽象语义属性没有任何共同点(即可比性)。
所以我的问题是:基于语义的代码混淆如何处理上述情况?