首页
社区
课程
招聘
[原创]从0开始手撕64位vmp3.5壳(能撕但只能撕一点点)-Ⅱ堆栈分析与handle识别
发表于: 2026-9-11 09:44 2422

[原创]从0开始手撕64位vmp3.5壳(能撕但只能撕一点点)-Ⅱ堆栈分析与handle识别

2026-9-11 09:44
2422

      上一篇文章指出了去混淆的重要性与去混淆的方法,没有可看过的可以看[原创]从0开始手撕64位vmp3.5壳(能撕但只能撕一点点)-逆向工程-看雪安全社区|专业技术交流与安全研究论坛

这一篇就讲解下如何识别handle。首先从VMinit开始   由于我们不是静态分析,我们通过工具能获取到每一步执行结果和堆栈,因此我将用最简单的方式不看加解密直接分析Handle(也是我目前唯一会的)。

我们只用在vminit中找到VMstrack  还有 VMEIP 就可以了,其实VEIP的作用也可以忽略不计,就是看个乐子,但是VMStrack要好好理解。


ok 接下来就开始看第一个handle

ok通过上面三个Handle 我们可以总结出 每次push ret  就是 Handle结尾

接下来讲堆栈,大家要认真理解。

首先来看vmHandle的堆栈,很简单,保存现场,然后提升堆栈

img

然后看看接下来的handle执行后

2

可以看到 接下来两个handle把之前push的堆栈存到了 当前rps+rdx 的位置中,  其中rdx 是从rdi中取得,对于目前的动态分析这都不重要。我只要知道使用rdx的时候是什么值就行,不用在意哪里来的。

看下图 是我截取的工具截图, 可以看到 当执行到mov  [rsp + rdx], rcx 的时候 rdx =0x10。因此通过目前的堆栈就可以看出,就是把之前堆栈的值pop到新的栈里。前后关系要理清楚,是发现了它弹出了堆栈。所以叫vpop  而不是因为叫vpop 所以弹出了堆栈。

3

如上图左上角所示

接下来一系列handle都是vpop。那么就是把各种寄存器全部取出来放到rps+xx的堆栈中。

从handle1 -handle19都是Vpop  值得注意的是 pop不是顺序的,是乱序的。

下图就是各种push  大家记住 rsp+0xA8 是rax,后面有用

4


接下看handle20

从上面就能看出来 堆栈+8  还有写值 就是push 立即数 。 至于0是怎么算出来的,0代表了什么我还没有研究,目前不影响我们。


下面我们看handle21

0x28 我们在handle1写入的,当时写入的是 0x7ff507a40000   我们在看是否能对应的上。5

如上图所示 r9 就是我们handle1写入的值, 当然你也可以从左边的handle列表里面看到,左侧的handle列表就是我编写的自动识别脚本识别出来的 脚本位置在开源项目的 scripts\split_handlers.lua。每一个handle都是人工识别后,编写lua脚本自动识别。当然工具也又ai接口,ai可以直接获取内容。但是最好人工看,AI还是容易掉坑里。

为了方便起见下面我们就尽量看左边的Handle简介,遇到特殊Handle再讲解


一定有人已经按耐不住了,讲了这么久 你加密前的汇编影子都没看到。

这是因为VMP要各种初始化,具体作用作者也是云里雾里不敢乱说。我们直接跳到逆向汇编的部分


如下所示是我加壳前的汇编 已经在第一章介绍过了

首先就是push rax   如下图所示   之前说过rsp+0xA8 就是RAX  那么Handle35行的意思就是 push rax,注意这个push是Vpush。不等于真实汇编的push。

image-20260910211651039

看着上面的解释是不是一头雾水  实际就是把R8 也就是当前指针push到堆栈里 疑惑的话先接着往下看



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

最后于 2026-9-11 09:49 被卑鄙兔编辑 ,原因:
收藏
点赞 ・33
打赏
分享
最新回复 (26)
雪    币: 158
活跃值: (5841)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2 楼
学习
2026-9-11 14:24
0
雪    币: 6
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3 楼
666
2026-9-11 19:04
0
雪    币: 6
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4 楼
666
2026-9-11 19:04
0
雪    币: 200
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5 楼
666
2026-9-11 21:21
0
雪    币: 0
活跃值: (4920)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6 楼
666
2026-9-12 08:17
0
雪    币: 0
活跃值: (2184)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7 楼
学习中
2026-9-14 09:01
0
雪    币: 2790
活跃值: (7191)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8 楼
感谢分享!
2026-9-14 09:37
0
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9 楼
mark
2026-9-15 16:04
0
雪    币: 200
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10 楼
2026-9-16 14:11
0
雪    币: 230
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11 楼
2026-9-17 00:54
0
雪    币: 95
活跃值: (3225)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12 楼
感谢分享~
2026-9-18 09:27
0
雪    币: 723
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
13 楼
666
2026-9-22 14:45
0
雪    币: 556
活跃值: (1212)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14 楼
大佬tql。不过我在对 mov rcx, 0x123456789abcdef 这条指令的确定这一块有一些问题。
VMP在在开始的时候会把 真实寄存器给他映射到虚拟寄存器上,你的文章里面也讲了。
但是,VMP貌似会在虚拟化这类对于某个寄存器的全宽写入的时候,切换虚拟寄存器,比如说
add rax, rcx
的时候就会生成
push vreg1 (rax对应的虚拟寄存器)
push vreg2 (rex 对应的虚拟寄存器)
add
pop vreg3 (这个在VMP里面就难以判断是绑定到rax还是rcx了)
所以我感觉好像很难直接精确还原原始汇编,我感觉这个才是“VMP能逻辑还原成汇编但是不能100%还原真实汇编。”的原因?
2026-9-22 18:53
0
雪    币: 24
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
15 楼
Steesha 大佬tql。不过我在对 mov rcx, 0x123456789abcdef 这条指令的确定这一块有一些问题。 VMP在在开始的时候会把 真实寄存器给他映射到虚拟寄存器上,你的文章里面也讲了。 但 ...
现在记忆力差,两周没看了忘的差不多了,你看看这个pop的寄存器最后是归谁了,用我的工具应该挺容易追的。首先他这个逻辑上必须和你原生汇编一致   不能你原生汇编要放rax它放到rcx那就乱套了。 还有一种情况是 这个值会被立马消耗,那么这个值可能会被存到一块临时区域,然后立刻使用掉,这就不能还原成汇编了。比如mov rax,0x123.  mov rcx ,rax.    其中rax 可能会被替换成任意值(比如  rsp+xx  )。 你最后用llvm一优化    就成了  mov  rcx,0x123.    还有一种情况,你的代码本来是 A还有B 两行汇编。  拆分成了   A1 A2 A3   B1  B2   这五个handle  如果顺序排列,你肯定知道 前三个handle 就是标准的 push  或者 mov ,后面两个handle就是其他的 xx汇编。  但是vmp 似乎会判断  如果b1 和A3 如果调转顺序不影响实际逻辑  就给你调转了。      变成了   A1  A2  B1  A3  B2  .  这样你看着十分头大。 然后你用llvm一优化  汇编又不是真实汇编了。
2026-9-23 10:10
0
雪    币: 556
活跃值: (1212)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16 楼
卑鄙兔 现在记忆力差,两周没看了忘的差不多了,你看看这个pop的寄存器最后是归谁了,用我的工具应该挺容易追的。首先他这个逻辑上必须和你原生汇编一致 不能你原生汇编要放rax它放到rcx那就乱套了。 还有一 ...
指令体量小的时候确实可以很好追,这个最后的pop,只能从VMExit或者VMEntry这种能提供Guest寄存器和虚拟寄存器映射关系的地方反向追踪。但是一旦体量大起来后,lowering 的时候就需要自己分配物理寄存器了,语义可能是一致的但是汇编不一致,这其实无伤大雅。
感觉最难搞的就是,带虚拟机跳转的情况下,这种情况下可能会导致VM切换,导致寄存器轮转,分析就很头大了。
2026-9-23 15:34
1
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17 楼
111
2026-9-26 21:46
0
雪    币: 723
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
18 楼
666
2026-9-27 16:45
0
雪    币: 48
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
19 楼
谢谢楼主分享
2026-9-28 13:09
0
雪    币: 3580
活跃值: (7989)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
20 楼
牛逼
2026-10-2 08:28
0
雪    币: 28
活跃值: (1480)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21 楼
66666666
2026-10-2 11:03
0
雪    币: 200
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
22 楼
666
6天前
0
雪    币: 40
活跃值: (475)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
23 楼
sss
6天前
0
雪    币: 1
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
24 楼
666
3天前
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
25 楼
ssss
2天前
0
游客
登录 | 注册 方可回帖
返回