现在的技术更新换代真是快哦,好多壳都还没有脱成功,就出现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
[注意]看雪招聘,专注安全领域的专业人才平台!