逆向工程实践中的常识是,尝试在“受VM保护”或虚拟化的程序上使用本机调试器或反汇编器要困难得多。但是,我想知道具体的具体方式和原因。请列出一些原因,以及有关是否已经手动克服了各种原因(不使用脚本)的任何相关工作。例。该示例是我们试图使用本机调试器(例如x64Dbg)来定位对Windows API CreateFile的调用,并找出文件写入的位置。在一个不受保护的程序中,我们可以打开它,在创建File上放置一个断点,并在检查了交叉引用的调用后找到该调用。

Themida Protector如何成功阻止此过程?显然,到最后,程序仍必须写入文件,但是哪些步骤严重阻碍了分析?

评论

这不仅仅是使用调试器/反汇编器,而是整个分析过程。这个问题不是重点。在我看来,这个话题太多了。特别是关于最后一部分。如果您有示例,请将其添加到问题中以使其更易于回答。

@ EWD-0-您的意思是要检查的特定文件或特定类型的vm?

查看添加的示例

static.usenix.org/event/woot09/tech/full_papers/rolles.pdf,ieeexplore.ieee.org/document/5207639

msreverseengineering.com/blog/2018/1/23/…,welivesecurity.com/wp-content/uploads/2018/01/WP-FinFisher.pdf

#1 楼

这取决于您的目标。如果您只关心副作用(如API调用,书面文件,网络内容等),则它们并不会真的使生活变得困难。如您所说,最后必须使用API​​,您才能捕获它。

虚拟化的目的是防止人们了解目标的内部流程。因此,通常人们只虚拟化特定的代码块以减少总体负面性能影响,并仅保护例如读取许可证文件的代码,进行加密的代码等。

从目标中提取算法很繁琐。如果您的问题是内部发生了什么,那么VM保护是最糟糕的。如果您只关心目标的作用,那么它们什么也没做。

#2 楼

因此,据我所知,这个问题有两个主要部分。
首先,为什么很难对虚拟代码进行反向/分析。标准汇编指令具有特定的字节码,通过它们您可以了解程序中正在发生的事情。通过使用虚拟化,可以创建任意字节代码,然后将其转换为系统可以理解的原始代码。这意味着通过查看代码您无法理解发生了什么。

当我们遇到虚拟化机器时,这种情况会更进一步,这些机器在运行时会部分生成原始代码,而不是一次全部生成代码。因此,作为分析师,您会在运行时看到实际程序集的一小部分。

关于CreateFile / WriteFile的第二部分。如果通过本示例说明要分析程序的行为,则在大多数情况下,虚拟化可执行文件与普通可执行文件之间没有区别。在这两种情况下,您都可以将BP放在调试器中的CreateFile / WriteFile上,或者通过更好的方法进行黑盒监视。重型保护程序/反调试技术。

http://resources.infosecinstitute.com/reverse-engineering-virtual-machine-protected-binaries/#gref

http: //resources.infosecinstitute.com/tutorial-building-reverse-engineering-simple-virtual-machine-protection/#gref