关于软件虚拟化保护(如VMProtect)的资料。
工具篇介绍了VM保护的现有分析工具,并进行了简单的试用分析。
文章篇介绍了VM保护相关的分析文章,包括对虚拟机的分析,及一些反混淆方法。
本项目发在了github上, https://github.com/lmy375/awesome-vmp
如果有其他好用的工具或者优秀的文章可以留言链接或者直接在github上提交 pull request,优秀的资源需要分享才能最大发挥其价值。
工具篇
FKVMP
FKVMP 是比较古老的一款 Ollydbg 插件,但在当时非常有名。
使用方法简单,在虚拟机入口处(push/call 或 jmp)右键 FKVMP -> start 即可。
下图是对如下代码
mov ebx, 0deadbeefh
mov eax, 0beefdeadh
使用 VMProtect 1.60 保护后, 使用 FKVMP 分析的结果(结果打印在 OD 的日志窗口中)。
可以所有Handler已经为指令都已经识别出来,初始化压栈的寄存器顺序也会打印出来。
本工具(可能是第1次完成)字节码的还原的实现(其实可以认为是虚拟机指令的反汇编)使对 VMProtect 的人工分析成为可能。
缺点是只支持单一的基本块,每次分析到 SetEIP 指令(实际就是跳转指令)就会停止,需要人工操作,去分析下一基本块。
VMP分析插件
可以认为是 FKVMP 的超级加强版,在同类工具之中功能最为强大的工具。
首先该工具支持了跨基本块的分析,可以一次性将全部虚拟机字节码提取出来。除此外,还有许多亮点功能:
下图是工具使用截图。该工具以插件的形式,实现了一个与原生OD非常相似的VMP调试界面,寄存器、栈的内容可以实时查看。
使用方法简单,在虚拟机入口处(push/call 或 jmp)右键 VMP分析插件 -> 分析虚拟程序 完成分析。然后可以打开插件的虚拟指令窗口、调试窗口查看字节码并进行调试分析。
VMSweeper
可以完成 VMP 保护代码还原的工具。 完全的代码还原是十分困难的,因此该工具稳定性不高,经常出现异常。但是某些简单样本的测试,确实有不错的还原效果。
使用方法:
[ol]
[/ol]
如下是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
KCon 2016 - VMProtect 的一次奇妙之旅 by 何潇潇
SecurityDay 2015 - Inside VMProtect by Samuel Chevet
CSAW 2016 - How Triton can help to reverse virtual machine based
software protections by Jonathan Salwan
BlackHat 2013 - Removing virtualization obfuscations from malware – a DARPA Cyber Fast Track funded effort by Raber
中国软件安全峰会 2009 - VMProtect的逆向分析和静态还原 by Bughoho
CARO 2008 - Dealing with Virtualization packer by Boris Lau
学术文章
其他
2018年 FinSpy VM 分析及代码还原系列 by Rolf Rolles(该作者有十年以上的VM保护的研究经验,非常值得一读)
A WALK-THROUGH TUTORIAL, WITH CODE, ON STATICALLY UNPACKING THE FINSPY VM: PART ONE, X86 DEOBFUSCATION
FINSPY VM PART 2: VM ANALYSIS AND BYTECODE DISASSEMBLY
FINSPY VM UNPACKING TUTORIAL PART 3: DEVIRTUALIZATION
FinFisher VM分析 白皮书
ZeusVM analysis - Miasm's blog
汇集所有能帮助你对抗强壳的知识(VMP、SE、THEMIDA、Enigma)
VMProtect 2.06全过程分析 by hkfans
Themida 1.2.0.1 全过程分析 by hkfans
Themida 1.9.1.x CICS Processor VM 简单分析 by softworm
人肉某CM-VMP2.13.8 Vmcode (可视化) by Sound
VMProtect 逆向分析 by aalss2
VMSweeper 分析 by aalss2
VMProtect 学习 by OoWoodOne
Inside Code Virtualizer by scherzo February 16 2007