首页
社区
课程
招聘
[原创]VMProtect代码还原技术
发表于: 2010-12-5 01:50 63431

[原创]VMProtect代码还原技术

2010-12-5 01:50
63431
收藏
免费 8
支持
分享
最新回复 (86)
雪    币: 1442
活跃值: (2451)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
26
厉害啊,以楼主的功力绝对天下无敌,举世最强,快出脱壳机吧,等好久了,就等你出手了
2010-12-5 14:09
0
雪    币: 656
活跃值: (448)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
27
膜拜........
2010-12-5 14:12
0
雪    币: 1946
活跃值: (268)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
28
识别垃圾代码需要人肉收集成对的垃圾指令,还是根据指令读\写\覆盖的特征来识别垃圾指令才是王道。
2010-12-5 16:07
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
29
我只是好奇,逆向VMP需要简化(清除垃圾指令吗?由于完全不懂,故此好奇)
2010-12-5 16:10
0
雪    币: 1115
活跃值: (122)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
30
我也是完全不懂,只是觉得在大量垃圾指令面前,应该先去掉垃圾指令才对。不管是对vmprotect,还是其他的壳。
2010-12-5 17:09
0
雪    币: 244
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
31
向研究VMProtec的高手致敬~
2010-12-5 17:13
0
雪    币: 235
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
32
服了。。一个下午到了这个程度了,估计离插件泄出不远了。。HOHO
2010-12-5 23:54
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
33
强大.....学习ing
2010-12-8 12:39
0
雪    币: 89
活跃值: (214)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
34
没懂~楼主能详细点么?
2010-12-10 03:13
0
雪    币: 242
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
35
同等~~~~~~~
2010-12-10 07:39
0
雪    币: 104
活跃值: (73)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
36
膜拜大牛~~
2010-12-12 00:11
0
雪    币: 386
活跃值: (46)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
37
完全看不懂,无法学习
2010-12-12 10:39
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
38
很强大 楼主发出来
2010-12-12 14:09
0
雪    币: 220
活跃值: (801)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
39
好东西都是普通会员发的
2010-12-12 18:35
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
40
不懂  围观·········
2010-12-13 11:45
0
雪    币: 3904
活跃值: (2407)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
41
支持一下啊 期待了啊
2010-12-13 12:35
0
雪    币: 29
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
42
除了佩服,没啥
2010-12-14 03:30
0
雪    币: 199
活跃值: (72)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
43
占个位子  等BIN
2010-12-14 18:34
0
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
44
关注中。。。。。。。。。
2010-12-14 19:53
0
雪    币: 1115
活跃值: (122)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
45
这几天又断断续续研究了一下,在完全去除花指令后,提取其有用的指令,对每个虚拟机dispatch函数进行特征定义,然后可以打印所有的dispatch函数:
(期间还需要自动找到dispatch函数表、取指令位置、dispath函数的解密算法并进行自动解密)

typedef struct _OPCSIG
{
        char* asmsig;       
        int id;
        BOOL bRecognized;
}OPCSIG;

OPCSIG opcsig[] =
{
        {
                "and al,0x3C\0"
                "mov edx,[ebp]\0"
                "add ebp,4\0"
                "mov [eax+edi],edx\0\0",
                OPC_POPREG,
                FALSE
        },
        {
                "and al,0x3C\0"
                "mov edx,[eax+edi]\0"
                "sub ebp,4\0"
                "mov [ebp],edx\0\0",
                OPC_PUSHREG,
                FALSE
        },
        {
                //会 inc esi
                "mov dx,[ebp]\0"   
                "add ebp,2\0"
                "mov [eax+edi],dx\0\0",
                OPC_POPWORDREG,
                FALSE               
        },
        {
                //下面2个相同,一个正常执行,一个倒序
                //"movzx eax,byte ptr [esi]\0"
                "add esi,1\0"
                "mov ax,[eax+edi]\0"
                "sub ebp,2\0"
                "mov [ebp],ax\0\0",
                OPC_PUSHWORDREG,
                FALSE
        },

执行一下:

D:\exer\vmp\Debug>vmp.exe d:\NOTEPAD.vmp.EXE

VMOpcodeGetAddr = 0106B44F
VMEntry = 01043D6A
ecx VMDispatchTable = 0106C045

xor ecx,0x9D602FCA
add ecx,0x0

dwVMOpcodeGetAddr = 0106B2C6

00 0106BAAF:     call api
01 0106BA78:     pushreg
02 0106AEB1:     write byte mem
03 0106B962:     jmp
04 0106AC58:     div word
05 0106C5F4:     write byte mem
06 0106CCCE:     popreg word
07 0106AD92:     nand byte
08 0106BDCB:     calc hash
09 0106B1C0:     read word mem
0A 0106B00F:     read dword mem
0B 0106B00F:     read dword mem
0C 0106C5F4:     write byte mem
0D 0106D00E:     pushreg word
0E 0106AEA0:     pushrdtsc
0F 0106BB58:     pushsximm byte
10 0106CCCE:     popreg word
11 0106B1C0:     read word mem
12 0106AC87:     pushreg word byte
13 0106BB2B:     push esp
14 0106B17F:     push sp
15 0106AC87:     pushreg word byte
16 0106BB2B:     push esp
17 0106AEA0:     pushrdtsc
18 0106AC58:     div word
19 0106B962:     jmp
1A 0106C467:     write dword mem
1B 0106C467:     write dword mem
1C 0106C689:     shl byte
1D 0106B17F:     push sp
1E 0106CB39:     read word mem
1F 0106B35B:     shrd
20 0106B6E3:     write word mem
21 0106ACB2:     shr dword
22 0106B7FD:     nand word
23 0106AF81:     shr byte
24 0106BC4E:     add word
25 0106AEF3:     add byte
26 0106B6F6:     write word mem
27 0106CCB2:     shl dword
28 0106BE40:     mul word
29 0106B034:     read word mem byte
2A 0106CCCE:     popreg word
2B 0106AC58:     div word
2C 0106B0EF:     read word mem byte
2D 0106BAAF:     call api
2E 0106C467:     write dword mem
2F 0106AF81:     shr byte
30 0106B4F8:     set sp
31 0106B834:     jmp
32 0106C53F:     write dword mem
33 0106BB58:     pushsximm byte
34 0106AEB1:     write byte mem
35 0106CCB7:     add dword
36 0106BCC6:     popreg word byte
37 0106B034:     read word mem byte
38 0106B55E:     div dword
39 0106B0EF:     read word mem byte
3A 0106CCB2:     shl dword
3B 0106B9BC:     nand dword
3C 0106B962:     jmp
3D 0106CCB7:     add dword
3E 0106B834:     jmp
3F 0106B1C0:     read word mem
40 0106AD6B:     pushwordimm byte
41 0106BBD5:     cpuid
42 0106B35B:     shrd
43 0106BB2B:     push esp
44 0106B35B:     shrd
45 0106BBD5:     cpuid
46 0106B4F8:     set sp
47 0106ACB2:     shr dword
48 0106B034:     read word mem byte
49 0106B4F8:     set sp
4A 0106BBD5:     cpuid
4B 0106B962:     jmp
4C 0106BE40:     mul word
4D 0106BB2B:     push esp
4E 0106B9BC:     nand dword
4F 0106B2F2:     shr word
50 0106BB2B:     push esp
51 0106C467:     write dword mem
52 0106B834:     jmp
53 0106AD92:     nand byte
54 0106B8AF:     VMExit
55 0106BDCB:     calc hash
56 0106BE40:     mul word
57 0106AD92:     nand byte
58 0106AC87:     pushreg word byte
59 0106C467:     write dword mem
5A 0106CB39:     read word mem
5B 0106C53F:     write dword mem
5C 0106BBF1:     shld
5D 0106B00F:     read dword mem
5E 0106BC73:     read dword mem
5F 0106B55E:     div dword
60 0106D00E:     pushreg word
61 0106B1C0:     read word mem
62 0106CE90:     shl word
63 0106AD6B:     pushwordimm byte
64 0106C979:     set esp
65 0106B7FD:     nand word
66 0106B7FD:     nand word
67 0106B8AF:     VMExit
68 0106CCB2:     shl dword
69 0106AD6B:     pushwordimm byte
6A 0106BB58:     pushsximm byte
6B 0106C5F4:     write byte mem
6C 0106B17F:     push sp
6D 0106C467:     write dword mem
6E 0106BB58:     pushsximm byte
6F 0106C979:     set esp
70 0106ACB2:     shr dword
71 0106BDCB:     calc hash
72 0106C979:     set esp
73 0106CB39:     read word mem
74 0106AC58:     div word
75 0106B0EF:     read word mem byte
76 0106BBF1:     shld
77 0106BCC6:     popreg word byte
78 0106C53F:     write dword mem
79 0106AD6B:     pushwordimm byte
7A 0106AEF3:     add byte
7B 0106C53F:     write dword mem
7C 0106B4F8:     set sp
7D 0106B35B:     shrd
7E 0106B034:     read word mem byte
7F 0106BE40:     mul word
80 0106ACB2:     shr dword
81 0106AC87:     pushreg word byte
82 0106CCB2:     shl dword
83 0106C53F:     write dword mem
84 0106B962:     jmp
85 0106B9BC:     nand dword
86 0106B2F2:     shr word
87 0106BAAF:     call api
88 0106C4EC:     popreg
89 0106B7FD:     nand word
8A 0106BA78:     pushreg
8B 0106B0EF:     read word mem byte
8C 0106BBD5:     cpuid
8D 0106BC73:     read dword mem
8E 0106AE25:     pushwordimm
8F 0106C90C:     popfd
90 0106C4EC:     popreg
91 0106B6F6:     write word mem
92 0106BA78:     pushreg
93 0106CCCE:     popreg word
94 0106ADAF:     write dword mem
95 0106AEF3:     add byte
96 0106CCB7:     add dword
97 0106AE25:     pushwordimm
98 0106C4EC:     popreg
99 0106CB39:     read word mem
9A 0106BA78:     pushreg
9B 0106AD6B:     pushwordimm byte
9C 0106B00F:     read dword mem
9D 0106C90C:     popfd
9E 0106B962:     jmp
9F 0106B55E:     div dword
A0 0106C4EC:     popreg
A1 0106C4DA:     pushdwordimm
A2 0106BA78:     pushreg
A3 0106BDCB:     calc hash
A4 0106B55E:     div dword
A5 0106BBD5:     cpuid
A6 0106BCC6:     popreg word byte
A7 0106CCCE:     popreg word
A8 0106C4EC:     popreg
A9 0106CCB2:     shl dword
AA 0106BA78:     pushreg
AB 0106BC4E:     add word
AC 0106B034:     read word mem byte
AD 0106B6F6:     write word mem
AE 0106CCCE:     popreg word
AF 0106B2F2:     shr word
B0 0106C4EC:     popreg
B1 0106BA78:     pushreg
B2 0106C4DA:     pushdwordimm
B3 0106C53F:     write dword mem
B4 0106B7FD:     nand word
B5 0106BC73:     read dword mem
B6 0106B0EF:     read word mem byte
B7 0106C4EC:     popreg
B8 0106BE40:     mul word
B9 0106BA78:     pushreg
BA 0106B0EF:     read word mem byte
BB 0106AC58:     div word
BC 0106B4F8:     set sp
BD 0106AC87:     pushreg word byte
BE 0106CE90:     shl word
BF 0106C4EC:     popreg
C0 0106CE90:     shl word
C1 0106BA78:     pushreg
C2 0106AF81:     shr byte
C3 0106B6F6:     write word mem
C4 0106CCB7:     add dword
C5 0106BC73:     read dword mem
C6 0106AD92:     nand byte
C7 0106C4EC:     popreg
C8 0106B962:     jmp
C9 0106BA78:     pushreg
CA 0106CE90:     shl word
CB 0106B9BC:     nand dword
CC 0106C53F:     write dword mem
CD 0106C90C:     popfd
CE 0106BB2B:     push esp
CF 0106C4EC:     popreg
D0 0106B35B:     shrd
D1 0106BA78:     pushreg
D2 0106CB39:     read word mem
D3 0106CCB2:     shl dword
D4 0106D00E:     pushreg word
D5 0106AEA0:     pushrdtsc
D6 0106CB39:     read word mem
D7 0106C4EC:     popreg
D8 0106CE90:     shl word
D9 0106BA78:     pushreg
DA 0106BC73:     read dword mem
DB 0106AC87:     pushreg word byte
DC 0106AE25:     pushwordimm
DD 0106AC87:     pushreg word byte
DE 0106AC58:     div word
DF 0106C4EC:     popreg
E0 0106AC87:     pushreg word byte
E1 0106BA78:     pushreg
E2 0106AC58:     div word
E3 0106B6F6:     write word mem
E4 0106AEF3:     add byte
E5 0106C467:     write dword mem
E6 0106AEF3:     add byte
E7 0106C4EC:     popreg
E8 0106CCB2:     shl dword
E9 0106BA78:     pushreg
EA 0106C53F:     write dword mem
EB 0106AE25:     pushwordimm
EC 0106CCB7:     add dword
ED 0106B2F2:     shr word
EE 0106AC87:     pushreg word byte
EF 0106C4EC:     popreg
F0 0106CCB2:     shl dword
F1 0106BA78:     pushreg
F2 0106ADAF:     write dword mem
F3 0106AEF3:     add byte
F4 0106B8F7:     pushsximm word
F5 0106AEA0:     pushrdtsc
F6 0106B4F8:     set sp
F7 0106C4EC:     popreg
F8 0106AC58:     div word
F9 0106BA78:     pushreg
FA 0106C979:     set esp
FB 0106B35B:     shrd
FC 0106BBF1:     shld
FD 0106CCCE:     popreg word
FE 0106B55E:     div dword
FF 0106C4EC:     popreg
2010-12-15 00:25
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
46
一眼看去和 NP 的 FKVMP 有点像了,顶一下
2010-12-15 00:51
0
雪    币: 130
活跃值: (427)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
47
膜拜下```
2010-12-15 04:18
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
48
vm要倒下了 以后都云壳?
2010-12-15 11:21
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
49
[I]  {
    //会 inc esi
    "mov dx,[ebp]\0"   
    "add ebp,2\0"
    "mov [eax+edi],dx\0\0",
    OPC_POPWORDREG,
    FALSE   
  },[/I]
一个handler不一定每次都以这样的形式出现吧.
vmp的handler代码不是固定的,对不同的加密,handler是不同的.
2010-12-15 17:33
0
雪    币: 1115
活跃值: (122)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
50
[QUOTE=histimes;903297]{
    //会 inc esi
    "mov dx,[ebp]\0"   
    "add ebp,2\0"
    "mov [eax+edi],dx\0\0",
    OPC_POPWORDREG,
    FALSE   
  },
一个handler不一定每次都以这样的形式出...[/QUOTE]

OPCSIG结构中的特征是去除了解密代码后的特征,解密代码每次都不一样,但是去掉了解密代码后的指令每次都是一样的。
2010-12-15 18:02
0
游客
登录 | 注册 方可回帖
返回
// // 统计代码