首页
社区
课程
招聘
[原创]谈谈我对VMProtect代码保护”通解”的一点看法
发表于: 2026-5-9 12:21 7477

[原创]谈谈我对VMProtect代码保护”通解”的一点看法

2026-5-9 12:21
7477

偶然一阵袭来偶然论坛看到两篇关于VMProtect技术文章让我想起了多年以前我也曾花了一段时间研究过VMProtect写了不少相关代码于是翻起许久未曾改过相关代码仓库甚是感慨有了这篇文章

这篇文章不会有过于详细技术分享并非标题党文题通解就是对于VMProtect甚至一系列包括Themida在内许多代码保护方案通用解法之所以引号以为所谓通用解法只是解题思路基本相同

寻求通解那么我们需要说下这类代码保护基本思路架构这里简化

VMProtect这种代码虚拟机虚拟机Themida虚拟机工作逻辑当前线程空间储存代码执行Context上下文主要就是储存保护代码执行所需要寄存器因此VMProtectContext最终代码执行时候虚拟机代码本身数据混搭穿插中间由于VMProtect代码保护时候就要追踪空间变动因此Context分布还是随机动态调整进一步增加分析难度

VMProtect代码保护采取原始代码汇编编译转换一套定义的opcode然后每个opcode一个或者多个代码可以不同但是逻辑功能必定相同)opcode执行代码片段就是所谓的”handler”,这些handler开发时候需要针对opcode进行针对性设计所以变化演进相对很慢这就是VMProtect这类代码虚拟机比较弱点代码转换成自己的opcode序列以后形成自己一套汇编代码然后这段汇编代码还可以当成普通汇编那样处理要么继续生成另外一套opcode套娃要么堆opcode进行等价替换变形插花思路都是代码量执行效率当中平衡opcode编码完毕以后就有一套对应的opcode处理代码此时将ocpode处理代码变形插花然后联合框架代码形成程序

了解思路以后我们可以设计我们通解思路这里给出一个针对实现理解代码最终干预代码执行流程通解做到完整代码还原给出大体思路注意对于绕过调试这种代码保护无关的方法本文涉及尽管r3也有通解但是这些方法公开很快针对

首先针对于比较简单流程干预思路主要以下几个步骤

拿到代码执行记录

简化代码

染色还原context偏移

匹配Hanlder特征还原opcode代码执行记录

简化opcode

opcode代码调试确定干预意图

接管代码执行进行干预

编译opcode汇编实现代码还原

下面步骤介绍

1.拿到代码执行记录

对于很多学习VMProtect来说其实这一步并不顺畅因为公开工具太少,x64dbg自带追踪太慢VMProtect这种Handler代码越来越大越多情况代码执行记录方法节省很多时间个人首推JIT转译代码虚拟机也就是自己使用方法虚拟机代码入口接管执行流程然后代码放到一个代码虚拟机执行这个虚拟机的opcode就是原始代码,hander就是转译后的代码本身寄存器存放位置实际寄存器位置以及一个空间用于存放虚拟机执行占用的1-2寄存器这种方法好处非常多实现简单不需要编写handler,不需要定义opcode)效率够高支持sm代码自修该由于是jit支持动态条件干预比如对于循环执行检测直接跳过重复代码记录

拿到代码记录以后我们就会有一份代码进入虚拟机执行完毕退出虚拟机完整代码执行记录类似

执行记录包括常用寄存器,eflags代码地址以及具体执行代码二进制数据不少情况下拿到完整代码执行记录已经能够实现软件破解效果只需要控制入口数据比如虚拟机快照功能授权授权代码执行记录通过文本对比工具一眼就能看到具体判断逻辑从而定位准确代码干预然后这个反转控制流实现破解根本无需分析一行汇编代码有了这些数据来到了第二

 

1.简化代码

拿到代码执行记录以后这个记录可能是海量的超多重复执行代码而且经过高度插花混淆变形替换代码直接分析不可能分析打死都不这样分析因此我们想办法简化代码由于代码执行记录自上而下带有寄存器因此通用简化办法这里核心优化手段就是等价替换没有什么复杂技术但是实现方法各有办法使用方法是自己写了一个轻量汇编匹配替换语言大概下面这个样子

 


这里当时代码一些用法注释大概就能明白意思

 

 

 

有了通用语义以后我们可以不断积累各种等价替换花型然后代码执行等价替换无论VMProtect经过多少混淆只要等价花型积累一定数量最终都能大大简化代码况且我们这里简化代码目的并非是要代码能够清晰可读而是只要简化能够匹配出hander特征够了这样我们知道代码对应的hander哪个至于代码如何巧妙执行我们其实并不关心比如代码简化下面情况差不多

 

 

00007FF7825429E4 JMP        R9                 

00007FF7826B37CD MOVZX      EDI, BYTE [RBP-0x1]

00007FF7826B37D2 MOV        R8D, 0x1703c7ae    

00007FF7826B37D8 LEA        RSI, [R8*4+0x652b39ae]

00007FF7826B37E0 XOR        DIL, R11B          

00007FF7826B37E3 LEA        RAX, [RSI+RSI*4-0x12666cea]

00007FF7826B37EB XCHG       RSI, RAX           

00007FF7826B37ED ADD        AX, 0x602          

00007FF7826B37F1 ROR        DIL, 0x1           

00007FF7826B37F4 DEC        DIL                

00007FF7826B37F7 ADD        RSI, 0xcbb2bb0e    

00007FF7826B37FE LEA        R8, [R8*4-0x13d9137e]

00007FF7826B3806 XOR        DIL, 0x10          

00007FF7826B380A BTS        AX, AX             

00007FF7826B380E MOV        ECX, ESI           

00007FF7826B3810 SBB        DIL, 0x90          

00007FF7826B3814 NOT        R8B                

00007FF7826B3817 BTS        R8W, 0x18          

00007FF7826B381D MOVZX      R10D, AL           

00007FF7826B3821 XOR        R11B, DIL          

00007FF7826B3824 ROR        AL, CL             

00007FF7826B3826 OR         CX, CX             

00007FF7826B3829 BSWAP      R8                 

00007FF7826B382C ADC        RDI, RSP           

00007FF7826B382F DEC        ECX                


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

最后于 2026-5-9 12:26 被SpringB编辑 ,原因:
收藏
免费 5
打赏
分享
最新回复 (1)
雪    币: 1808
活跃值: (2739)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
现在比较流行多handler合并,导致基于规则的handler匹配极为复杂通用性降低,但是有了Claude code 这个过程应该可以全自动,有空试试
2026-5-12 14:22
1
游客
登录 | 注册 方可回帖
返回