Home

Awesome

awesome-vmp

关于软件虚拟化保护(如VMProtect)的资料。

工具篇介绍了VM保护的现有分析工具,并进行了简单的试用分析。

文章篇介绍了VM保护相关的分析文章,包括对虚拟机的分析,及一些反混淆方法。

声明: 感谢所有相关研究者对研究内容的公开发布。本 repo 中所有资源来自互联网,版权属于原作者。(个别PDF、PPT为仅为方便下载,上传到本repo中)。

工具篇

FKVMP

FKVMP 是比较古老的一款 Ollydbg 插件,但在当时非常有名。

使用方法简单,在虚拟机入口处(push/call 或 jmp)右键 FKVMP -> start 即可。

下图是对如下代码

mov ebx, 0deadbeefh
mov eax, 0beefdeadh

使用 VMProtect 1.60 保护后, 使用 FKVMP 分析的结果(结果打印在 OD 的日志窗口中)。

img

可以所有Handler已经为指令都已经识别出来,初始化压栈的寄存器顺序也会打印出来。

本工具(可能是第1次完成)字节码的还原的实现(其实可以认为是虚拟机指令的反汇编)使对 VMProtect 的人工分析成为可能。

缺点是只支持单一的基本块,每次分析到 SetEIP 指令(实际就是跳转指令)就会停止,需要人工操作,去分析下一基本块。

VMP分析插件

可以认为是 FKVMP 的超级加强版,在同类工具之中功能最为强度的工具。

首先该工具支持了跨基本块的分析,可以一次性将全部虚拟机字节码提取出来。除此外,还有许多亮点功能:

下图是工具使用截图。该工具以插件的形式,实现了一个与原生OD非常相似的VMP调试界面,寄存器、栈的内容可以实时查看。

img

使用方法简单,在虚拟机入口处(push/call 或 jmp)右键 VMP分析插件 -> 分析虚拟程序 完成分析。然后可以打开插件的虚拟指令窗口、调试窗口查看字节码并进行调试分析。

VMSweeper

可以完成 VMP 保护代码还原的工具。 完全的代码还原是十分困难的,因此该工具稳定性不高,经常出现异常。但是某些简单样本的测试,确实有不错的还原效果。

使用方法:

  1. 使用纯净版 OD 加载插件,避免插件间冲突。
  2. Plugins -> VMPSweeper -> Analyze all VM reference
  3. 弹出窗口选要分析的 VM, 右键 Decode VM。
  4. 此时会自动在虚拟机入口点断下,F1 快捷键,VMSweeper会开始进行分析。
  5. 分析完成后,会弹出提示框重新运行进程。重新运行后, Plugins -> VMPSweeper -> Continue decode VM。继续分析。
  6. 如果分析没有产生任何异常,VMPSweeper 会把还原后的代码 Patch 到原本的虚拟机入口处。
  7. 但上述过程经常出错,可以在 OD 根目录下查找 VMS_xxx 文件夹,查看日志文件,*.log 文件中保存着还原的过程输出。

如下是log文件截取。

...

++++++++++++++++++++++++++++++++++++
  Section a12 final
++++++++++++++++++++++++++++++++++++

004100BC: push ebp
004100C2: rvm_38 = esp
004100C9: push esi
004100D5: push edi
004100F6: [rvm_38 + 0xFFFFFFFC] = 0
00410111: eax = [rvm_38 + 0xFFFFFFFC]
00410131: rvm_34 = [rvm_38 + 8]
00410167: eax = [eax * 4 + rvm_34]
00410186: rvm_10 = [rvm_38 + 0xFFFFFFFC]
004101A6: edi = [rvm_38 + 8]
004101EC: rvm_08 = [rvm_10 * 4 + edi + 4 + eax]
0041021C: eax = [rvm_38 + 0xFFFFFFFC]
0041023C: rvm_10 = [rvm_38 + 0x0000000C]
00410278: [eax * 4 + rvm_10] = rvm_08
00410292: rvm_34 = [rvm_38 + 0xFFFFFFFC]
0041029C: eax = rvm_34 + 1
004102D4: [rvm_38 + 0xFFFFFFFC] = eax
004102EF: edx = [rvm_38 + 0xFFFFFFFC]
0041030F: eax = [rvm_38 + 8]
0041032F: rvm_18 = [rvm_38 + 0xFFFFFFFC]
0041034F: eax = [rvm_38 + 8]
00410385: rvm_3C = [edx * 4 + eax]
00410466: edi = and ~and ~rvm_3C, [rvm_18 * 4 + rvm_24 + ~4], ~and rvm_3C, [rvm_18 * 4 + rvm_24 + 4]

...

这是还原出来的 x86 代码。其中 rvm 是寄存器未推断出结果导致的。完美还原的代码会形成 完整的 x86 指令。

该工具是少见的可以将 VMProtect 保护代码进行完整还原的工具,缺点是稳定性太差,对于稍复杂的程序,还原过程很大可能会出现异常报错。

根据工具的说明,似乎是应该支持 Code Virtualizer的。测试还原 Code Virtualizer 1.3.8 版本未成功。

Oreans UnVirtualizer

可以支持 Oreans 系列保护工具早期版本的 x86 还原。但对新版本的 FISH/TIGER 等系列虚拟机效果不佳。

使用:在虚拟机入口,右键分析,如果还原成功会弹出还原代码的文本文件。

如下是对 Code Virtualizer v1.3.8 代码还原的结果示意。 如果还原成功则与原代码基本一致(对CISC体系效果较好)。

...

@Label_00409223
	00409252	MOV DWORD PTR [EBP+0xfffffffc],0x0
	00409263	MOV EAX,DWORD PTR [EBP+0xfffffffc]
	00409281	MOV DWORD PTR [EBP+0xfffffff8],EAX
	00409291	JMP 0x4c


@Label_00409297
	00409297	MOV ECX,DWORD PTR [EBP+0xfffffff8]
	004092AC	ADD ECX,0x1
	004092C3	MOV DWORD PTR [EBP+0xfffffff8],ECX


@Label_004092E2
	004092E2	MOV EDX,DWORD PTR [EBP+0xfffffff8]
	004092F2	CMP EDX,DWORD PTR [EBP+0xc]
	0040930A	JNB 0x7b2
	0040930F	MOV EAX,DWORD PTR [EBP+0xfffffff8]

...

VMAttack

从官方 demo 上看,应该只支持去混淆的 VMProtect demo 版。

2016 IDA插件大赛第2名

相关论文:Kalysch A, Götzfried J, Müller T. VMAttack: Deobfuscating Virtualization-Based Packed Binaries[C]// The, International Conference. 2017:1-10.

VirtualDeobfuscator

2013 年 Blackhat视频: https://www.youtube.com/watch?v=hoda99l5y_g

其他

VMP 1.7 完整还原 http://bbs.pediy.com/thread-155215.htm

VMP Handler 分析插件 https://github.com/OoWoodOne/VMP_ODPlugin

Zeus--VMProtect分析及自动脱壳插件 by ximo http://www.52pojie.cn/thread-129047-1-1.html

VMP调试器 https://github.com/uvbs/VMPDBG2

CV 反编译 https://github.com/pakt/decv

Code Deobfuscator https://forum.tuts4you.com/topic/37952-code-deobfuscator/ https://github.com/Pigrecos/CodeDeobfuscator

文章篇

会议PPT

学术文章

其他