首页
社区
课程
招聘
[分享]学习VMP 1.22的一点心得体会
发表于: 2007-11-22 21:52 19028

[分享]学习VMP 1.22的一点心得体会

2007-11-22 21:52
19028

致谢:
bughoho,forgot,shoooo

试验程序用的max speed+的VMP.

VMP是堆栈机。VMP使用真堆栈,没有V_Stack
什么是堆栈机,简单的理解就是一切的指令,中间结果,数据"放"在堆栈.准确的说应该是通过堆栈关联.
要准确的理解可以参考这本书.<<Stack Computer>>

由于VMP是堆栈机所以指令系统和运作方式不太像我们熟悉的X86系统.对分析造成一些障碍.

VMP的入口代码:

最开始是两个push imm32 jmp的组合,依次压入解码的Key和PCODE的首地址(V_PCODESEG)
然后是下面的代码.  
(nextpcode不是很确切.因为只有个别handler才jmp回nextpcode,大部分情况时handler里面自己+V_EIP)

vmp0:0040304C                                   public VM_INIT
.vmp0:0040304C                   VM_INIT:                                ; CODE XREF: start+2824j
.vmp0:0040304C 51                                push    ecx
.vmp0:0040304D 55                                push    ebp
.vmp0:0040304E 53                                push    ebx
.vmp0:0040304F 56                                push    esi
.vmp0:00403050 51                                push    ecx
.vmp0:00403051 57                                push    edi
.vmp0:00403052 52                                push    edx
.vmp0:00403053 50                                push    eax
.vmp0:00403054 9C                                pushf
.vmp0:00403055 68 00 00 00 00                    push    0
.vmp0:0040305A 8B 74 24 28                       mov     esi, [esp+28h]  ; VM_CODESEG=004037B2
.vmp0:0040305E BF 00 30 40 00                    mov     edi, offset VM_Context
.vmp0:0040305E
.vmp0:00403063
.vmp0:00403063                   VM_NextPCode:                           ; CODE XREF: V_JMP+1j
.vmp0:00403063 89 F3                             mov     ebx, esi        ; ebx:previous_pcode的地址
.vmp0:00403065 03 34 24                          add     esi, [esp]      ; esi:指向current_pcode
.vmp0:00403065                                                           ;
.vmp0:00403065                                                           ; 首次进入esi=ebx
.vmp0:00403065
.vmp0:00403068
.vmp0:00403068                   Vm_Execute:                             ; CODE XREF: V_ADD_BYTE+6j
.vmp0:00403068                                                           ; V_PUSH_ESP+1j
.vmp0:00403068                                                           ; V_LOAD_BYTE_CONTEXT+16j
.vmp0:00403068                                                           ; V_LOAD_BYTE_BY_ADDR_DS+7j
.vmp0:00403068                                                           ; V_ADD_DWORD+5j
.vmp0:00403068                                                           ; V_POP_SP+2j ...
.vmp0:00403068 8A 0E                             mov     cl, [esi]       ; cl=cipher_pcode
.vmp0:0040306A 00 D9                             add     cl, bl
.vmp0:0040306C C0 C9 05                          ror     cl, 5
.vmp0:0040306F F6 D9                             neg     cl
.vmp0:00403071 46                                inc     esi             ; esi:指向数据,或者下一个pcode
.vmp0:00403072 80 E9 52                          sub     cl, 52h
.vmp0:00403075 D0 C1                             rol     cl, 1
.vmp0:00403077 FE C1                             inc     cl
.vmp0:00403079 80 F1 78                          xor     cl, 78h
.vmp0:0040307C 80 C1 19                          add     cl, 19h
.vmp0:0040307F 00 CB                             add     bl, cl
.vmp0:00403081 0F B6 C1                          movzx   eax, cl
.vmp0:00403084 8D 14 85 89 32 40+                lea     edx, VM_HANDLER_TABLE[eax*4]
.vmp0:0040308B FF 22                             jmp     dword ptr [edx]

上面就是VMP的主循环.
在主循环和handler中esi就是V_EIP edi就是指向V_CONTEXT.ebx保持一个key.
看见看出VMP的解码和执行流程有关.解码有一定难度.直接修改PCODE好像也很困难.

VM_EXECUTE主要功能就是解码PCODE然后jmp到相应的Handler.

VMP的指令:
我觉得VMP的指令如果用类似浮点指令的方式命名可能会容易理解一些.
FPU貌似也是堆栈机(我看来是,也不清楚具体的内部结构).
比如fld fst之类的指令.
没有fmov之类的指令.因为FPU处理任何指令.都是通过浮点堆栈取数据.

VMP也类似.
在我自己的+的小试验程序里面,确实也没有发现V_MOV类似的handler.不知道http://bbs.pediy.com/showthread.php?t=54535中的V_MOV是什么样子的handler.
希望能和wangdell请教一下.

可能是我的程序太小,只有4行指令
push 0
push imm32
push imm32
call    MessageBox
是不是VMP没有生成相关的handler?

识别handler的方法我是连蒙带猜.

不过可以通过最开始的PCODE快速的确定V_STORE_CONTEXT_DWORD的Handler
我通过OD记录执行的Handler的地址.然后根据手动还原的表.打出了一份VMP保护
push 0
push imm32
push imm32
Call   MesssageBox的PCODE
如下: (还没有记录PCODE的参数).能大概熟悉一下指令系统.STORE类指令就是把数据存入某地 (CONTEXT,内存地址).LOAD类是把数据从某地push到堆栈上.

V_STORE_CONTEXT_DWORD
V_STORE_CONTEXT_DWORD
V_STORE_CONTEXT_DWORD
V_STORE_CONTEXT_DWORD
V_STORE_CONTEXT_DWORD
V_STORE_CONTEXT_DWORD
V_STORE_CONTEXT_DWORD
V_STORE_CONTEXT_DWORD
V_STORE_CONTEXT_DWORD
V_STORE_CONTEXT_DWORD
V_STORE_CONTEXT_DWORD
V_STORE_CONTEXT_DWORD
V_LOAD_BYTE_CODESEG
V_STORE_CONTEXT_WORD
V_STORE_CONTEXT_WORD
V_SHL_DWORD
V_STORE_CONTEXT_DWORD
V_LOAD_BYTE_CODESEG
V_STORE_CONTEXT_WORD
V_STORE_CONTEXT_WORD
V_SHL_DWORD
V_STORE_CONTEXT_DWORD
V_STROE_WORD_CONTEXT
V_PUSH_ESP
V_LOAD_BYTE2DWORD_CODESEG
V_ADD_DWORD
V_STORE_CONTEXT_DWORD
V_LOAD_WORD_BY_ADDR_SS
V_STORE_CONTEXT_DWORD
V_STORE_CONTEXT_DWORD
V_LOAD_BYTE2DWORD_CODESEG
V_LOAD_CONTEXT_DWORD
V_ADD_DWORD
V_STORE_CONTEXT_DWORD
V_PUSH_ESP
V_LOAD_DWORD_BY_ADDR_SS
V_STORE_CONTEXT_DWORD
V_LOAD_CONTEXT_DWORD
V_NOTA_AND_NOTB_0
V_STORE_CONTEXT_DWORD
V_LOAD_DWORD_CODESEG
V_NOTA_AND_NOTB_0
V_STORE_CONTEXT_DWORD
V_LOAD_CONTEXT_DWORD
V_LOAD_DWORD_CODESEG
V_NOTA_AND_NOTB_0
V_STORE_CONTEXT_DWORD
V_NOTA_AND_NOTB_0
V_STORE_CONTEXT_DWORD
V_LOAD_BYTE2DWORD_CODESEG
V_ADD_DWORD
V_STORE_CONTEXT_DWORD
V_STORE_CONTEXT_DWORD
V_LOAD_BYTE_CODESEG
V_LOAD_CONTEXT_DWORD
V_LOAD_CONTEXT_DWORD
V_SHLD_DWORD
V_STORE_CONTEXT_DWORD
V_LOAD_BYTE2DWORD_CODESEG
V_ADD_DWORD
V_STORE_CONTEXT_DWORD
V_STORE_CONTEXT_DWORD
V_LOAD_CONTEXT_DWORD
V_LOAD_CONTEXT_DWORD
V_LOAD_CONTEXT_DWORD
V_LOAD_CONTEXT_DWORD
V_LOAD_CONTEXT_DWORD
V_LOAD_CONTEXT_DWORD
V_LOAD_CONTEXT_DWORD
V_LOAD_CONTEXT_DWORD
V_LOAD_CONTEXT_DWORD
V_LOAD_CONTEXT_DWORD
V_LOAD_CONTEXT_DWORD
V_LOAD_CONTEXT_DWORD
V_JMP
V_STORE_CONTEXT_DWORD
V_STORE_CONTEXT_DWORD
V_STORE_CONTEXT_DWORD
V_STORE_CONTEXT_DWORD
V_STORE_CONTEXT_DWORD
V_STORE_CONTEXT_DWORD
V_STORE_CONTEXT_DWORD
V_STORE_CONTEXT_DWORD
V_STORE_CONTEXT_DWORD
V_STORE_CONTEXT_DWORD
V_STORE_CONTEXT_DWORD

V_LOAD_BYTE2DWORD_CODESEG            //push 0

V_LOAD_DWORD_CODESEG                     //push "HelloVm"
V_LOAD_DWORD_CODESEG                     //push "HelloVm"

V_LOAD_BYTE2DWORD_CODESEG           //push 0

V_LOAD_CONTEXT_DWORD
V_LOAD_DWORD_CODESEG
V_ADD_DWORD                                 
V_STORE_CONTEXT_DWORD

V_LOAD_DWORD_CODESEG             //这两条指令就是从IAT取MessageBox的地址。
V_LOAD_DWORD_BY_ADDR_DS        //可见IAT地址是直接保存在PCODE数据里面。不知道能不能类推[imm32]的寻址方式

V_LOAD_CONTEXT_DWORD
V_LOAD_CONTEXT_DWORD
V_LOAD_CONTEXT_DWORD
V_LOAD_CONTEXT_DWORD
V_LOAD_CONTEXT_DWORD
V_LOAD_CONTEXT_DWORD
V_LOAD_CONTEXT_DWORD
V_LOAD_CONTEXT_DWORD
V_LOAD_CONTEXT_DWORD
V_LOAD_CONTEXT_DWORD
V_VM_EXIT

通过PCODE 可以大概了解VMP的指令体系和大致的运作方式.

话说静态还原:
A.能自动识别Handler.这一点我觉得有难度。因为已经有混淆版VMP出现。可能是正版也可能私版VM.
B.区分VM自身结构的代码和被保护的代码.这个我认为相当困难。也许是我经验不够。如果有大量的分析成果的积累。或许能找到某种模式。
C.逻辑表达式的自动化简。自动化简可以办到。但是要求VMP不打乱逻辑顺序。(目前我也不知道VMP有没有打乱逻辑顺序)。
如只是一个萝卜一个坑的拆指令,是有办法自动化简的。

附件中有试验程序和IDB文件

水平有限,难免错漏,请各位斧正


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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (32)
雪    币: 226
活跃值: (15)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
我还在等你的unpacker。
2007-11-22 23:24
0
雪    币: 233
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
学习了 匹配方式清理混淆代码很麻烦 不知道有没有什么别的办法
2007-11-23 08:18
0
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
4
注意看执行的PCODE。 V_JMP前后有一次保存和恢复CONTEXT的过程.
可能是传说中的REG_ENCODE.
2007-11-23 12:03
0
雪    币: 87
活跃值: (47)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
5
内容越来越丰富了,学习了
vmp1.22伪代码要比vmp1.20的少,vmp1.20有190多条,vmp1.22通常只有40多条。
原来分析的v120的mov指令有些错误,在插件中修正了。
NA_AND_NB这个,经13少和forgot  指点,相当于是NOR
2007-11-23 13:09
0
雪    币: 247
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
发错了.....
2007-11-23 14:05
0
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
7
嗯,门电路。
VMP在把指令拆成CPU的逻辑。

之所以这样写,是打算试验表达式的自动化简。NOR化简的时候也要拆。
2007-11-23 15:20
0
雪    币: 223
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
都转行了。。
NOR是什么门?
2007-11-23 18:26
0
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
9
我觉得叫“或非门“吧
计算机里面貌似只有
与非门
2007-11-23 20:46
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
10
鄙视5楼,把我的名字写错了
2007-11-23 21:35
0
雪    币: 87
活跃值: (47)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
11
是“或非门”,和“与非门”一样,同与非一样,是基本逻辑单元。只是不太常用
2007-11-23 22:33
0
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
12
集成电路里面一般只用
与非门
因为与非们最便宜。
而且与非门可以组合成任何门
2007-11-23 23:49
0
雪    币: 1946
活跃值: (248)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
13
可以组成任意们么?我想偷看MM洗澡。
2007-11-24 00:03
0
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
14
禁止YD.
否则TJJTDS

(A NAND B) NAND (A NAND B) = A AND B
(A NAND A)=NOT A
(A NAND A) NAND (B NAND B)=A OR B
2007-11-24 00:16
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
15
主要是用来构造XOR门吧,楼上这种属于放屁脱裤子?
2007-11-24 13:30
0
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
16
NAND便宜些
我只是列举一些基本逻辑的构造方式。
我不懂电路的
2007-11-24 13:38
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
17
我也不懂,一起学习。

我认为NAND构造XOR,XOR构造加法器,不过这可能是过时几十年的知识,还停留在高中。
2007-11-24 14:16
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
18
为楼主找到一些证据:

这是DeMorgan定律的另一种形式,它将一个与门电路变换为或门电
路.由于所有的逻辑电路都可以用"与非门"来构造,而"与非门"又可
以映射为"或非门",因此所有的逻辑电路也都可以单独用"或非门"来
构成.
2007-11-24 14:18
0
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
19
why not just use logical AND, OR, and inverter gates directly? There are two reasons for this. First, NAND gates are generally less expensive to build than other gates. Second, it is also much easier to build up complex integrated circuits from the same basic building blocks than it is to construct an integrated circuit using different basic gates.

书上看见的。

希望搞电路的大牛出来讲解讲解。这个也是几十年前的知识了
2007-11-24 17:56
0
雪    币: 254
活跃值: (126)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
20
双输入单输出TTL与非门:
上传的附件:
2007-11-24 19:11
0
雪    币: 223
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
21
当AB两点都接高电平,两个三极管导通,l点电势拉低为0。
当AB有任意一点接低电平,两个三极管关闭,L点电势拉高,为1.
2007-11-24 19:26
0
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
22
集成电路里面是不是一般都用NAND构造呢?
2007-11-24 20:31
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
23
TTL数据手册
2007-11-24 20:37
0
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
24
I see
patch!
2007-11-24 20:52
0
雪    币: 223
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
25
记得用的比较多的几个结构是 not and or xor ,其他的应是组合搭配的。NAND不是很常见,应该不是基本构成之一
2007-11-24 20:55
0
游客
登录 | 注册 方可回帖
返回
//