关于不可区分性混淆(非正式)

逆向工程 混淆 去混淆
2021-06-30 13:04:34

我有不可区分的模糊一些粗浅的想法,这些都来自这个问题@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 的存在相矛盾?

谁能给我一些建议?

1个回答

您的 DeObf() 可以提取 C2 不共享的 C1 的重要属性,因此它充当“区分器”。这与不可区分混淆器的存在相矛盾,即使 DeObf 的输出只是一个近似的去混淆。

运行时间不能用于破解不可区分电路混淆器。不可区分性混淆器只需要在大小相当的电路上工作。如果 C2 远大于 C1,则允许产生与 Obf(C1) 明显不同的电路 Obf(C2)。

尽管有一些结果,但关于图灵机(和真实程序)的混淆的正式了解较少。最新的结构被证明仅对“通用”攻击是安全的。以前已知此类证据与非通用攻击相矛盾。