用什么办法能对付"禁止在虚拟机使用本软件"代码如下:

qq666 2007-09-26 09:07:20
有一个软件,他禁止了在vmware ,virtual pc 等等虚拟机的使用.只用了判别局部表就知道是否使用虚拟机.代码如下.请问高手们,有什么办法能骗过它等变通的方法吗?在保证不暴破软件的条件.
seg000:004266D7 sldt word ptr [esp+54h]
seg000:004266DC cmp byte ptr [esp+54h], 0 //如果在虚拟机运行的话,这里

的[esp+54h]=40,不是的话就是00
seg000:004266E1 mov ebp, ds:TerminateProcess
seg000:004266E7 jz short loc_42670A
seg000:004266E7
seg000:004266E9 cmp byte ptr [esp+55h], 0 //如果在虚拟机运行的话,这里

的[esp+55h]=60,不是的话就是00
seg000:004266EE jz short loc_42670A
seg000:004266EE
seg000:004266F0 xor edi, edi
seg000:004266F2 push edi
seg000:004266F3 push edi
seg000:004266F4 push offset s_ZST ; "本软件不支持虚拟机!"
seg000:004266F9 call AfxMessageBox(char const *,uint,uint)
...全文
623 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jiessie 2007-10-11
  • 打赏
  • 举报
回复
有2个方法:
1、你HOOK API的方式,把AfxMessageBox这个函数HOOK了,
这个软件运行的时候,就会发现是在虚拟机中,就会调用AfxMessageBox,这时,你就可以直接改esp/eip这些,返回到正常的流程。
2、从上面的代码来看,他是检查 LDTR 中的 段选择字这2个byte中,2个byte都不是0,才表明是虚拟机。你把 GDT中0x6040的地方的8个byte,拷贝到0x6000的地方(如果是null),然后把LDT的段选择字改成 0x6000 ,这样应该就可以了。
但他们的升级版本肯定会判断,只有LDTR中,前2个byte都为0,是不是虚拟机。
大熊猫侯佩 2007-09-26
  • 打赏
  • 举报
回复
一种方法是做一个内存补丁,前提是你必须跟踪到实际脱壳后的指令位置。
qq666 2007-09-26
  • 打赏
  • 举报
回复
脱壳跟踪的.
大熊猫侯佩 2007-09-26
  • 打赏
  • 举报
回复
你上面的内容是动态跟踪得到的?
qq666 2007-09-26
  • 打赏
  • 举报
回复
别人加了壳.脱壳改了后.不正常.所以暴破不了
大熊猫侯佩 2007-09-26
  • 打赏
  • 举报
回复
将判断式逻辑改写。
qq666 2007-09-26
  • 打赏
  • 举报
回复
是的,我也是怎么想的.不过对我来说有一定的难度..试试看.

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧