提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
转帖|使用教程|编辑:杨鹏连|2021-06-24 10:14:58.927|阅读 543 次
概述:看了网上大神们写了好多的vmp 虚拟代码的分析 ,但是在对实在项目时,插件总是提示不对或者未知版本,一直对vm代码的还原有质疑,于是就萌发了具体分析这个vm代码是怎么回事,若有错误,欢迎指出,能力有限只能分析皮毛,只谈vm的代码。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
VMProtect是一种很可靠的工具,可以保护应用程序代码免受分析和破解,但只有在应用程序内保护机制正确构建且没有可能破坏整个保护的严重错误的情况下,才能实现最好的效果。
VMProtect通过在具有非标准体系结构的虚拟机上执行代码来保护代码,这将使分析和破解软件变得十分困难。除此之外,VMProtect还可以生成和验证序列号,限制免费升级等等。
VMProtect正版授权在线订购享受最低价,仅售801元起!还不赶紧加入你的订购清单?>>更多详情可点击咨询购买
相关链接:
代码保护软件VMP逆向分析虚拟机指令:初步认识与环境搭建(一)
代码保护软件VMP逆向分析虚拟机指令:VMP代码的提取(二)
四、分析那4条汇编被VM的VM指令
其他无关的我就不贴上来了,我直接贴上分析出的VM指令,怎么分析出的,和上面的分析VM指令同理
\---------------------------------------------------------------- >>>>>>>>>>>>>>>>>>>>>>>>vm的汇编解析
VM_PushImm32 0x00001111
VM_PopReg32 vm_context->0x1C 0x00001111
VM_PushImm32 0x00003333
VM_PopReg32 vm_context->0x00 0x00003333
VM_PushImm32 0x00002222 执行下面的VM_Add后 | dwResult 0x00005555
VM_PushReg32 vm_context->0x00 0x00003333 | eflags 0x00000206
VM_Add
VM_PopReg32 vm_context->0x1C 0x00000206 EFLAGS
VM_PopReg32 vm_context->0x1C 0x00005555
VM_PushImm32 0x00001010
VM_PushReg32 vm_context->0x1C 0x00005555 dwResult 上一次Add的结果
VM_PushReg32 vm_context->0x1C 0x00005555
VM_Nand 执行后 [ESP] = EFLAGS = 0x286 [ESP+4]=0xFFFFAAAA
VM_PopReg32 vm_context->0x00 0x286 弹出这个后 现在栈上应该是[ESP]=0xFFFFAAAA [ESP+4]=0x0x00001010
VM_Add 执行这个这里后 [ESP] = EFLAGS = 0x282 [ESP+4]=0xFFFFBABA
VM_PopReg32 vm_context->0x0C 0x282 eflags
VM_PushReg32 vm_esp 现在[ESP] = ESP+4 即保存这个地址 这个地址对应的值是 0xFFFFBABA 没问题吧
VM_SSReadMemSS 把栈顶的值当mem读 值返回到自身 [ESP]=[[ESP]] = [ESP + 4] = 0xFFFFBABA
VM_Nand 还没运行这个指令时[ESP]=0xFFFFBABA [ESP+4]=0xFFFFBABA
VM_PopReg32 vm_context->0x20 0x202 eflags
VM_PopReg32 vm_context->0x10 0x00004545 到这里 可以说这4句汇编已经运行完毕了
VM_PushReg32 vm_context->0x0C 0282 但是还要处理这个符号寄存器的值应该是多少
VM_PushImm32 0x815 因为我们是用其他方式去解析这个解法 是吧 那么每一步的eflags的变化
VM_Nor dwResult = 0xFFFFFFFF
VM_PopReg32 vm_context->0x00 0x286 eflags 那么这些每一步eflags的变化怎么转化为减法时产生的eflags一致呢
VM_PushReg32 vm_esp
VM_SSReadMemSS 看到很多vm指令可以合为一个我们认识的指令是吧 比如这里的 压esp 直接读[[esp]]值反回[ESP]
VM_Nand 其实就是 VM_Nand(0xFFFFFFFF,0xFFFFFFFF) -> dwResult = 0x00000000
VM_PopReg32 vm_context->0x1C 0x246 eflags
VM_PushReg32 vm_context->0x20 0x202
VM_PushReg32 vm_context->0x20 0x202
VM_Nor ~0x202 & ~0x202 = 0xfffffdfd
VM_PopReg32 vm_context->0x18 0x282
VM_PushImm32 0x815 ---------- 这里应该是提取 OF、ZF 标志 -------------
VM_Nand ----------------------------------------------------
VM_PopReg32 vm_context->0x1C eflags 这里说的是 VM_Nand(0x282,0x815)的eflags
VM_Add 0x202 dwResult
VM_PopReg32 vm_context->0x1C eflags 这里也是一样 不管是VM_Add还是VM_Nor等 都是读[ESP]和[ESP+4]值运算
VM_PopReg32 vm_context->0x00 0x202 接上句 结果放[ESP+4] 影响的符号(或者说运算后符号寄存器)放[ESP]
>>>>>>>>>>>>>>>>>vm的代码解析完毕
然后我们总结简化一下是这样:
VM_Add (0x00003333,0x00002222) 0x00005555 VM_Nand(0x00005555,0x00005555) 0xFFFFAAAA VM_Add (0xFFFFAAAA,0x00001010) 0xFFFFBABA VM_Nand(0xFFFFBABA,0xFFFFBABA) 0x00004545哦豁!有点东西了是不,与非门。vmp中大名鼎鼎的与非门,传说中的化简为繁............
我们把上面的4句vm指令翻译成数学表达 /- A = 0x3333 + 0x2222 | A = ~A 因为这里VM_Nand 中and 两边的值是一样的我就不写成~A & ~A 了 | B = A + 0x1010 - B = ~B 我们知道 int32的X 的 ~X = 0xFFFFFFFF - X 是吧 所以我们在化解 / A = ~0x5555 --> B = 0xFFFFFFFF - (0xFFFFFFFF - 0x5555 + 0x1010) ---> B=0x5555-0x1010 = 0x4545 \ B = ~(A + 0x1010) 这个是数学上的东西是吧 当然了 这些规律我们都是可以总结的我们简单总结一下这个与非门变换出的几种算术推导
1.NOT(A): NAND(A,A) 2.AND(A,B): NAND(NAND(A,A),NAND(B,B)) 3.OR(A,B): NAND(NAND(A,B),NAND(A,B)) 4.XOR(A,B): NAND(NAND(NAND(A,A),NAND(B,B)),NAND(A,B)) 5.SUB(A,B): NAND(NAND(A,A)+B) 6.AND(A,B): NAND(NOR(A,B),NOR(A,B)) 注意这个推导很明显,我们上面的 0x5555-0x1010用到了 推导5
VM_Add (0x00003333,0x00002222) 0x00005555 eflags 0x206 丢弃 VM_Nand(0x00005555,0x00005555) 0xFFFFAAAA eflags 0x286 vm_context->0x00 VM_Add (0xFFFFAAAA,0x00001010) 0xFFFFBABA eflags 0x282 vm_context->0x0c --有效的eflags VM_Nand(0xFFFFBABA,0xFFFFBABA) 0x00004545 eflags 0x202 vm_context->0x20 --有效的eflags 看到上面 SUB(A,B)-> NAND(NAND(A,A)+B) 而这里有的代码是先加0x2222 在减0x1010 所以我们 加0x2222得到的符号eflags我们丢弃了 看到下面可以看出是用了之后的进行处理的 也就是说只要模拟出减时的符号变化即可 (我们知道加和减的符号影响是一样的 在计算机中 加减有什么区别呢 是吧) imm32 0x815 -> SF、AF、PF、CF ---------------------------------------------------------- VM_Nor (0x282, 0x815) -> dwResult = 0xffffffff---->| VM_Nand(0xffffffff, 0xffffffff) -> dwResult = 0x00000000-----|- 0x282 & 0x815 VM_Nor (0x202, 0x202) -> dwResult = 0xfffffdfd---->| VM_Nand(0xfffffdfd, 0x815) -> dwResult = 0x202--------->|- 0x202 & 0xffff7ea - > (0x202 & ~0x815) VM_Add (0x00000000, 0x202) -> dwResult = 0x202----------|- (0x282 & 0x815) + (0x202 & 0xffff7ea)所以我们只是对两个eflags的变换就完成了真正的sub影响的符号位。我们知道sub影响的标志位为: 0F SF ZF AF PF CF
-> 公式应该是 : (0x282 & 0x815) + (0x202 & 0xffff7ea)
注意0x815指的是 SF、AF、PF、CF , 而0xffff7ea正好是0x815的反
-> 所以应该是第一个eflagsA 取 OF、AF、PF、CF 。 第二个eflagsB取其他值,
当然这里有意义的就是AF和ZF。
1.eflagsA = 0x282 是 VM_Add (0xFFFFAAAA,0x00001010)来的, 而我们知道add影响的标志位和sub是一样的,说明这一步后
其实我们就得到了0F SF ZF AF PF CF那么说明我们是不是只要这个eflagsA就可以了呢,但是你别忘了了后面还有个VM_Nand
2.eflagsB = 0x202 是紧跟着的VM_Nand来的,而我们知道and影响的标志位为: 清空OF、CF,设置SF、ZF和PF,AF不影响
我们回过头来分析
eflagsA -> 0x282 & 0x815 提取的是 OF、AF、PF、CF
eflagsB -> 0x202 & ~0x815 提取的是 SF、ZF
当然标志位的值不只是这些,但是我们只关心目前的sub影响的标志位,其他的我们先不考虑,其他我不知道是什么用的,没深入分析。
这样最后 相加(加 或者 或 都可以) 就得到了 0F SF ZF AF PF CF 6个标志位
1.疑问 : 为什么对于eflagsB我们只是提取了SF、ZF 没有提取OF、CF。首先SUB的计算其实在ADD中就做完了,关于标志的部分(与结果无关只与过程),
所以eflagsB VM_Nand生成的 and影响清空OF、CF,我们不提eflagsB中的OF、CF做结果是因为OF、CF是计算的过程中影响的符号,而用了SF、ZF是因
为SF是结果符号标志(即负数或者正数),ZF也是结果符号标志(结果是0就激活ZF)。所以用的最后的eflagsB的影响的这两个标志位,也是VM_Nand后才得
到最后的结果。
2.那在VM_Nand中我们要考虑Not操作影响的符号标志位吗? 不需要,因为他不影响标志位
如果您对该加密/解密软件感兴趣,欢迎加入vmpQQ交流群:740060302
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@capbkgr.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@capbkgr.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢