如何通过符号分析/执行来实际处理 VM 混淆代码?

逆向工程 去混淆 动态分析 虚拟机
2021-06-25 14:21:55

处理 VM 混淆代码并开始学习符号分析,但很难将我的头脑围绕在如何将其实际应用于问题上。如果有人能给我一些指点,我将不胜感激。

  • 通过动态分析,我是否应该只模拟 VM 以获得符号绑定?如果是,我怎样才能在不触及其余部分的情况下只对二进制文件的那部分进行反混淆,并且如果我只触及一小部分(跳转位置可能关闭或不指向任何地方)重建新的二进制文件甚至可以工作?我怎么做?我读过的很多论文都合成了一个新的 C 程序或使用了 llvm-ir,但这不是整个程序,而只是 VM 循环。现在我如何合并它?
  • 如果我模拟整个二进制文件以获得它的符号表示(就像我在一些 CTF 文章中看到的那样),那是不是意味着我只有这个二进制文件的主要路径的表示?(无输入)。我重建的二进制文件会缺少从头到尾不在主要跟踪中的交互,不是吗?
  • VM 混淆代码通常具有一个加密密钥,该密钥随着每个被解释的操作码而变化。如果我有一个符号表示,我仍然无法任意反编译整个虚拟操作码,因为我当时不知道加密密钥。

除了混乱之外,我现在正在查看的二进制文件不仅有一个混淆的 VM 循环,而且有多个,这在使用商业 VM 混淆时显然并不少见。一个简短的跟踪给了我超过 4 个看起来像 VM 循环的结构。调试它告诉我,用于每台机器指针的 VM 堆栈/上下文/寄存器是不同的和随机的。所以现在,

  • 我是否一对一地处理 VM?就像,我反转一个直到它调用第二个(比如 VM1 有时调用 VM2),然后重新编译一个没有它的二进制文件,然后转到下一个?
  • 我可以模拟整个事情,即使这意味着它将模拟潜在的数十个 VM 循环吗?我猜如果用于内部堆栈的寄存器随着时间的推移而不同,符号分析将不会真正起作用
  • 如果我有多个 VM,我怎么知道哪个字节码由哪个 VM 解释?我可以从这些部分进行猜测并分析我的跟踪,但我拥有的跟踪仅适用于主路径,应用程序的其他分支不在其中。

我对它的理解是这样的:

  • 识别 VM 循环并分析它存储上下文、堆栈指针、操作码指针、vmkey 的位置
  • 创建循环的符号表示以及它如何提取下一个操作码
  • 找到 VM 的所有处理程序并创建它们的符号表示
  • 以某种方式使用这些知识然后去虚拟化它

总而言之,我真的很困惑。我阅读了一些关于它的论文,但安全研究人员并不真正喜欢发布工具/代码示例,因此它们都只是理论和抽象的。

0个回答
没有发现任何回复~