标题:【原创】用Oreans UnVirtualizer还原VM代码实验
作者:sungy
时间:2014-09-18

对VM一直很头痛,在逆向实践一般尽量想办法避开它,当黑盒来处理。有时候不面对她又不行,正好在论坛上看了Oreans UnVirtualizer插件,拿来实践学习下。新手可以了解下恢复VM代码的过程,高手可以帮助纠正错误并指导深入

相关工具可在看雪及网上找到:
Oreans UnVirtualizer   VM恢复插件
Code Virtualizer v1.3.8  加密工具
OD  调试工具

加密目标程序源码选择Code Virtualizer v1.3.8中自带的例子
路径:\Examples\C\VC\32-bit\Via API
编译环境 VC6.0

先观察下源码中准备加密的部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//////////////////////////////////////////////////////////////////////////////////////////////////////
if (LOWORD(wParam) == IDC_BUTTON_ENCODE1)
        {
  
            // the following code, inside the VIRTUALIZER macro, will be converted
            // into virtual opcodes
       
            VIRTUALIZER_START  //VM开始标志宏
 
            for (int i = 0; i < 10; i++)
            {
                value += value * i;
            }
 
            MessageBox(NULL, "This is the Virtualizer macro #1", "Virtualizer Macro", MB_OK + MB_ICONINFORMATION);
 
            VIRTUALIZER_END  //VM结束标志宏
 
        }
        else if (LOWORD(wParam) == IDC_BUTTON_ENCODE2)
        {
  
            // the following code, inside the VIRTUALIZER macro, will be converted
            // into virtual opcodes
       
            VIRTUALIZER_MUTATE2_START  //VM开始2
 
            for (int i = 0; i < 10; i++)
            {
                value += value * i * 3;
            }
 
            MessageBox(NULL, "This is the Virtualizer with mutation level 2", "Virtualizer Macro", MB_OK + MB_ICONINFORMATION);
 
            VIRTUALIZER_END //VM结束2
 
        }
 
///////////////////////////////////////////////////////////////////////////////////////////////////////

用Code Virtualizer 载入编译链接后生成的目标程序:vc_example.exe

保护选项就默认吧:

代码虚拟选项:

点击相应的加密块,下面的汇编代码窗口出现对应的汇编代码,这个也可以在OD中得到验证

点Protect按钮实施保护,生成VM过的程序,我们叫vmtest.exe吧

现在用OD载入VM过的程序vmtest.exe,Ctrl+G 来到0040111C ,看到了吗,被VM蹂躏的实景如此! 到00401167时结束,又变成能看懂的汇编代码了

同理可以观察另一代VM过的代码:0040117F - 004011CD

好,现在来看看怎么用Oreans UnVirtualizer 1.8插件(OreansUnVirtualizer.dll)来恢复吧

解压插件后放到od-plug目录,用OD载入vmtest.exe,Ctrl+G 来到0040111C,此行右击鼠标选择Oreans UnVirtualizer - Find References,

填写vm开始地址和大小,大小可以放大些,如果不清楚的话。

出现下面的窗口,最小化它

在0040111C右键选择下面

确定后出现一个记事本,里面是已经还原了的VM汇编代码

对照VM加密前的汇编代码发现基本一致。

到此终于对VM代码还原有一个初步的接触,这个插件我也是刚玩,细节的东西还不了解,请高手回复指导,指正错误,推荐其它好用的VM修复插件及使用方法,谢谢。交流南鹅:659076544

jpg改 rar 

[原创]用Oreans UnVirtualizer还原VM代码的更多相关文章

  1. 《zw版·Halcon-delphi系列原创教程》 只有2行代码的超市收款单ocr脚本

    <zw版·Halcon-delphi系列原创教程> 只有2行代码的超市收款单ocr脚本只有2行代码的超市收款单ocr脚本 发了这么多教程,有网友问,为什么没有ocr的.      的确,在 ...

  2. pyinstaller 还原python代码的方法

    pyinstaller 的作用就是将python打包成对应平台的可执行文件.一般这种可执行文件的体积都比较大. 我们可以先通过逆向软件查看一下具体信息 查看字符串信息 只要有诸如以上的字符串 就说明这 ...

  3. SqlServer 还原数据库 代码实现

    RESTORE DATABASE TargetDB FROM DISK = 'D:\DataBase\DB.bak' with replace, MOVE 'DB' TO 'D:\DataBase\T ...

  4. 【原创】够强!一行代码就修复了我提的Dubbo的Bug。

    这是 why 技术的第 28 篇原创文章 之前在<Dubbo 一致性哈希负载均衡的源码和 Bug,了解一下?>中写到了我发现了一个 Dubbo 一致性哈希负载均衡算法的 Bug. 对于解决 ...

  5. [原创]Android Lollipop (5.0) 原生代码 Settings 首页加载逻辑分析

    主入口为com.android.settings.Settings. 这只是一个wrapper的类, 它继承于 SettingsActivity类,并且声明了一堆公有的继承于SettingsActiv ...

  6. 数据库备份与还原SQL代码

    --备份数据库 --必须先创建Backup文件夹 ) SET @name = 'D:\Backup\DingHanECard_V2_ZQGDJ_' ), ) + '.bak' BACKUP DATAB ...

  7. 使用VBA进行JS加密的反混淆,还原JS代码。

    本文地址:http://www.cnblogs.com/Charltsing/p/JSEval.html 联系QQ:564955427 类似下面的代码是登陆 全国企业信用信息公示系统(安徽)(网址:h ...

  8. 怎么处理Win7系统备份还原提示代码0x80042302的错误?

    我们都知道Win7系统自带备份还原功能,可以在电脑遇到小问题时通过还原至之前备份的正常系统来解决,非常的方便.但是有些用户在使用备份还原功能时,系统会提示0x80042302错误,这该怎么办呢?下面好 ...

  9. 【原创】微信最新表情js代码

    最近在做仿微信聊天表情发送功能,所以需要展示常用的105个表情. 因为对接微信公众号的时候,用户聊天过程中发送的表情,微信服务器会转成对应的代码传给我们的服务器,类似如下: :/::)/::~/::B ...

随机推荐

  1. am335x USB 驱动框架记录

    参考: http://processors.wiki.ti.com/index.php/AM335x_USB_Driver%27s_Guide http://processors.wiki.ti.co ...

  2. JavaScrip——DOM操作(查找HTML元素/修改元素)

    innerHTML 1.查找元素——document.getElementById("intro") 2.输出查找的结果: (1)var a=document.getElement ...

  3. jquery javascript 回到顶部功能

    今天搞了一个回到顶部的JS JQ功能 (function($){ $.fn.survey=function(options){ var defaults={width:"298", ...

  4. Python 字符串语法,for

    #-*- coding:utf-8 -*- #字符串的拼接方式一 a = "hello" b = "world" c = a + " " + ...

  5. C++ 类的隐式转换

    所谓类的隐式转换,就是将实参类型转成形参类型--如果不一致的话. 这个转换与基本类型转换不太一样,具体则是在形参类型的构造函数中使用实参类型的数据,从而构造出一个临时对象. 下面的代码,类Person ...

  6. MySql csv文件导入导出

    一.导出到csv(本地导出) 通过mysql客户端shell连接到服务器,选择使用的数据库,输入sql代码: select * from test_info into outfile '/tmp/te ...

  7. [转载]php设计模式之单例、多例设计模式

    单例(Singleton)模式和不常见的多例(Multiton)模式控制着应用程序中类的数量.如模式名称,单例只能实例化一次,只有一个对象,多例模式可以多次实例化. 基于Singleton的特性,我们 ...

  8. 初涉RxAndroid结合Glide实现多图片载入操作

    转载请注明出处:王亟亟的大牛之路 本来周末就想发了然后各种拖拉就没有然后了,那么就今天早上写吧,废话不多開始正题 什么是RxJava或者RxAndroid我就不多废话了,理论知识一大堆人给我们做好了. ...

  9. Climbing Stairs爬楼梯——动态规划

    题目描写叙述: 初阶:有n层的台阶,一開始你站在第0层,每次能够爬两层或者一层. 请问爬到第n层有多少种不同的方法? 进阶:假设每次能够爬两层.和倒退一层,同一个位置不能反复走,请问爬到第n层有多少种 ...

  10. Javascript农历与公历相互转换

    /**用法 * Lunar.toSolar(2016, 6, 3); 农历转化公历 * Lunar.toLunar(2016, 7, 6); 公历转化农历 */ var Lunar = { MIN_Y ...