提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
转帖|使用教程|编辑:胡涛|2022-04-12 14:44:52.467|阅读 230 次
概述:本文主要向您介绍VMProtect虚拟机保护分析入门,欢迎查阅!
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
虚拟机入口
00952380 | 68 95514200 | push 425195 | 00952385 | E8 FC220100 | call testvmp.vmp.964686 |
经过对后面的流程进行分析,得知这里的425195在虚拟机跳转衔接上起到了关键的作用。VMP为了防止逆向分析的一个重要的干扰就是乱序,运行几行汇编就各种jump,VMP使用的jump方法是JXX指令和CALL,RET来进行。
如下代码使用了push和ret组合实现跳转:
00963A35 | FF7424 34 | push dword ptr ss:[esp+34] | 00963A39 | C2 3800 | ret 38 |
上面的这段代码,假如不知道[esp+34]的值,不知道会跳转到哪里。所以静态分析工具例如ida是就无法分析。然而425195这个值充当了一个Key的作用。VMP巧妙的运用这个值来进行实时计算要跳转的地方。
单步进入就会看到虚拟机初始化的代码。
初始化充斥着许多垃圾指令,注意看注释。
push 45FFB40D mov byte ptr ss:[esp],C0 call testvmp.vmp.962149 mov dword ptr ss:[esp+4],edx mov byte ptr ss:[esp],22 pushfd mov dword ptr ss:[esp+4],edi jmp testvmp.vmp.9633F4 mov word ptr ss:[esp],cx mov dword ptr ss:[esp],eax pushad jmp testvmp.vmp.9641DB pushfd mov dword ptr ss:[esp+20],esi call <testvmp.vmp.sub_963725> mov dword ptr ss:[esp+20],ebx mov dword ptr ss:[esp+8],5870296F mov dword ptr ss:[esp+1C],eax pushfd push esi 保存寄存器ESI pushfd pop dword ptr ss:[esp+20] push A9CEAE65 pushad push dword ptr ss:[esp+4] mov byte ptr ss:[esp],49 lea esp,dword ptr ss:[esp+48] 弹栈 jmp testvmp.vmp.9636DA bt ax,3 bswap di cmc and dh,dh push ebp 保存寄存器EBP xadd si,di movsx bp,al not edi push ecx 保存寄存器ECX ror esi,5 clc push dword ptr ds:[962430] inc si push 540000 这个值与之前PUSH来的KEY共同计算指令handle下一跳地址 jmp testvmp.vmp.963343 test cl,F7 rcr si,cl pushad mov esi,dword ptr ss:[esp+50] sbb ebp,23A52066 ror di,1 lea ebp,dword ptr ss:[esp+20] sar di,cl bsr dx,bp inc edi sub esp,A0 分配栈空间 shl dh,6 ror dx,cl dec edi mov al,dl mov edi,esp VM寄存器指针 push ebx call testvmp.vmp.964391 bswap edx add esi,dword ptr ss:[ebp] 重定位 add esp,8
经过我对刚才加壳的代码进行多次单步执行分析,得到被加虚拟机的代码运行流程如下。
EBP为虚拟机自己的栈顶地址类似x86的esp
EDI为虚拟机寄存器基地址
下面对各个关键点通过汇编和数据进行详细分析
代码流是通过ESI来进行的
ESI先来自那个Push进来的Key
0096334A | 8B7424 50 | mov esi,dword ptr ss:[esp+50] | var_4 进虚拟机push的Key
再加那个540000的偏移
00964393 | 0375 00 | add esi,dword ptr ss:[ebp] | esi+= 540000
本次VMP版本ESI是每次累减而不是累加
ESI操作完现在是00965195
每次取的是[esi-1],也就是esi所示的前一个字节
0096439B | 8A46 FF | mov al,byte ptr ds:[esi-1] |
al现在就指向这里
每次算完edx(下一跳地址)之后esi还会-1
00964785 | 83EE 01 | sub esi,1 | esi:sub_9650C6+CF
实际上ESI指向的2C是寄存器索引
00964241 | 891407 | mov dword ptr ds:[edi+eax],edx | Handle eax是root esi指的那个字节
2C/4 = B 所以本次VMP指令就是
VMPop Reg11
每次要跳到哪个HANDLE取决于这行汇编代码
009643B0 | 8B1485 AD3C9600 | mov edx,dword ptr ds:[eax*4+<sub_963cad>] | 这里的EDX决定着后面ret 38 ret到 [963CAD + Index * 4]+540000-1 edx-1+540000
可以看到这里有一个表,那就是963CAD,
这个表里的值是一个偏移。要想跳到实际的HANDLE要把这个值+540000然后再-1
比如,要跳到这个表索引为0的handle就是要跳到[963CAD+0 * 4]+540000-1 = 004246D4+540000-1=009646d3,正好是PopReeg4 handle
乍看这一个表,表里有重复的值,不知道是什么意思。
这个 index刚好就是之前的esi的值。也就是这里
那么说明esi指令的这个地方,有两个用处?
这看起来很诡异,因为esi所指向的这个字节他即充当了操作数寄存器的索引,又充当了本条指令handle的索引。
除非是这样:先把流程弄好,再按排好的流程再填充这个963CAD表。
比如说,本条指定是
VMPop Reg12
则在ESI指向的那块内存里写入12 * 4 = 0x30,然后再在esi指向的内存里写入0x30,然后再在963CAD这个表里的0x30索引的位置写入VMPop 的HANDLE。
第二条指令的时候ESI指向这里
所以索引是0x46
这个指令跳到的handle会读取[esi-4]的一个DWORD。
读的位置也就是这里:
转换成DWORD就是DA94102D,后面又用bswap指令转成了2D1094DA,所以这个立即数实际上是2D1094DA
执行完又将esi前移4字节
由于这个handel有如下代码
0096206F | 83ED 04 | sub ebp,4 | 00963B9E | 8945 00 | mov dword ptr ss:[ebp],eax | eax是立即数
所以说这个是将立即数压栈的handle
所以这个加法的操作是[ebp+4]=[ebp]+[ebp+4]
VMPop Reg11
VMPushDWORD 2D1094DA
VMAdd [EBP+4]=[EBP]+[EBP+4]
VMPop Reg5
VMPop Reg6
VMPop Reg14
VMPop Reg2
VMPop Reg7
VMPop Reg5
VMPop Reg4
VMPop Reg0
VMPop Reg3
VMPop Reg10
VMPop Reg15
VMPop Reg9
VMPop Reg0
VMPush WORD 0x100
VMPUsh WORD 0x1000
VMPop Reg9
VMPop Reg8
VMPush Reg15
VMPhsh Reg9
VMPush Reg8
VmAdd
VMPopReg R13
VMPopReg R12
VMPopReg R10
VmPush Reg3
VmPUsh Reg0
VMPush Reg9
VMPush Reg12
VMPush Reg13
VmPUsh Reg2
VMPush Reg14
VmPUsh Reg3
VmPUsh Reg9
下一步就是要写脚本对更复杂的代码进行自动解析。</sub_963cad></testvmp.vmp.sub_963725>
注:本文转自博客园/ 作者:张东升 / 如涉及侵权,请联系删除!
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn
文章转载自:本文探讨 SQL Server 中 NULL 和空值之间的区别,并讨论如何有效地处理它们。
Unity 是一款功能极其丰富的游戏引擎,允许开发人员将各种媒体集成到他们的项目中。但是,它缺少最令人兴奋的功能之一 - 将 Web 内容(例如 HTML、CSS 和 JavaScript)直接渲染到 3D 场景中的纹理上的能力。在本文中,我们将介绍如何使用 DotNetBrowser 在 Unity3D 中将 Web 内容渲染为纹理。
DevExpress v24.2帮助文档正式发布上线了,请按版本按需下载~
本教程将向您展示如何用MyEclipse构建一个Web项目,欢迎下载最新版IDE体验!
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@pclwef.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢