不透明谓词用于达到分析器功能的极限,从而破坏了二进制代码的自动分析。生活案例?而且,用于构建新的不透明谓词的方法是什么?

#1 楼

我几年前在恶意软件样本中发现的一个不透明谓词:

SetErrorMode(1024);
if ( SetErrorMode(0) == 0 )
  SayHiToEmulator();
DoRealStuff();


关于另一个问题,如何构建新的不透明谓词,我认为这取决于您想要破坏的分析仪。破坏旨在发现错误的静态代码分析器与破坏旨在模仿恶意软件运行环境的仿真器是不同的。

但是,让我们说,您想破坏恶意软件仿真器:您可以从最常用的库(kernel32.dll,advapi32.dll,user32.dll等)构建API列表,创建一批证明,在其中执行这些API更改参数并检查返回值和生成的异常,如果有的话,并保存结果。然后检查此类API的结果并找到候选者:例如,与此类API的输入相关的返回值是不透明谓词的良好候选者。很少发生且带有某些特定输入的特定条件(异常或返回值)更好。只是一些想法...

#2 楼

参见:Christian Collberg,Clark Thomborson和Douglas Low,制造廉价,有弹性和隐身的不透明构造,ACM编程语言原理(POPL'98),1998年1月。 knot.kaist.ac.kr/seminar/archive/80/manufacturing-resilient.pdf(PDF)

#3 楼

我不知道任何现实中的不透明谓词。但是在论文“针对恶意软件检测的静态分析的限制”中有一个非常有建设性的谓词混淆器。它被证明对NP很难进行精确的静态分析。