如何设计不透明的谓词?

逆向工程 混淆
2021-06-20 10:28:46

不透明谓词用于通过达到分析器可以执行的限制来破坏二进制代码的自动分析。

有人可以举一个在现实生活中发现的不透明谓词的例子(或几个例子)吗?而且,用于构建新的不透明谓词的方法是什么?

3个回答

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

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

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

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

制造廉价、弹性和隐蔽的不透明结构ACM 编程语言原则(POPL'98),1998 年 1 月。

这篇文章有 300+ 次引用。这篇论文是一篇关于不透明谓词主题的好文章,然后跟进引用以寻找引用它的新文章。

链接:制造廉价、弹性和隐蔽的不透明结构

我不知道任何现实生活中的不透明谓词。但是在论文Limits of Static Analysis for Malware Detection 中有一个非常有建设性的谓词混淆器它被证明对于精确的静态分析是 NP-hard 的。