首页
社区
课程
招聘
ExeCryptor v2.X.X虚拟机不完全补完(处女帖)
发表于: 2006-7-24 17:33 21043

ExeCryptor v2.X.X虚拟机不完全补完(处女帖)

2006-7-24 17:33
21043

该文参考 softworm 大大文章及其各位研究ExeCryptor VM的部分总结完善而得

序言
ExeCryptor 的VM算不上完整的全代码VM,因为他只VM少部分的常用CODE,相对THIMDA的VM来比应该算少的多的VM了。ExeCryptor将
VM代码,真实代码及其废代码混在一起,要你一个剥离还是比较累的。

第一步
解析PCODE的参数运算,和softworm分析的一样,他进行了参数的复杂运算,我这次的实列好象比以前softworm大大分析的解密代码是
一致的如下:(dwData为参数值)

mov eax,dwData
mov edx,dwData
ror eax,0x10
rol dx,0x3
add edx,dwSeed1
xor edx,dwSeed2
xor ax,dx
mov dwData,eax
------------------------------------------------
这段代码循环16次,第四次的时候将参与下面的运算
------------------------------------------------
第四轮后做一次检查
007A7856 主       XOR AX,DX                                 ; FL=0, EAX=B172532C

007A7859 主       PUSH EDI                                  ; ESP=0012F954---------------------->EFL
007A785A 主       POP EDX                                   ; EDX=00200206, ESP=0012F958

007B676F 主       TEST DH,1                                 ; FL=PZ
007B6772 主       SETNE CL                                  ; ECX=0BC8E700
007B6775 主       ROR EAX,CL
007B6777 主       PUSH EAX                                  ; ESP=0012F954
007B6778 主       PUSH E4A1CE3B                             ; ESP=0012F950
007B677D 主       POP EAX                                   ; EAX=E4A1CE3B, ESP=0012F954
007B677E 主       JMP lin.007A3638
007A3638 主       AND EAX,9C6099A2                          ; FL=PS, EAX=84208822
007A363E 主       ADD EAX,9DEA2DF4                          ; FL=CO, EAX=220AB616
007A3644 主       JNS lin.007ABE59
007ABE59 主       OR EAX,1ABB98AD                           ; FL=0, EAX=3ABBBEBF
007ABE5F 主       XOR EAX,3ABBB67E                          ; EAX=000008C1
007ABE65 主       AND EDX,EAX                               ; FL=PZ, EDX=00000000---------> dwEFlag & 0x000008c1
007ABE67 主       POP EAX                                   ; EAX=B172532C, ESP=0012F958
007ABE68 主       JMP lin.007A38AB
007A38AB 主       JMP lin.007A522E
007A522E 主       OR EDX,FFFFF73E                           ; FL=S, EDX=FFFFF73E  -------------> 前面运算的值   | 0xFFFFF73E
007A5234 主       AND EAX,EDX                                -------> dwData & 前面运算的值

换成C为:
dwData &=(dwEFlag & 0x000008c1) | 0xFFFFF73E

------------------------------------
上面提到的的dwSeed1,dwSeed2见下
---------------seed-----------------
D5F32EE8,3BB9C21F
4D51DFF,DA4AAB8A
CCB64EEB,CA6D5E88
CE1D5985,92FDE4E1
B2928B43,E4291FEA
2C9B2D4B,A987B1A4
31F45613,180A72FB
400C665B,5E22663D
6B003FE8,C5DBB853
9C3A8FE6,F91D2FB3
3F187E27,E8F0242D
70E9A6C8,C93FAB46
B9BAE97A,531414AA
DC7E74FF,6C993787
F43F5FD6,929C0C05
710F6FDC,372EF51B
D75922C4,7D56C0C2
618AC95F,63E27BB4
DAA433DA,05092A86
5E675CD8,19392E42
E33B20AE,E68EF219
70EA9678,E5BA7291
DE827B5A,D38F78F6
78232635,8A5DA9AF
35D1C121,D1F503E7
460C174B,E43D7B0A
C25A9D9F,96495B57
AD301179,4BE7E85F
288E62D6,1251B610
159FA2A1,6CBD33F9
6791AA88,2D5D2DE1
E3818646,0F70C0CE
------------------------------------
这里的SEED和softworm取的不一样,难道每个单独的加密是各自不同的SEED?没验证……

第二步
解析运算后的OPCODE指令含义

这里要说下,解密出来的OPCODE包含了指令和运算的寄存器及其是否读下个常数等
这里可以参看 softworm 大大的文章
<ExeCryptor v2.2.6虚拟机不完全分析>
http://bbs.pediy.com/showthread.php?s=&threadid=17763&highlight=%B2%BB%CD%EA%C8%AB%B7%D6%CE%F6

我这里简单补充下其他softworm大大没讲到的:(简单说明,请大家不要见笑)

switch (dwPlain & 0x000000FF)
  {
        case 0x3:  //mov [reg32],reg32
        第一个寄存器:(dwPlain >> 0xb) & 0x7
        第二个寄存器:(dwPlain >> 0x8) & 0x7
       
       
        case 0x4: //mov reg32,[reg32]
        第一个寄存器:(dwPlain >> 0xb) & 0x7
        第二个寄存器:(dwPlain >> 0x8) & 0x7
       
       
        case 0x07: //not reg32
        第一个寄存器:(dwPlain >> 0x8) & 0x7
       
       
        case 0x10://pushfd
       
       
        case 0x11://popfd
       
       
        case 0x12://TEST reg32,reg32
        第一个寄存器:(dwPlain >> 0x8) & 0x7
        第二个寄存器:(dwPlain >> 0xb) & 0x7
       
       
        case 0x16:// ROR reg32,reg8
        第一个寄存器:(dwPlain >> 0x8) & 0x7
        第二个寄存器:(dwPlain >> 0xb)
       
        case 0x20://TEST reg8,reg8
        第一个寄存器:(dwPlain >> 0x8) & 0x7
        第二个寄存器:(dwPlain >> 0xb) & 0x7
  }

if(0x8 == (dwPlain & 0x000000F8))  
    {
      switch(dwType)  
      {
        case 0x01://or reg32,reg32
        第一个寄存器:(dwPlain >> 0xb) & 0x7
        第二个寄存器:(dwPlain >> 0x8) & 0x7
       
       
        case 0x04://AND reg32,reg32
        第一个寄存器:(dwPlain >> 0xb) & 0x7
        第二个寄存器:(dwPlain >> 0x8) & 0x7
       
        case 0x05://SUB reg32,reg32
        第一个寄存器:(dwPlain >> 0xb) & 0x7
        第二个寄存器:(dwPlain >> 0x8) & 0x7
       
        case 0x06://XOR reg32,reg32
        第一个寄存器:(dwPlain >> 0xb) & 0x7
        第二个寄存器:(dwPlain >> 0x8) & 0x7       
        }
}

第三步
去废代码

这个时候我们应该得到很完整的去VM的代码了,当然ExeCryptor不会让你那么轻松。他有很多的废代码等你去看,呵呵

列如这样的代码等于NOP:

PUSH XXXXXX
RETN

CALL XXXXXXX
XCHG DWORD PTR SS:[ESP],EDI
POP EDI

CALL XXXXXXX
XCHG [ESP],EDI
XCHG DWORD PTR SS:[ESP],ESI
MOV EDI,ESI
POP ESI

……

这些代码等于混乱正常代码用的,自己写个程序去一下花指令就又清爽和减肥了!

恩,还有其他的参与运算的也会这样变换:
比如 ADD EAX,100000

他处理成这样
PUSH ECX
PUSH ED214
POP ECX
ADD ECX, 12DEC
ADD EAX,ECX
POP ECX

当然你不管也可以,追求完美的可以自行修复!这样的变换很多,基本雷同,没什么技术含量了!

注:本文没技术含量,都是借鉴各位大大自己学习总结而得,如有冒犯请联系斑竹删除!

参考文献:
ExeCryptor v2.2.6虚拟机不完全分析                softworm
EXECryptor2.3.9主程序脱壳【分享】                DarkBull


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

收藏
免费 7
支持
分享
最新回复 (22)
雪    币: 50161
活跃值: (20630)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
softbihu对虚拟机很有心得,谢谢你能与大家分享。;)
2006-7-24 17:41
0
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
支持更多的人 搞虚拟机
/mobai
2006-7-24 17:54
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
最初由 softbihu 发布
ExeCryptor 的VM算不上完整的全代码VM,因为他只VM少部分的常用CODE,相对THIMDA的VM来比应该算少的多的VM了.

这个说法不敢认同。EXECryptor的VM应该也是全代码VM.只不过它加壳有个选项:Virtualization level,一般是20%所以部分代码没有用VM执行,如果等于100%应该是全代码VM.否则它就没必要提供这个选项。
2006-7-24 20:21
0
雪    币: 338
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
楼主太强了!!
2006-7-24 21:48
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
6
蛀虫,壁虎,下次会是什么
softbihu那个清爽又减肥的东西掏出看看。。。
2006-7-24 22:14
0
雪    币: 216
活跃值: (224)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
最初由 forgot 发布
蛀虫,壁虎,下次会是什么
softbihu那个清爽又减肥的东西掏出看看。。。


哪个写的比较糟糕,不敢拿出来,而且用法怪异,还的我再写一篇使用方法,我怕大家笑话,哈哈。。。。
2006-7-25 09:09
0
雪    币: 216
活跃值: (224)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
8
最初由 gkend 发布
这个说法不敢认同。EXECryptor的VM应该也是全代码VM.只不过它加壳有个选项:Virtualization level,一般是20%所以部分代码没有用VM执行,如果等于100%应该是全代码VM.否则它就没必要提供这个选项。


他处理VM的代码就只有这些,很多常用指令都没放进来,你用100%也是一样的处理流程~
2006-7-25 09:46
0
雪    币: 98745
活跃值: (201039)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
9
sustain.
2006-7-25 11:14
0
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
10
支持一下
2006-7-25 12:32
0
雪    币: 216
活跃值: (224)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
11
最初由 softworm 发布
支持一下


softworm 大大来了啊,呵呵

见笑了,基本上都是学习你的~
2006-7-25 12:47
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
最初由 forgot 发布
蛀虫,壁虎,下次会是什么
softbihu那个清爽又减肥的东西掏出看看。。。

下次是蚂蚁。软件蚂蚁==softants.
不是有一句:千里之堤,溃于蚁穴?可见蚂蚁的厉害。
2006-7-25 14:05
0
雪    币: 114
活跃值: (373)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
Good Tutorial!
2006-7-26 15:38
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
顶!!!牛人!!
2006-7-26 16:39
0
雪    币: 200
活跃值: (98)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
最初由 gkend 发布
下次是蚂蚁。软件蚂蚁==softants.
不是有一句:千里之堤,溃于蚁穴?可见蚂蚁的厉害。

呵呵,softfrog呢
2006-7-27 18:23
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
Microsoft Visual C++ 6.0 [Overlay] 像这样的加密壳对我们新手真是难搞哦,易语言编的 查什么都是乱码~汗死
2006-8-4 18:46
0
雪    币: 237
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
顶了,多多学习,好久没有上来看了,又多了几个.......,好样的!!!!!!!!
2006-8-7 18:25
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
看了 学习了`
2006-8-8 18:42
0
雪    币: 200
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
 very good![I]
2006-8-10 20:42
0
雪    币: 1309
活跃值: (232)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
讨厌vm, 喜欢softbihu
2006-8-15 00:28
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
这东东好用不..
2006-8-18 09:29
0
雪    币: 9344
活跃值: (3755)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
学习了  支持楼主将经验共享
2006-8-19 18:25
0
雪    币: 219
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
保存慢慢看!!!!!!!
2006-8-27 05:28
0
游客
登录 | 注册 方可回帖
返回
//