[翻译]手把手静态分析FinSpy VM:第一部分,x86去混淆
原文:http://www.msreverseengineering.com/blog/2018/1/23/a-walk-through-tutorial-with-code-on-statically-unpacking-the-finspy-vm-part-one-x86-deobfuscation
1.介绍
通常当我发布有关分析VM保护的内容时会介绍新的技术。过去的例子包括:
Writing an IDA processor module to unpack a VM
Logging VM execution with DLL injection
Compiler-based techniques to unpack commercial-grade VMs
Abstract interpretation-based techniques to deobfuscate control flow
Automated generation of peephole superdeobfuscators
Program synthesis-based deobfuscation of metamorphic behavior in VM handlers
今天的文章重点有所不同。我不打算展示任何新的技术。相反,我将逐步介绍我分析FinSpy VM的过程,包括我整个过程中的想法,我使用的方法和代码,以及我所做笔记的摘要。我鼓励感兴趣的读者获取样本并自己完成分析过程。
我发表这个系列博客的原因有三个:
1.我认为如果每个病毒分析师都能够在他们遇到FinSpy时分析FinSpy病毒的VM(出于显而易见的原因)对安全防御社区来说有着最大的利益。
2.现在逆向工程缺少动手实践的教程。我很幸运地在这样的教程很常见时开始学习逆向工程,并且它们对于帮助我学习这些技术来说是无价的。幻灯片适用于大型分析,但对于小型分析,为了关注我们的人我们还是用教程的形式。
3.在过去的五年中发表的关于混淆的资料变得极其深奥,尤其是关于虚拟化混淆的。对于那些不了解硕士学位(或以上)具有的程序分析的知识的人来说,这些资料中的大部分基本上是无法理解的。我想证明,对于一些现代混淆技术,更简单的技术仍然可以产生令人惊讶的快速和有用的结果。(如果您想了解更多基于程序分析的反混淆方法,目前有公开的我的基于SMT的程序分析培训课程,该课程有超过200张关于现代反混淆的幻灯片,并且具有可以运行的包含文档的代码。)
2.开始
我在了解到一个带有VM的新FinSpy样本公开的时候做的第一件事当然是获得样本。VirusTotal给了SHA256,我从Hybrid-Analysis中获得了相应的样本。
下一步是将样本加载到IDA中。导航栏立即提示我该二进制文件被混淆了:

text节的前半部分大多是灰色和红色,分别表示数据和非功能代码。
text节的后半部分在导航栏中为灰色,表示数据转换为数组。
普通的二进制文件的text节几乎全部都是蓝色,表示函数中的代码。
3.分析WINMAIN:怀疑基于VM的混淆
IDA的自动分析功能确定该二进制文件是由Microsoft Visual C编译器编译的。我从确定WinMain函数开始。通常IDA会为我做这件事,但该位置的代码被混淆了,所以IDA没有将其命名或将其变为函数。我通过检查Visual C运行库中的___tmainCRTStartup函数并找到它调用用户编写代码的位置来找到WinMain。前几个指令类似于一个正常的函数开头,接下来立即就是混淆了。
.text:00406154 mov edi, edi ; Normal prologue .text:00406156 push ebp ; Normal prologue .text:00406157 mov ebp, esp ; Normal prologue .text:00406159 sub esp, 0C94h ; Normal prologue .text:0040615F push ebx ; Save registers #1 .text:00406160 push esi ; Save registers #1 .text:00406161 push edi ; Save registers #1 .text:00406162 push edi ; Save registers #2 .text:00406163 push edx ; Save registers #2 .text:00406164 mov edx, offset byte_415E41 ; Obfuscation - #1 .text:00406169 and edi, 0C946B9C3h ; Obfuscation - #2 .text:0040616F sub edi, [edx+184h] ; Obfuscation - #3 .text:00406175 imul edi, esp, 721D31h ; Obfuscation - #4 .text:0040617B stc ; Obfuscation .text:0040617C sub edi, [edx+0EEh] ; Obfuscation - #5 .text:00406182 shl edi, cl ; Obfuscation .text:00406184 sub edi, [edx+39h] ; Obfuscation - #6 .text:0040618A shl edi, cl ; Obfuscation .text:0040618C imul edi, ebp ; Obfuscation .text:0040618F mov edi, edi ; Obfuscation .text:00406191 stc ; Obfuscation .text:00406192 sub edi, 0A14686D0h ; Obfuscation ; ... obfuscation continues ... .text:004065A2 pop edx ; Restore registers .text:004065A3 pop edi ; Restore registers
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
