-
-
[原创]VMProtect 3.8.1 混淆策略大揭秘
-
-
[原创]VMProtect 3.8.1 混淆策略大揭秘
重要提示:下面是本人制作的VMProtect虚拟机逆向课程,点击下面的链接进入学习
VMProtect虚拟机逆向入门
VMProtect分析与调试器插件开发
自从VMProtect 3.5.1 被爆出源码泄露开始直到最后的那一两个最重要的源文件也被公之于众之后,VMProtect 3.5.1算是在所有的逆向开发人员面前裸奔了,有意思的是VMProtect并没有就此一蹶不振,反而绝地反击,他的实力和之前相比反而变得更强了,这是怎么回事呢,这里面我们八卦一下,扒一扒他的版本,源码完全流出直到论坛上有大神分享编译的文章这时候是 2023年12月份左右,我们记住这个时间点,当我们全民都拥有源码的时候,其实VMProtect早已脱胎换骨了,我们来到他的官网 320K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6$3L8i4m8K6L8$3k6@1i4K6u0W2j5$3!0E0i4K6u0r3L8X3g2%4M7#2)9J5c8Y4m8S2k6$3g2Q4x3V1j5K6i4K6u0r3可以找到他的更新日志
我们可以看到这里增加好的选项,这些选项可不是简简单单的混淆,每一个拿出来都是王炸,毫不夸张的说如果3.8版本之后的VMProtect是一位浑身都是的肌肉的猛男,那么3.8版本之前的VMProtect只能算是一个娇羞的小萝莉,我们可以看到3.8更新的时间点是2023年初,这里我们大家可以讨论一下VMProtect3.8的大更新是不是因为源码泄露而做出的紧急补救手段,因为VMProtect3.8发布的时间恰巧也是源码泄露的那段时间,当时我第一次得知VMProtect源码泄露的时候,还以为VMProtect就此跌落神坛,从此一蹶不振,没想到他居然放出大招,这次的大更新可以将其称之为新版VMProtect,他不是像牙膏厂一样挤药膏似的更新,而是夸张到等同于重构了整个源码,增加了非常多的变态混淆策略,在很多地方都进行了非常大的改动。那么接下来我们将逐一分析他的逆天改动
第1点 全指令变形,但凡能够使用替代指令几乎都使用了,目前只有异或解密指令没有进行混淆其他所有指令都或多或少有一两种变体,大家也可以联想到他们变种的样子,这里我举几个例子
伪代码解密
伪代码读取指令的五种可能形式
计算Handler地址
第2点 内存地址常数加密,一条包含内存操作数的指令,那么他的内存操作数通常有几种情况只有内存地址常数 例如 mov eax,dword ptr ss:[0x123]只有基址寄存器 mov dword ptr ss:[esp], 0x123基址寄存器+索引寄存器+内存地址常数 mov dword ptr ss:[esp+edi+0x123], 0x123如果内存地址常数0也算进去,那么一条包含内存操作数的指令,他的内存操作数就都含有内存地址常数,那么这个内存地址常数就可以被用来加密了
写到这里有些人可能觉得这样子有什么意义呢,除了让代码变得更加复杂难看点,其他还有什么作用呢?这个问题,问的好,作者可不是这么想的,他的每一个地方的改动都是根据编写分析插件的思路来的,我猜测原作者团队里面应该有专门开发分析插件的部门,他的每一次更新都是会收集所有能够找到的分析资料进行修复,那么这些改动对于我们编写分析插件来说影响是相当大的,3.8之前还能使用指令文本特征进行匹配从而来识别Handler的方法这里已经完全失效了
第3点 Handler的变形,这里面的Handler变形只存在于包含计算虚拟寄存器地址的Handler
handler PushVR32
变形后
第4点 Handler的一级融合,这里面Handler与Handler之间本来是上一条Handler执行完在结尾跳到下一条handelr去执行,那么每条Handler中都有一个专门计算下一条handelr地址的代码块,这个代码块都有读取伪代码的操作,经过融合后,下一条用来计算handelr地址的伪代码被丢弃了,同时计算下一条handelr地址的代码块也没有了,那么两条Handler使用跳转指令或者直接连接变成一条Handler,那么后面的Handler同样可以这样子接上去,有点像人体蜈蚣
第5点 Handler的二级融合,在一级融合的基础上还有二级融合,比如执行模拟加法运算的Handler组合,首先第一条Handler是从伪代码读取常数作为加数,第二条Handler是从伪代码读取常数作为被加数,第三条Handler是执行加法运算,以前的handler逻辑是第一条和第二条handler,从伪代码读取到加数和被加数都是放到虚拟栈中去,然后第三条加法handler从虚拟栈中获取两个加数和被加数再执行ADD指令,在这里他把值放到虚拟栈中的指令给丢弃了,直接绑定了对应的寄存器,例如第一条Handler读取的值存放到eax,第二条Handler读取的值存放到ecx,第三条handelr直接执行add eax,ecx,算出的结果在eax,同样可以不放到虚拟栈中,参与第四条handler的运算
传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 1天前
被阿强编辑
,原因: