首页
社区
课程
招聘
[原创]关于VMP调试插件原理的思考
发表于: 2012-4-7 15:06 12992

[原创]关于VMP调试插件原理的思考

2012-4-7 15:06
12992

以超级大牛hkfans“vmp2.06全过程分析”一文中的NOTEPAD.vmp.exe作为例子,
讲一下我的理解,错误之处请牛人指正!
  1、如何实现retrieve handler info?
    我觉得主要是找到一张虚拟机指令地址入口表,类似于这样:

81 12 FA FE 43 2C FA FE 92 08 FA FE 69 08 FA FE
E1 1C FA FE 76 03 FA FE BB 25 FA FE 31 00 FA FE
E7 17 FA FE 05 08 FA FE 29 11 FA FE 77 1D FA FE
6E 19 FA FE B7 18 FA FE 5A 2C FA FE 75 2C FA FE
FB 19 FA FE 3E 2C FA FE EC 2C FA FE 8F 2B FA FE
FA 2D FA FE 32 24 FA FE 6C 28 FA FE 1F 1E FA FE
AB 06 FA FE E0 08 FA FE 86 1C FA FE EC 26 FA FE
56 2B FA FE 34 0E FA FE 90 06 FA FE C2 17 FA FE
3A 1B FA FE BB 11 FA FE 76 28 FA FE D1 1D FA FE
CA 1C FA FE 90 26 FA FE 7D 04 FA FE 96 11 FA FE
5C 1D FA FE 55 0F FA FE E0 28 FA FE D7 11 FA FE
10 2A FA FE 70 2D FA FE 03 1F FA FE 76 20 FA FE
2C 16 FA FE DF 03 FA FE 77 07 FA FE A4 23 FA FE
23 2A FA FE E7 06 FA FE 14 16 FA FE AD 0F FA FE

   简单解释一下,例如81 12 FA FE就是0xFEFA1281,只要neg 一下,就变成了0x0105ED7F,到地址0x0105ED7F处看看,有一堆垃圾指令,这里直接给出里面的两条有效指令:
//edi是虚拟寄存器的基地址 eax定位其中的哪一个寄存器,这里是取出某个虚拟寄存器的值
0105FF84    8B1438          mov     edx, dword ptr [eax+edi]
//ebp是VESP,再把这个值压入虚拟栈
01060000    8955 00         mov     dword ptr [ebp], edx  
这条虚拟机指令前人起名叫做 vm_pushdw_regdw
为什么要neg 一下?直接上代码

0105E4AF    8B1485 0EF20501 mov     edx, dword ptr [eax*4+105F20E] //105F20E 表地址
0105E4B6    F9              stc
0105E4B7    F7DA            neg     edx  //看到了吗
0105E4B9    F9              stc
0105E4BA    F5              cmc
0105E4BB    81C2 00000000   add     edx, 0  //等于没加
0105E4C1  ^ E9 33FBFFFF     jmp     0105DFF9

    内存中的一张表0x400字节,去除里面重复的,实际就是前面给出的那张表:
0105F20E  81 12 FA FE 43 2C FA FE 92 08 FA FE 92 08 FA FE  ?C,??
0105F21E  69 08 FA FE E1 1C FA FE 76 03 FA FE BB 25 FA FE  i?v?
0105F22E  31 00 FA FE E1 1C FA FE E7 17 FA FE E7 17 FA FE  1.???
0105F23E  05 08 FA FE 29 11 FA FE 77 1D FA FE 6E 19 FA FE  )wn
0105F24E  B7 18 FA FE 31 00 FA FE 5A 2C FA FE 69 08 FA FE  ?1.Z,i
0105F25E  75 2C FA FE FB 19 FA FE 77 1D FA FE 3E 2C FA FE  u,?w>,
0105F26E  EC 2C FA FE 8F 2B FA FE 3E 2C FA FE FA 2D FA FE  ??>,?
0105F27E  05 08 FA FE 32 24 FA FE 6C 28 FA FE 76 03 FA FE  2$l(v
0105F28E  1F 1E FA FE BB 25 FA FE AB 06 FA FE E0 08 FA FE  ???
0105F29E  69 08 FA FE 86 1C FA FE 6E 19 FA FE 8F 2B FA FE  i?n?
0105F2AE  BB 25 FA FE E7 17 FA FE EC 26 FA FE E0 08 FA FE  ????
0105F2BE  56 2B FA FE EC 26 FA FE 34 0E FA FE 76 03 FA FE  V+?4v
0105F2CE  86 1C FA FE 90 06 FA FE 76 03 FA FE 34 0E FA FE  ??v4
0105F2DE  C2 17 FA FE E1 1C FA FE 76 03 FA FE 86 1C FA FE  ??v?
0105F2EE  34 0E FA FE 5A 2C FA FE FB 19 FA FE 3A 1B FA FE  4Z,?:
0105F2FE  31 00 FA FE BB 11 FA FE 05 08 FA FE 76 03 FA FE  1.?v
0105F30E  76 28 FA FE D1 1D FA FE C2 17 FA FE AB 06 FA FE  v(???
0105F31E  CA 1C FA FE 90 26 FA FE 7D 04 FA FE 96 11 FA FE  ??}?
0105F32E  E0 08 FA FE 3E 2C FA FE 5C 1D FA FE 90 06 FA FE  ?>,\?
0105F33E  3A 1B FA FE 55 0F FA FE 5A 2C FA FE AB 06 FA FE  :UZ,?
0105F34E  29 11 FA FE 76 28 FA FE E1 1C FA FE EC 26 FA FE  )v(??
0105F35E  32 24 FA FE 8F 2B FA FE E0 28 FA FE D7 11 FA FE  2$???
0105F36E  FA 2D FA FE CA 1C FA FE 34 0E FA FE 10 2A FA FE  ??4*
0105F37E  70 2D FA FE 03 1F FA FE C2 17 FA FE B7 18 FA FE  p-??
0105F38E  76 20 FA FE 5C 1D FA FE 2C 16 FA FE BB 11 FA FE  v \,?
0105F39E  34 0E FA FE DF 03 FA FE C2 17 FA FE 8F 2B FA FE  4???
0105F3AE  5C 1D FA FE 5A 2C FA FE E1 1C FA FE 77 1D FA FE  \Z,?w
0105F3BE  77 07 FA FE 76 20 FA FE 90 06 FA FE FB 19 FA FE  wv ??
0105F3CE  56 2B FA FE 55 0F FA FE EC 2C FA FE 96 11 FA FE  V+U??
0105F3DE  76 03 FA FE 76 03 FA FE 5A 2C FA FE 03 1F FA FE  vvZ,
0105F3EE  55 0F FA FE 31 00 FA FE FB 19 FA FE B7 18 FA FE  U1.??
0105F3FE  3E 2C FA FE 92 08 FA FE 34 0E FA FE A4 23 FA FE  >,?4?
0105F40E  86 1C FA FE AB 06 FA FE 3A 1B FA FE 3A 1B FA FE  ??::
0105F41E  E7 17 FA FE BB 11 FA FE E0 28 FA FE 23 2A FA FE  ???#*
0105F42E  1F 1E FA FE 31 00 FA FE 90 26 FA FE 5A 2C FA FE  1.?Z,
0105F43E  BB 25 FA FE 56 2B FA FE 10 2A FA FE 3A 1B FA FE  ?V+*:
0105F44E  E1 1C FA FE E0 08 FA FE 6C 28 FA FE 3E 2C FA FE  ??l(>,
0105F45E  FA 2D FA FE E7 06 FA FE 70 2D FA FE 03 1F FA FE  ??p-
0105F46E  90 06 FA FE 96 11 FA FE 6E 19 FA FE 75 2C FA FE  ??nu,
0105F47E  32 24 FA FE A4 23 FA FE BB 11 FA FE 6E 19 FA FE  2$??n
0105F48E  92 08 FA FE 6E 19 FA FE 7D 04 FA FE E7 17 FA FE  ?n}?
0105F49E  D1 1D FA FE 14 16 FA FE 10 2A FA FE 70 2D FA FE  ?*p-
0105F4AE  31 00 FA FE 3A 1B FA FE 2C 16 FA FE 32 24 FA FE  1.:,2$
0105F4BE  14 16 FA FE B7 18 FA FE 77 07 FA FE FB 19 FA FE  ?w?
0105F4CE  EC 26 FA FE 23 2A FA FE C2 17 FA FE E1 1C FA FE  ?#*??
0105F4DE  05 08 FA FE 70 2D FA FE 32 24 FA FE E7 17 FA FE  p-2$?
0105F4EE  D7 11 FA FE D1 1D FA FE BB 25 FA FE 76 03 FA FE  ???v
0105F4FE  BB 11 FA FE BB 11 FA FE 14 16 FA FE E7 06 FA FE  ???
0105F50E  31 00 FA FE 3E 2C FA FE 86 1C FA FE 90 06 FA FE  1.>,??
0105F51E  81 12 FA FE 43 2C FA FE 86 1C FA FE 05 08 FA FE  ?C,?
0105F52E  81 12 FA FE 43 2C FA FE BB 11 FA FE 5C 1D FA FE  ?C,?\
0105F53E  81 12 FA FE 43 2C FA FE 69 08 FA FE 70 2D FA FE  ?C,ip-
0105F54E  81 12 FA FE 43 2C FA FE 92 08 FA FE 5A 2C FA FE  ?C,?Z,
0105F55E  81 12 FA FE 43 2C FA FE E1 1C FA FE AB 06 FA FE  ?C,??
0105F56E  81 12 FA FE 43 2C FA FE EC 2C FA FE 86 1C FA FE  ?C,??
0105F57E  81 12 FA FE 43 2C FA FE A4 23 FA FE 3E 2C FA FE  ?C,?>,
0105F58E  81 12 FA FE 43 2C FA FE 7D 04 FA FE 75 2C FA FE  ?C,}u,
0105F59E  81 12 FA FE 43 2C FA FE A4 23 FA FE E0 28 FA FE  ?C,??
0105F5AE  81 12 FA FE 43 2C FA FE 55 0F FA FE AB 06 FA FE  ?C,U?
0105F5BE  81 12 FA FE 43 2C FA FE 14 16 FA FE 31 00 FA FE  ?C,1.
0105F5CE  81 12 FA FE 43 2C FA FE 6C 28 FA FE 92 08 FA FE  ?C,l(?
0105F5DE  81 12 FA FE 43 2C FA FE 8F 2B FA FE 90 26 FA FE  ?C,??
0105F5EE  81 12 FA FE 43 2C FA FE EC 26 FA FE AD 0F FA FE  ?C,??
0105F5FE  81 12 FA FE 43 2C FA FE FB 19 FA FE C2 17 FA FE  ?C,??

   至于这张表为什么要有重复的入口地址,我认为可以让不同的虚拟字节码实现同样的功能,
一条实际的指令对应多个字节码,增加了字节码的多样性,目的就是让你的头更大!还有个原因就是凑字数吧,以前写作文不就是这样干的吗?

   归根到底有多少虚拟指令,只要去掉重复的就可以了,化简后的上面那张表就只有56条。

   你要问我怎么找到这个表地址的,答案很简单。在OEP处一直F7就OK了,顶多1分钟吧!
如果你人又懒,水平又高,可以用下面个函数,写个OD插件:
OllyDbg._Readcommand
OllyDbg._Disasm
    从OEP处读一条指令,反汇编一条,周而复始,找到下面这个地方就可以停下来了。先提取出表地址,再从0x400字节中提取出不重复的地址。

0105E4AF    8B1485 0EF20501 mov     edx, dword ptr [eax*4+105F20E] //105F20E 表地址
0105E4B6    F9              stc
0105E4B7    F7DA            neg     edx  
0105E4B9    F9              stc
0105E4BA    F5              cmc
0105E4BB    81C2 00000000   add     edx, 0   
0105E4C1  ^ E9 33FBFFFF     jmp     0105DFF9

    有了这张表,你就可以做一张指令查找表了。前面举例已经讲了第一条,再讲简化表的最后一条,让你彻底搞懂。
AD 0F FA FE 对应0xFEFA0FAD,NEG一下就是0x0105F053,到那里提取出有效指令如下:
0105FA9B    8B45 00         mov     eax, dword ptr [ebp]
0105E706    8B00            mov     eax, dword ptr [eax]
0106013B    8945 00         mov     dword ptr [ebp], eax
    前人取了名字VM_READdw_MEMdw,感觉还要适应!依次类推,做个虚拟指令查找表。

2、如何反汇编虚拟机字节码?

    假如VEIP(esi=010375AC),也就是指向下面7个字节的尾部字节,这个记事本例子中esi是逐渐变小的。

//B1就是010375AC处的虚拟机字节码                  
010375A6  9C A3 36 12 DB B0 B1   

  超级大牛hkfans的VMP插件可以从该处反汇编得到:
010375AC    C9                        pop       r14
010375AB    58 C0C49CBB       push      BB9CC4C0         
010375A6    40                         add       dword   
    它是怎么来的?

   我们从OD中可以提取到以下有效指令,显示了从B1变为C9的全过程,上一条虚拟指令地址参与了计算。
0105E1B4    30D8            xor     al, bl //al=B1  ebx=010375AD (上一条虚拟指令地址)
0105DA77    FEC8            dec     al     // al=1c-1=1b
0105DD64    D0C0            rol     al, 1  //al=36
0105DD6E    F6D0            not     al     //al=c9
0105E49C    0FB6C0          movzx   eax, al  //eax=000000C9

现在得到:010375AC    C9   
根据计算公式求出虚拟指令入口地址如下:
0105E4AF    8B1485 0EF20501 mov     edx, dword ptr [eax*4+105F20E] //105F20E 表地址
0105E4B7    F7DA            neg     edx  
虚拟指令入口地址edx=neg([c9*4+105F20E]) =neg(FEFA2C43)=0x0105D3BD
有了这个入口地址,再查一下事先做好的指令表就可以得到虚拟机的汇编指令了。

   这里我们到0105D3BD处提取出有效指令如下:
0105DC99    F6D8            neg     al  //neg(c9)=37
0105DC9D    FEC0            inc     al  //al=38
0105DCA8    24 3C           and     al, 3C  //al=38
0105DCB3    8B55 00         mov     edx, dword ptr [ebp] //虚拟机退栈
01060092    83C5 04         add     ebp, 4
01060096    891438          mov     dword ptr [eax+edi], edx //al=38  保存到虚拟机的寄存器r14中

这里al=0x38  0x38/4=0xe 即保存到r14中,注意r0是第一个虚拟寄存器。
显然我们可以用pop r14来表示上面的操作。
这样反汇编010375AC处的字节码可以得到:
010375AC    C9     pop       r14

    周而复始,依次类推,反汇编的原理我就只能猜出这么多了,如果你是编程高手,应该可以知道怎么做VMP调试插件了吧?

   至于单步,F4等功能,我想可能在异常处理循环中,判断esi的值,根据断点地址(想要断下时的esi值),可以在那个地方下个内存断点,当虚拟机访问那里取字节码时就可以断下。以上是我的一点看法,好久没写技术贴,光知道灌水真是不好意思,如果每个人都能象超级大牛hkfans一样,拿出点值得学习的东西来,我想论坛也不会没落了(将来虚拟语气),如有错误之处,请高手指出,再次感谢hkfans大牛的美文,让我们大开眼界!有本事的拿出你的技术贴来,论坛不需要光说不练的人。

                                                            2012年4月7日
                                                              天易love


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

收藏
免费 6
支持
分享
最新回复 (23)
雪    币: 120
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
先占坑。。。。
2012-4-7 15:13
0
雪    币: 1585
活跃值: (190)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
3
我这有一好友,用的是天易以前的图像,但据他所说他不是天易,他网名很牛--全能。不解!不想灌水,但是很用心的看了看帖子,基本上看不懂!是我知识太欠缺!
2012-4-7 15:16
0
雪    币: 1489
活跃值: (1093)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
感谢天易love大牛分享。
2012-4-7 15:18
0
雪    币: 49
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
暂时 看不懂
2012-4-7 16:08
0
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
6
竟然有人剽窃我的头像,还好没有招摇撞骗,阿祢陀佛!大家都看不懂,那就是我太水了啊?坛主得出来说句公道话,开个玩笑!
2012-4-7 16:18
0
雪    币: 210
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
真的好晕,没看懂
2012-4-7 16:55
0
雪    币: 1585
活跃值: (190)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
8


不知道图像那人是谁,我还以为天易肯加我给予指教,但我问了,说不是天易!

上传的附件:
2012-4-7 17:15
0
雪    币: 88
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
受教了。。。
2012-4-7 18:02
0
雪    币: 183
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
love大牛分享了!!
2012-4-7 18:10
0
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
11
全智贤的学生照,看来得普及一下破解以外的知识了。我怎么带头灌水啊?晕了
2012-4-7 18:23
0
雪    币: 1585
活跃值: (190)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
12
我想
2012-4-7 18:42
0
雪    币: 576
活跃值: (1163)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
13
VMP解码出伪指令还只是万里长征的第一步而已,伪指令的缩减才是VMP的难点。。
2012-4-7 18:45
0
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
14
感谢大牛指点一二,当然伪指令缩减的终极目标是回复原样。需要将破解与信息学算法完美结合,这个就是拼实力了!
2012-4-7 20:30
0
雪    币: 1489
活跃值: (1093)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
15
再次找贴时,发现此贴咋在图书项目版块啊.
2012-4-7 21:56
0
雪    币: 239
活跃值: (74)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
好长时间没来看雪了,自己专业的事情忙不完,唉。前几天没事开了OD玩玩。结果好多快捷键都忘了,只好鼠标点……
2012-4-10 19:05
0
雪    币: 107
活跃值: (404)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
为了混精华,就是要敢于爆料
2012-4-10 19:31
0
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
18
想灌水的都来吧,就当发了个水贴。
2012-4-10 19:35
0
雪    币: 1015
活跃值: (235)
能力值: ( LV12,RANK:440 )
在线值:
发帖
回帖
粉丝
19
已经忘了大牛头像是多久变的了
楼主的怎么能是水贴啊,好好学习中。。
2012-4-10 20:04
0
雪    币: 1015
活跃值: (235)
能力值: ( LV12,RANK:440 )
在线值:
发帖
回帖
粉丝
20
常回家看看!
2012-4-10 20:05
0
雪    币: 130
活跃值: (71)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
好贴,支持+膜拜啊
2012-6-19 16:10
0
雪    币: 118
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
先顶再看·····
2012-6-19 18:49
0
雪    币: 89
活跃值: (171)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
支持大牛,膜拜中
2012-6-21 17:08
0
雪    币: 76
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
[QUOTE=本师;1061576]

不知道图像那人是谁,我还以为天易肯加我给予指教,但我问了,说不是天易!

[/QUOTE]

这好像是年轻时候的全智贤吧
2012-6-21 17:56
0
游客
登录 | 注册 方可回帖
返回
//