jmp
,test
,...)可能会误导自动工具对程序的分析。我的定义不够精确,而且我也不知道关于如何估计此类谓词的不透明度(其效率)的信息。因此,有人可以给出一个适当的定义,也许还可以提供一些示例吗?
#1 楼
这个线程中已经存在的答案是不错的答案。简而言之,一个不透明的谓词是“如果程序分析不够复杂,程序分析可能会错过的东西”。 Denis的示例基于恒定传播的反函数,并用作反校验和机制。 Joxean的SetErrorMode
示例是用于动态反仿真的基于环境的不透明谓词。 Ange的两个答案也都是动态反仿真。基于环境以及不常见的平台功能。 Ange的另一个示例更像是通过间接寻址进行的反汇编技巧。在学术文献中,不透明谓词被称为始终在一个方向上执行的分支,这对于创建者是已知的。程序的名称,并且分析仪的先验未知。从该定义中故意省略了不透明谓词的“硬度”概念。学术谓词通常基于数论构造,混叠关系,递归数据结构。基本上,程序分析研究人员通常会理解会导致程序分析工具出现问题的任何内容。
我最喜欢的研究人员Mila Dalla Preda表明,抽象解释器打破给定类别的不透明谓词的能力与该领域对谓词所测试的属性的“完整性”有关。 。她通过使用基于mod-k的不透明谓词进行了演示,并得出了与普通转换器(加法,乘法等)有关的mod-k完整域域(即不引起抽象精度损失)。然后,她探索了如何使用模糊的理论构造(如完整性精炼)来自动构造一个打破特定谓词类别的域。有关更多详细信息,请参见本文。
#2 楼
不透明谓词是一种模糊的条件,在执行条件操作后,将使分析变得更加困难,并且在某些情况下,直到对该条件求值之前要实际执行代码,这才是不可能的。中断静态分析(结果是不可预测的)或仿真(以告诉真实计算机和仿真环境之间的差异)。
它们可以依赖执行条件,CPU功能,API调用以及是否记录在案。
示例
初始值
由于寄存器的值在过程启动时既不是null也不是完全随机的,因此可以依靠它们来创建测试看起来随机但实际上是确定性的:
示例:
<EntryPoint>:
jnz <InvalidPath>
<ValidPath>
标志寄存器始终在EntryPoint上为
246
始终设置
ZF
因此,将永远不会使用
jnz
。校验和
计算so的校验和我的一段代码或数据
最好在运行时之前不存在的东西
与
expected_result ^ jump_target
异或盲目地使用结果跳转到某个地方
因此,可能无法提前告知下一条指令将是什么。
数学函数
实现渐近线FPU中的功能
与标准指令相比,FPU更可能不受支持或被错误地仿真/分析
实现足够的迭代以保证结果br />许多迭代可能会使仿真器用尽周期
在测试中使用最终结果作为跳转目标,等等。
#3 楼
谓词不一定必须很难评估。不透明谓词是一种条件,其结果是程序员事先知道的,并且不能静态地(例如,通过编译器)解析,而必须动态地解析。我在恶意软件中注意到的一个示例几年前:
SetErrorMode(100);
if ( SetErrorMode(1024) == 100 )
// Valid Path
else
// Invalid Path
如果不执行程序(或者不了解Win32 API
SetErrorMode
的工作原理),就无法确定程序将采用哪种路径。但是,由于SetErrorMode
返回最后一个先前的代码集,因此程序员在执行这段代码之前就知道第一条路径是唯一有效的路径。#4 楼
在恶意混淆的JavaScript代码中也可以找到类似的代码:001 vz = 1;
002 var1 = 49;
003 var2 = var1;
004 if (var1 == var2){
005 document.location = "http://path.to.malicious.website";
006 }
在这里,您会看到尝试在001-004行中声明var和条件,这些变量和条件毫无意义,并呈现给更改混淆的代码哈希,并使自动分析复杂化。
ps这是非常简单的示例,有关JS中不透明谓词的更复杂示例,请参见DefenceCode博客文章
评论
嗨,链接断开了。您是否知道我在哪里可以找到它?谢谢
– Yennefer
2月6日下午21:40
@Yennefer可以在Web Archive上的web.archive.org/web/20090116013739/http://profs.sci.univr.it/上找到该论文的存档副本。
–乔
2月16日在1:20
谢谢你的链接 :)
– Yennefer
2月16日9:04