其想法是通过将两个值混合在一起并对混合值执行运算来混淆反向器。一旦完成所有操作,就可以通过一些简单的操作重新组合结果。例如,一个幼稚的例子可能是: )。但是,您可以想象更复杂的初始纠缠方式,将所有内容重新拆分为两个(或多个)变量,例如通过将它们加在一起
必须为这种新格式重新定义加法,乘法,...等操作,以免误导反向器。
我现在的问题是,有人知道吗可变纠缠的这种模式是否不同(我提供的模式真的很基本)?并且,也许可以提供有关它的指针或出版物?
#1 楼
我不确定这是否符合您的要求(很可能您已经弄清了所有更多内容),但这是一个粗略的形式化,然后是一些实现想法。从概念上讲,这试图将纠缠几个值的含义与纠缠值的表示方式分开。形式化
从概念上讲,纠缠值可以看作是聚合,其中不同的组件保留其值,彼此不干扰,并且可以独立提取。认为这种总量的一种方便方法是将值视为n元组。为简单起见,我在这里假设n = 2。另外,我假设我们有一些操作可以从值的集合构造元组,并从元组中提取组件值。 />为此,对于原始程序中的每个操作op,我们现在有2个版本:op1在2个元组的第一个组件上运行,而op2在2个元组的第二个组件上运行:
最后(这是混淆的地方),我们需要一种方法将元组编码为值,并将值解码为元组。如果值的集合是S,则我们需要两个函数enc和dec,它们必须彼此相反: dec:S-> S x S(将一个纠缠值解码为其分量)
全部的enc(dec(x))= x x
示例:
enc取一对16位值并将它们嵌入到32位值w中,以便x占据w的低16位,而y占据w的高16位; dec接受一个32位值并将其解码为一对,其中x为低16位,y为高16位。
enc接受一对
从实现的角度来看,我们希望能够直接对值的编码表示形式执行操作。为此,对应于上述每个操作op1和op2,我们需要定义必须满足以下健全性标准的“编码”版本op1 *和op2 *:对于所有x1,
,x2和y:x1 op1 * x2 = y IFF enc(dec(x1)op1 dec(x2))= y
,对于op2 *同样。
省略了许多细节(大多数情况下很容易解决),可以用各种方式来修饰这种基本方法,但是我不知道这是否符合您的要求以及是否非常简单,您已经自己解决了所有问题。无论如何,我希望这是有用的。
我忘记了这篇论文,它讨论了一个看起来很相关的转换(请参见第6.1节“拆分变量”)。 “):
克里斯蒂安·柯尔伯格,克拉克·汤博森和道格拉斯·洛。打破抽象并破坏数据结构。 IEEE国际计算机语言会议(ICCL'98),1998年5月。(链接)
评论
我认为您完美地定义了基本运算符并对其上下文进行了形式化。但是,我给出的示例可能太幼稚,因此有点误导。举一个更好的例子,如果您有x = a ^ b和y = a ^(〜b)并尝试通过对x和y的操作对a和b应用一些操作,该怎么办?在这种模式下,纠缠一词在我看来更为明显。我将尝试对此模式进行一些挖掘,并提出一个完整的示例。最后,这是完全无关的,但是您是Saumya Debray吗? (我读了他的几篇论文,而且我是一个超级粉丝!:))
–恐怖
13年7月17日在15:54
我想我现在更了解混淆的微妙之处-谢谢!我需要再考虑一下。 (在一个无关的音符上,我的名字的确是Saumya。:-)
–debray
13年7月18日在2:55
@perror:我给出的形式化似乎功能不足以捕捉您的想法。但是与此同时,我还记得Collberg等人的一篇论文。描述了可能相关的转换:请参阅上面的修改后响应。
–debray
13年7月18日在13:43
是的,这正是我想要的!谢谢 !因此,它称为“分割变量”。
–恐怖
13年7月18日在14:29
评论
这是实际来源还是反编译器吐出来的(或您是基于反汇编创建的)?X未初始化。不应该吗? b代替&b?同样,long不一定是int大小的两倍。为什么不发布工作示例?这样可能更容易为您的问题提供有意义的答案。
实际上,这是纯粹的垃圾。只是在这里说明这个想法。它甚至不会编译。我有一些汇编中的示例(x86 + SSE),但它们并不是很明确和易于理解。
@newgre:感谢注意到所有这些错误(对不起,起初没有解决此问题,我正忙于做其他事情……)。
我不知道专门探讨这种技术的出版物,但是JBCO对此做得很弱(sable.mcgill.ca/publications/papers/2007-1/…)。