首页
社区
课程
招聘
[注意]哪位玩过WRK吗(VMProtect2.04简单分析)
发表于: 2010-4-25 12:36 9557

[注意]哪位玩过WRK吗(VMProtect2.04简单分析)

2010-4-25 12:36
9557

进来了必须顶,不管看不看

谁玩过WRK吗
当我定义_X86_PAE_宏的时候少个头文件,谁尝试过恢复吗
微软太不厚道了,提供又不提供全
有兴趣恢复或者已经恢复的兄弟加我QQ 7448217

VMProtect是crack本营俄罗斯出的一款保护软件, VMProtect的特点有三个1 头晕, 2目眩 3同上

和普通加壳软件不一样的地方

VMP将X86代码转换为中间代码

由VMP嵌入可执行文件中的解析引擎予以解析

该引擎的特点是大量被加垃圾代码使用了很多怪异指令 中间字节码动态解密

分析难度非常大

一条mov eax, 0 经过vmprotect 2.04加密后 OD RunTrace 3000多条指令 字节码指令有40多条

VMP虚拟机的LOOP(经过删除了部分无用指令后):

0040668E  >  8A46 FF      mov    al, byte ptr [esi-1]
00406691  . |00D8          add    al, bl
00406693  . |F5            cmc
00406694  . |C0C8 02      ror    al, 2
00406697  . |66:85F0      test    ax, si
0040669A  . |04 D3        add    al, 0D3
0040669C  . |C0C0 06      rol    al, 6
0040669F  . |00C3          add    bl, al
004066A1  . |0FB6C0        movzx  eax, al
004066A4  . |83C6 FF      add    esi, -1

004066DA  .  8B0C85 006140>mov    ecx, dword ptr [eax*4+406100]

0040779B  $  C1C9 19      ror    ecx, 19

此时ECX指向了他的一个handler

可以看出他的基本结构: 指令指针在ESI中 字节码由BL动态解密

HANDLER理论上有256个

每一次编译这个LOOP都会不一样,但是基本原理差不多

VMP会在加密的代码块前面加一条push xxx jmp xxx

在我机器上从虚拟机入口进入到取指令循环经历了茫茫91条指令
大部分指令是故意混乱的

第一条指令是 push 0402104 这个地址指向.rdata中
之后 jmp 到vmp1中(默认用VMPROTECT2.04没有修改段名)

从我们的代码进入到VMP的虚拟机需要做的事情:
1, 初始化指令指针esi
      跳入到vmp1中之后第一次实际压入的地址(不包括他为了混乱随便压了又弹得)是esi的地址,不过这里还是加密过后的 后面对该地址进行了解密,如果要实现编程提取他的地址好像很有难度
      实际上ESI这个时候还不是完全指向的VM字节码在虚拟机循环里面展现了一个偏移 我这里是 -1应该每次VM编译都会不一样
2, 初始化解密密钥bl
      EBX = 解密后的ESI 也就是说SI的低8位作为初始密钥
3, 保存现场环境以便退出虚拟机时恢复
      我这里的从进入vmp1段堆栈结构是
52D724A7 这个是在指令指针后面压入的一个值,暂时没分析出他的作用
加密的指令指针
eax
ebx
ebp
edi
esi
edx
eflags
ebx
ecx
0
ebp-> 0
esp-> 48个位子(4字节一个)

编译条件不变每次编译混乱的都不一样,但是基本框架是这样,可能版本不一样框架会稍有变化

出口第一句实际指令就是 mov esp, ebp

入口保留的48个空位难道是VM虚拟机用来做为临时用途的

然后再是从入口保存的寄存器信息里恢复,

也就是说VM字节码要改变实际寄存器的值只要改变这里的值就OK,

分析哪些HANDLER改变寄存器可以用 hw...

将近返回的时候有一个VM HANDLER写了刚开始进入VM的时候压入在堆栈的值, 这个值在出口的时候是VM的返回值


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (11)
雪    币: 193
活跃值: (26)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
2
..........留名再看
2010-4-25 20:33
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
你说的在网络上流传已久啦,基本都是表层的基础理论,在实际如何还原融入了 VM 的代码
才是真正要费神的事,他的外壳,从最新的版本来看还是没起到对抗 CR 的作用,但它的虚拟机就真 TMD
是个累人的活,就算总结了部份对抗的方法,还是很不愿意见到它 。。。。。。。。。。。。。。累啊
2010-4-25 21:32
0
雪    币: 419
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
vm handler 是啥东西
2010-4-25 22:01
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
粗略的说,就是 vmp 模拟了一条 x86 ,代码量或多或小,原本一句搞定,它拆开为几十行代码(中间有垃圾),并且每个 H 都在结尾处就跳回去引擎之处,而引擎负责读取 vm_byte ,然后 x 啊 x 啊,还原出下一个
H 的地址,然后 vm_retn 就靠这个地址溜过去 ,然后那个 H 的尽头有溜回 引擎处,如此循环

很耗体力的,为你和家人的健康着想,请远离 VM  
2010-4-25 22:18
0
雪    币: 419
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
怪不得我不会vm,和我思想有极大冲突,一个字节能弄的东西,就不要2个字节
2010-4-25 23:38
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
7
代码压缩式VM,那个解释器也很变态,要不你试试回到没有C#概念的时候读读C#编译的程序?
2010-4-26 00:01
0
雪    币: 190
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
还原VM太难了, 他很多地方都是每次编译不一样包括他的 handler 位置什么都不一样, 代码废指令也是每次不一样, BL ESI加密都不一样
2010-4-26 17:45
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
你错了,他每个 H 的指令方式基本上都是一致的, 而每次不同的是把作为载体的寄存器替换了
2010-4-26 20:55
0
雪    币: 190
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
你说的H指令方式是什么意思?
我这里每次指令字节码代表含义都不一样 而且指令HANDLER指针数组都经过加密方式都不一样
LOOP循环每次编译完全不一样 我的是VMP2.04
2010-4-27 00:50
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
11
LS的诸位,看看编译器基础吧。
2010-4-27 04:25
0
雪    币: 205
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
看VM后的代码太头痛了
2010-6-22 14:32
0
游客
登录 | 注册 方可回帖
返回
//