首页
社区
课程
招聘
Code Virtualizer虚拟机代码还原
发表于: 2013-3-9 22:48 13511

Code Virtualizer虚拟机代码还原

2013-3-9 22:48
13511

本文所讨论的对象为Code Virtualizer,所描述的方法应该也适用于其它虚拟机,使用的软件为IDA 5.5+IDAPython。
  
  一.Handler还原
    用PyEmu虚拟执行,得到Handler解密算法,定义还原脚本模板,再根据解密算法可以生成基本的还原Python脚本,附件的文件已实现该过程,由于是根据以前的老版本的dump_wmimmc.sys的解码脚本改写而成,未进行完整测试,有可能有Bug,附件的测试文件有5个虚拟机,已有一个虚拟机的还原脚本,其它的自行测试。
  
  二.Handler识别
   现阶段是根据解码的Handler按需进行助记符手动标记,下面是Handler识别的另一种想法,不一定可行,想法不是太清楚:
  
  1.语义表达式
   表达式Expr有这些操作:ExprAssign,ExprId,ExprImm,ExprCond,ExprMem,ExprOp,ExprSlice,ExprCompose,ExprOpt等说不清楚操作,举例说明(python语法):
  
  a=ExprId('eax',32)
  b=ExprId('ecx,32)
  #输出eax,ecx
  print a,b
  #输出(eax+ecx)
  c=ExprOp('+',a,b)
  print c
  #输出(eax+ecx)
  d=a+b
  print d
  #输出eax[0:16]
  ax=a[:16]
  print ax
  #输出dword ptr [eax+ecx]
  d=ExprMem(c,32)
  print d
  #输出 d=(c+b)
  a=ExprId('a',32)
  b=ExprId('b',32)
  c=a+b
  print ExprAssign(d,c)
  #输出((y-0x1)+0x2)
  x=(y-ExprImm(uint32(1)))+ExprImm(uint32(2))
  print x
  #输出(y+0x1)
  print ExprOpt(x)
  
  最有用的操作是ExprOpt,用于指令压缩,主要优化是constant fold(常量折叠),ExprSlice主要用于分部寄存器,如标志位,16位寄存器等,ExprCompose用于表达式结合,ExprCond是汇编中jcc的语义转化.
  
  2.虚拟机
  该虚拟机是基于语义的,对汇编语言进行语义转化,然后虚拟执行。
假设虚拟机执行前的虚拟机环境为:
     esp:init_esp
     ebp:init_ebp
     eax:init_eax
     ebx:init_ebx
     ecx:init_ecx
     edx:init_edx
     esi:init_esi
     edi:init_edi
     zf:0
        .
        .
        .
  在该虚拟机执行的语句为add eax,ebx 则执行完后的虚拟机环境应该为:
     esp:init_esp
     ebp:init_ebp
     eax:init_eax+init_ebx
     ebx:init_ebx
     ecx:init_ecx
     edx:init_edx
     esi:init_esi
     edi:init_edi
     zf:(init_eax+init_ebx)==0
        .
        .
        .
  不论是X86代码,还是伪代码,进行语义转化后,虚拟机对指令压缩应该非常有效,并且实现各种Hook:寄存器读写Hook,堆栈读写Hook,内存读写Hook,汇编语句Hook,eip Hook等等,分析各个Hook生成的log,可以大概知道在虚拟机中的指令流程,实际上第一步的Handler解密完全可以用该虚拟机实现。
  
  3.助记符标记
  先刨去Handler解密算法,第一步可以实现,预先收集各Handler在该虚拟机执行完毕后的环境,已标记好各个Handler,虚拟执行Handler,用Levenshtein Distance算法比较其相似度,相似度高的就可以进行标记,如需要还要进行模式匹配。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 6
支持
分享
最新回复 (15)
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
2
所有的虚拟机的原理都是类似的,只是哪个虚拟机有更多恶心的冗余而已~~
说白了就是把本来的1+2=3改写成1*1+1*1*(0.5+0.5)+2*(1/2) = 3(实际上通过运算迭代任意变态的冗余长度都可以实现...)
2013-3-9 23:12
0
雪    币: 838
活跃值: (2817)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
3
顶一下,学习
2013-3-12 17:01
0
雪    币: 107
活跃值: (404)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
看来没钱途了嘛...嘿嘿.........
2013-3-12 17:46
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
很好,来看看,支持一下
2013-3-12 18:29
0
雪    币: 596
活跃值: (449)
能力值: ( LV12,RANK:320 )
在线值:
发帖
回帖
粉丝
6
只有想不到的, 没有蛇叔不知道的
2013-3-12 20:00
0
雪    币: 102
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼主强人啊!
请教下楼主,Python好学吗?(我有C/C++基础)
2013-3-12 21:07
0
雪    币: 143
活跃值: (263)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
8
嗯,有时间拿来参考一下
2013-3-13 07:52
0
雪    币: 627
活跃值: (663)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
9
支持一下!给几个链接,希望有用。

1. Scherzo的经典:Inside Code Virtualizer 1.0.1.0
2. Fighting Oreans' VM (code virtualizer flavour)
3. DeCV — a decompiler for Code Virtualizer by Oreans - GDTR

2和3似为同一作者。3为最近的进展,比较成熟,也基于IDA+Python。
2013-3-13 09:09
0
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
真心不错。。
2013-3-13 10:27
0
雪    币: 6541
活跃值: (4506)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
11
唉!  看不懂
2013-3-13 21:11
0
雪    币: 576
活跃值: (1163)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
12
CV的VM相对于VMP的VM还是比较好还原的 :)
2013-3-13 21:12
0
雪    币: 389
活跃值: (967)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
13
好东西  已试用
2013-3-22 10:54
0
雪    币: 228
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
mark! CV 分析还原,IDA Python
2013-3-23 10:50
0
雪    币: 41
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
唉!  看不懂
2013-3-23 13:37
0
雪    币: 346
活跃值: (129)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
16
即使知道VM的原理 要完全把它的规则搞懂 也是个体力活啊 LZ 强大
2013-4-7 20:05
0
游客
登录 | 注册 方可回帖
返回
//