代码保护软件VMP逆向分析虚拟机指令:初步认识与环境搭建

转帖|使用教程|编辑:杨鹏连|2021-06-15 11:19:45.757|阅读 49 次

概述:​看了网上大神们写了好多的vmp 虚拟代码的分析 ,但是在对实在项目时,插件总是提示不对或者未知版本,一直对vm代码的还原有质疑,于是就萌发了具体分析这个vm代码是怎么回事,若有错误,欢迎指出,能力有限只能分析皮毛,只谈vm的代码。

# 31款JAVA开发必备控件和工具 # 企业数字化建设合规无风险[专题]

VMProtect是一种很可靠的工具,可以保护应用程序代码免受分析和破解,但只有在应用程序内保护机制正确构建且没有可能破坏整个保护的严重错误的情况下,才能实现最好的效果。

VMProtect通过在具有非标准体系结构的虚拟机上执行代码来保护代码,这将使分析和破解软件变得十分困难。除此之外,VMProtect还可以生成和验证序列号,限制免费升级等等。

下载VMProtect最新试用版

VMProtect正版授权在线订购享受最低价,仅售801元起!还不赶紧加入你的订购清单?>>更多详情可点击咨询购买

VMP3逆向分析虚拟机指令

分析环境:

windows 10 + OD + IDA7.2 + Win7x32vmware + vmp3.3.1 pro

一、初步认识与环境搭建

看了网上大神们写了好多的vmp 虚拟代码的分析 ,但是在对实在项目时,插件总是提示不对或者未知版本,一直对vm代码的还原有质疑,于是就萌发了具体分析这个vm代码是怎么回事,若有错误,欢迎指出,能力有限只能分析皮毛,只谈vm的代码。首先我们写一下一个简单的demo,主要代码如下,然后输出eax的值,我是用win32asm环境写的,其他部分我就不写出来了,就是常规的框架,这里主要是把下面这4句汇编vm然后分析虚拟机是怎么处理的,如果你没有masm32汇编环境你也可以用vs内联汇编代替:

mov eax, 1111H
mov eax, 3333H
add eax, 2222H
sub eax, 1010H
然后我们在看看OD上是怎么显示的

但是在汇编上是怎么加入这个vm标志的呢我是这样处理的 首先他主要就是加这个jmp xxxx和vmp start等这样的汇编和字符串是吧 但是在汇编层面上我们家这个字符串他就编译不了 我是吧他们都用NOP代替 数数是几个字节 然后写几个NOP 然后编译生成exe后 在用16进制编辑器打开他 修改就可以了。

EB 10 56 4D 50 72 6F 74 65 63 74 20 62 65 67 69 6E 00 vmpbegin
EB 0E 56 4D 50 72 6F 74 65 63 74 20 65 6E 64 00 vmpend
然后我们用加一下vmp 只做vm代码操作

然后其他无关vm代码的我们就关闭了


OK 生成 我们打开OD对比一下加壳前和加壳后的代码样子

很明显左边被vm了 ,代码很乱是吧 右边的看着很舒服

我们在用IDA打开看看

图也是没逻辑 不过看到 push 和call 的组合 与jmp reg 如果之前我们分析过或看过分析vmp的文章的话

这不就是vm的入口吗 进入vm虚拟机的入口 进入sub_42FA52函数 又是很乱的代码


我们手工去除一下这些指令 : [patch_byte(here()+i,0x90) for i in range(3)] 我们用0x90(NOP)这个值去去除 那些无用的指令 然后后面那个range(3)中的3用我们自己的肉眼去看是多少个字节 鼠标移动到我们要去除的指令 python命令这里打上上面的脚本语句 修改这个多少个byte 回车即可

Python>[patch_byte(here()+i,0x90) for i in range(3)]
[True, True, True]
经过我们手工处理后 他大概成下面这个样子 push reg 和 pushf 是环境快照 保存未入虚拟机时的环境
.vmp30:0042FA52 52            push    edx   
.vmp30:0042BF92 9C            pushf
.vmp30:0042BF97 51            push    ecx
.vmp30:0042BFA0 53            push    ebx
.vmp30:0042BFA5 55            push    ebp
.vmp30:0042BFA6 56            push    esi
.vmp30:0042BFA7 50            push    eax
.vmp30:0042BFA8 57            push    edi
.vmp30:0042BFAF B8 00 00 00+  mov     eax, 0
.vmp30:0042BFBA 50            push    eax
.vmp30:0042BFBE 8B 74 24 28   mov     esi, [esp+24h+arg_0] ; 这个应该是bytescode地址
.vmp30:0042BFC2 8D B6 F1 E2+  lea     esi, [esi-2F6C1D0Fh] ; ESI 代表了bytescode地址
.vmp30:0042BFC8 F7 DE         neg     esi
.vmp30:00430A03 D1 CE         ror     esi, 1
.vmp30:00430A05 46            inc     esi
.vmp30:00430A13 0F CE         bswap   esi
.vmp30:00430A1D 03 F0         add     esi, eax
.vmp30:00430A1F 8B EC         mov     ebp, esp              ; ebp 为压环境后esp的值
.vmp30:00430A21 81 EC C0 00+  sub     esp, 0C0h             ; esp下移 0xC0
.vmp30:00430A27 8B DE         mov     ebx, esi              ; 注意这里 esp代表vm_context
.vmp30:00430A29 B9 00 00 00+  mov     ecx, 0
.vmp30:00430A30 2B D9         sub     ebx, ecx
.vmp30:00430A35 8D 3D 35 0A+  lea     edi, loc_430A35       ; 跳转base值
.vmp30:00430A45 8B 0E         mov     ecx, [esi]            ; 获取跳转间隔密文
.vmp30:00430A47 81 C6 04 00+  add     esi, 4
.vmp30:00430A4F 33 CB         xor     ecx, ebx
.vmp30:00439FEC 8D 89 D9 95+  lea     ecx, [ecx-21016A27h]
.vmp30:00439FF9 F7 D1         not     ecx
.vmp30:0043A003 F7 D9         neg     ecx
.vmp30:0043A005 8D 89 71 E2+  lea     ecx, [ecx-5AFB1D8Fh]
.vmp30:00416562 0F C9         bswap   ecx
.vmp30:00416564 33 D9         xor     ebx, ecx
.vmp30:0041656B 03 F9         add     edi, ecx              ; 解密跳转间隔
.vmp30:0045F2B5 57            push    edi                   ; 压栈反弹进入vm指令
.vmp30:0045F2B6 C3            retn
看着没什么复杂的,就是压入寄存器保存未进入虚拟机时的环境状态,然后给虚拟机的栈和寄存器开辟空间,esi指向bytescode 中间那里取了一个4byte值然后指针+4 取的值是密文经过 解密得出正在的值 这个值是要跳转的长度,从哪里跳转相对谁,edi给出了答案 (汇编代码这么乱 而且无用的指令一大堆 时隔多年后 我们才知道这个叫混淆)

那么到这里我们得到了什么信息:
1.未进入虚拟机时,环境状态的压入
2.虚拟机初始化,栈(EBP)、寄存器组(ESP)、跳转base(EDI)、字节码(ESI)、解密因子(EBX)
我给的这个名字名称可能是和别人分析的名字不一样 不过内容是一样的 本质没什么区别

那么这个时候我们就问了,我们怎么知道EBP是虚拟机的栈、ESP是寄存器组(或者说vm_context)和ESI是字节码(Bytescode)呢 当然我们可以看前人分析的结果是吧 但是我们应该说的是一个无到有的过程 而不是直接就说他是了 然后我们在回过头了 假如我们不知道vm中esp是什么 ebp是什么,但是esi 这个应该可以看出来了 他肯定是保存了一串数据的 那么这一串数据是什么 我们暂且不清楚 但是我们看到有个取值 然后解析这个存在 有点像eip 是不 虚拟机是不是就是执行模拟 翻译 你看看这个有没有点对上的意思 然后在看看edi 他明显是赋值一个地址 然后 +解密后的间隔 运行下去

现在我们脑子应该是有一个印象了 这里我先写一个类似OD的界面 看看当然有的我还没给出怎么识别 我们后面会给出 差不多就是这个样子

如果您对该加密/解密软件感兴趣,欢迎加入加密/解密QQ交流群:740060302


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至hey@evget.com

文章转载自:看雪

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
在线咨询
联系我们
TOP
在线客服系统
live chat