我有不可区分的模糊一些粗浅的想法,这些都来自这个问题@perror和@mikeazo这里大约建设给出的不可分辨混淆的答案本文。
恕我直言,这个混淆器确实是一个突破,因为它说,理论上,我们可以编写混淆的程序,以便从它们中提取的属性总是微不足道的。为了更清楚,我们考虑所有程序的集合:
Progs = { P1,P2,...,Pn,... }
与程序 P 语义相同,那么可以从 P 的混淆版本 Obf(P) 中提取属性(显然 Obf(P) 在 Progs 中)也存在于Progs中的程序中,即我们无法区分Obf(P ) 来自 Progs 中的任何程序。
例如,假设 P 是一个实现排序算法(例如 bublesort)的程序,那么 Progs 由实现所有排序算法(例如快速排序、插入排序等)的所有程序组成。然后有趣的是我们不能将 Obf(P) 归类到任何现有的排序算法中,它混合了所有可能的算法:对于某些输入,它表现为 bublesort,对于其他输入,它表现为快速排序,等等。因为如果我们可以分类为一些现有的算法,那么这意味着我们可以从 Obf(P) 中提取重要信息(例如算法的复杂性)。
问题是这样的混淆器总是将程序转换为语义等价的程序。但是,如果逆向程序使用一些反混淆器 DeObf,可以使用“人类可以理解的”程序来近似 Obf(P):
P' = DeObf(Obf(P))
即 P' 和 Obf(P) 在语义上不是等价的,但它们“大部分”是等价的:在大多数情况下,在给定相同输入的情况下,P' 返回与 Obf(P) 相同的输出。
我想到一个非常幼稚的想法是“检测”Obf(P) 的代码(例如将一些反混淆程序插入 Obf(P),它们与 Obf(P) 一起执行,但不会改变太多 Obf(P) 的语义) ),我们可以提取一些非平凡的属性。
所以我的问题是:DeObf 的存在是否与不可区分混淆器 Obf 的存在相矛盾?
谁能给我一些建议?