首页
社区
课程
招聘
我也来理解虚拟机
发表于: 2008-2-29 13:23 19969

我也来理解虚拟机

2008-2-29 13:23
19969

 现在的技术更新换代真是快哦,好多壳都还没有脱成功,就出现VM了.本来还不打算接触VM的,

但是被某某鄙视不动手的懒人,所以今天就动手给他瞧瞧.不过话说回来,我确实有点懒,因为我把大部分时间都花在泡MM,游戏,跟发呆上(我经常发呆冥想自己中了大奖,有个美女跟我搭讪什么的),做今天这样的事情完全是凭心血来潮.


 


看了些讨论虚拟机的帖子,“每个虚拟机都有自己的CONTEXT”,“会在伪指令中修改EIP”


我纳闷了好久,按我目前的理解,我就知道有一个SetThreadContext可以修改CONTEXT结构,但是用OD打开VM过的程序,楞是没看到呀??



入口参数:


00401166 > $  68 514E4000   push    00404E51                        //压入PCODE首地址


0040116B   .- E9 4F3A0000   jmp     00404BBF



VM初始化:


00404BBF    9C              pushfd                                    //压入32位的EFLAGS


00404BC0    60              pushad                                   //压入eax,ecx,edx,ebx,esp,ebp,esi,edi


00404BC1    68 00000000     push    0                                //我把他看作压入一个DWORD变量


00404BC6    8B7424 28       mov     esi, dword ptr [esp+28]          //[esp+28]=00404E51            


00404BCA    BF 00404000     mov     edi, 00404000                    //edi=CONTEXT结构


00404BCF    FC              cld


00404BD0    89F3            mov     ebx, esi


00404BD2    033424          add     esi, dword ptr [esp]            



00000000(变量) |


edi            |


esi            | ⌒


ebp            | 堆


esp            | 栈


ebx            | ↓


edx            |


ecx            |


eax            |


flags          |


00404e51       |



mov     edi, 00404000


对比了一些帖子,我也敢说00404000指向CONTEXT结构,刚开始的时候我觉得这个地址就是VMP区段的开头,没什么特别的。


CTRL+G到00404000看看:


00404000    F5                cmc


00404001    808B 1C99DCE8 E2  or      byte ptr [ebx+E8DC991C], 0E2


00404008    94                xchg    eax, esp


00404009    3386 C61FD899     xor     eax, dword ptr [esi+99D81FC6]


0040400F    8136 24CFFA5B     xor     dword ptr [esi], 5BFACF24


00404015    7E 68             jle     short 0040407F


00404017    48                dec     eax


00404018    2B8C14 DDA08B9B   sub     ecx, dword ptr [esp+edx+9B8BA0DD]


0040401F    6E                outs    dx, byte ptr es:[edi]


00404020    F605 6B6A8A6E 80  test    byte ptr [6E8A6A6B], 80


00404027    3246 52           xor     al, byte ptr [esi+52]


0040402A    4D                dec     ebp


0040402B    55                push    ebp


0040402C    55                push    ebp


0040402D    1D 94803BB9       sbb     eax, B93B8094


00404032    5D                pop     ebp


00404033    F693 7570A7FE     not     byte ptr [ebx+FEA77075]


00404039    F5                cmc


0040403A    04 4E             add     al, 4E


0040403C    2130              and     dword ptr [eax], esi


0040403E    8C2459            mov     word ptr [ecx+ebx*2], fs


00404041    0F23C1            mov     dr0, ecx                          //这里看起来想一个伪指令的开始呢


00404044    E9 8C0B0000       jmp     00404BD5



那么00404000--00404041之间的就是CONTEXT结构,才41h大小呀??远远比一个完整的CONTEXT结构要小很多呢!!


现在按我的理解这个CONTEXT结构指向的是一个内存地址,不是真实的寄存器。既然是内存的一块,要么是作者定义的一个对象,要么是申请的一块内存,


这里更象前者。那这样看来,论坛里讨论虚拟机帖子里给出的那些CONTEXT结构中的EAX,EDX,EIP,EFLAGS都不是真实的寄存器,只是一个变量,一个符号而已!?



接下来我也来到了VM指令解释器:


VM指令解释器:


00404BD5    8A0E            mov     cl, byte ptr [esi]


00404BD7    00D9            add     cl, bl


00404BD9    FEC1            inc     cl


00404BDB    F6D1            not     cl


00404BDD    80E9 47         sub     cl, 47                          //对esi做一系列变换


00404BE0    C0C1 07         rol     cl, 7


00404BE3    46              inc     esi                             //esi++


00404BE4    80F1 C5         xor     cl, 0C5


00404BE7    80E9 CD         sub     cl, 0CD


00404BEA    C0C1 05         rol     cl, 5


00404BED    00CB            add     bl, cl



[注意]看雪招聘,专注安全领域的专业人才平台!

收藏
免费 7
支持
分享
最新回复 (35)
雪    币: 8209
活跃值: (4559)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
2
看来有些人需要被多多BS才行
2008-2-29 13:27
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
3
替鄙视楼主的人再鄙视一次
2008-2-29 15:54
0
雪    币: 1946
活跃值: (278)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
4
我听见脚步声
2008-2-29 16:40
0
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
6
有总结就有提高,多多学习
2008-2-29 21:28
0
雪    币: 383
活跃值: (41)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
7
      
             (替换)                           |-保存CONTEXT结构
原始指令---------->jmp VM--------| 执行PCODE相映的伪指令代码
   |                                           | 恢复CONTEXT结构
   |                                           |-返回原始程序 
   |(修改后)
   |
 PCODE

我打算这样寻找原始指令,context,PCODE,伪指令这四者之间的联系!
我发现我真是太聪明了^_^
2008-3-1 16:46
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
8
可惜你找不到
2008-3-1 18:03
0
雪    币: 254
活跃值: (126)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
9
自己找不到不等于别人也找不到
2008-3-1 19:25
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
10
PCODE,伪指令被列为2者了
2008-3-1 19:35
0
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
11
① VM的context与Win32的CONTEXT结构没有关系,但意思相似
② VM指令集是作者自己定义的, pcode==pseduo code==伪码==VM的机器码
③ 程序(VM解释引擎)在跑原x86指令转换的对应pcode,什么都做了

没有看明白楼主打算怎样还原x86指令?
2008-3-1 20:02
0
雪    币: 1946
活跃值: (278)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
12
VM+变形不知道楼主想打算怎么还原
2008-3-1 20:25
0
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
13
看不见你的笑我怎么睡的着
2008-3-1 20:26
0
雪    币: 1946
活跃值: (278)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
14
你那么爱他 为什么不把他留下
2008-3-1 20:33
0
雪    币: 213
活跃值: (96)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
有些人总觉得自己聪明,受不了啊。实际写的都是人家研究2分钟就看明白东西。
2008-3-1 20:46
0
雪    币: 1561
活跃值: (974)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
此贴强人太多,留名~
2008-3-2 13:08
0
雪    币: 210
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
Shoooo 龙猫
2008-3-2 15:11
0
雪    币: 383
活跃值: (41)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
18
③ 程序(VM解释引擎)在跑原x86指令转换的对应pcode,什么都做了

00404077    00D8            add     al, bl
00404079    34 F9           xor     al, 0F9
0040407B    2C 70           sub     al, 70
0040407D    C0C0 05         rol     al, 5
00404080    2C 0C           sub     al, 0C
00404082    C0C0 06         rol     al, 6
00404085    00C3            add     bl, al
00404087    8F0487          pop     dword ptr [edi+eax*4]
0040408A  ^ E9 87FFFFFF     jmp     00404016

我现在觉得这里也是一个伪指令,把堆栈的数据弹到context,我给它起了个名字VM_SaveContext.rn   rn表示一个寄存器,具体是哪个,跟pcode有关

被VM了的程序,原始指令几乎被肢解到PCDOE里了,不是简单的stolen
再由VM拼装还原....
我现在才开始对VM有点感觉了~!
具体怎么还原vm,我还没找到感觉,那位大虾知道的偷偷告诉我

接下来我打算去看wangdell大虾的文章
2008-3-2 16:39
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
19
再由VM拼装还原....
这句错了
2008-3-2 16:56
0
雪    币: 255
活跃值: (207)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
20
如果是拼装还原的话,就不要虚拟机了。
虚拟机的概念就是有自己的指令体系

cpu - vm -  *  - vm - vmcode

可以有若干套vm嵌套的.

其实,理解起来很容易,把虚拟机当成vb的pcode也就差不多了
2008-3-2 17:18
0
雪    币: 2316
活跃值: (129)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
21
个人理解,分析vm有两种方法,一种是跟到里面去,直接攻城(这你要有时间和精力,这恐怕正是vmprotect公司所希望的).另一种是打外围,农村包围城市.
我觉得第二种更容易些.把vm当成一个黑盒子,用工具分析和记录其行为,猜测内部代码.比如做了哪些reg操作,做了那些文件操作,是否有访问网络,也可以从系统api开始,因为毕竟它还没有模拟api.进入api时,它要先从vm中出来.
2008-3-2 17:31
0
雪    币: 553
活跃值: (2355)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
22
如果说需要修改的代码在VM中,或者注册保护代码被VM了,那怎么分析程序,修改程序呢?
2008-3-2 23:29
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
看来有些人需要被多多BS才行
2008-3-3 09:43
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
24
楼主应该错了,不是在VM中重生,是在VM中YD
2008-3-3 13:03
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
25
发多了一贴
2008-3-3 13:03
0
游客
登录 | 注册 方可回帖
返回