欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[翻译]手把手静态分析FinSpy VM:第一部分,x86去混淆

[翻译]手把手静态分析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。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功