64位windows VMware检测

2023-12-19

我正在尝试开发一个应用程序来检测程序是否在虚拟机内运行。

对于32位Windows,已经有方法在以下链接中解释:http://www.codeproject.com/Articles/9823/Detect-if-your-program-is-running-inside-a-Virtual http://www.codeproject.com/Articles/9823/Detect-if-your-program-is-running-inside-a-Virtual

我正在尝试在 64 位 Windows 操作系统中调整有关 Virtual PC 和 VMware 检测的代码。对于 VMware,代码可以在 Windows XP 64 位操作系统中成功检测。但是当我在本机系统(Windows 7 64位操作系统)中运行该程序时,该程序崩溃了。

我将代码放入 .asm 文件中,并使用 ml64.exe 文件定义自定义构建步骤。 64位Windows的asm代码是:

IsInsideVM proc

      push   rdx
      push   rcx
      push   rbx

      mov    rax, 'VMXh'
      mov    rbx, 0     ; any value but not the MAGIC VALUE
      mov    rcx, 10    ; get VMWare version
      mov    rdx, 'VX'  ; port number

      in     rax, dx    ; read port
                        ; on return EAX returns the VERSION
      cmp    rbx, 'VMXh'; is it a reply from VMWare?
      setz   al         ; set return value
      movzx rax,al

      pop    rbx
      pop    rcx
      pop    rdx

      ret
IsInsideVM endp

我在 cpp 文件中将此部分称为:

__try
{
returnValue = IsInsideVM();
}
__except(1)
{
    returnValue = false;
}

提前致谢。


The old red pill from Joanna http://en.wikipedia.org/wiki/Joanna_Rutkowska可能有效:invalidthings.org 博客的随机备份页面 http://www.ouah.org/Red_%20Pill.html:

吞下红色药丸或多或少相当于以下代码(在矩阵中返回非零):

 int swallow_redpill () {
   unsigned char m[2+4], rpill[] = "\x0f\x01\x0d\x00\x00\x00\x00\xc3";
   *((unsigned*)&rpill[3]) = (unsigned)m;
   ((void(*)())&rpill)();
   return (m[5]>0xd0) ? 1 : 0;
 }

这段代码的核心实际上是 SIDT 指令(编码为 0F010D[addr]),它将中断描述符表寄存器(ID​​TR)的内容存储在目标操作数中,目标操作数实际上是一个内存位置。 SIDT指令的特殊和有趣之处在于,它可以在非特权模式(ring3)下执行,但它返回敏感寄存器的内容,由操作系统内部使用。

由于只有一个 IDTR 寄存器,但至少有两个操作系统同时运行(即主机和客户操作系统),因此 VMM 需要将客户的 IDTR 重新定位到安全的地方,以免与主机的 IDTR 发生冲突。不幸的是,VMM 无法知道来宾操作系统中运行的进程是否(以及何时)执行 SIDT 指令,因为它没有特权(并且不会生成异常)。这样进程就得到了IDT表的重定位地址。据观察,在 VMWare 上,IDT 的重定位地址位于地址 0xffXXXXXX,而在 Virtual PC 上则为 0xe8XXXXXX。这是在 VMWare Workstation 4 和 Virtual PC 2004 上进行测试的,两者都运行在 Windows XP 主机操作系统上。

注意:我自己还没有测试过它,但看起来它使用了非特权方法。如果它一开始不适用于 x64,一些调整可能会有所帮助。

另外,刚刚发现一个问题,内容可能对您有帮助:在 Linux 上检测 VMM https://stackoverflow.com/q/3668804/1000282

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

64位windows VMware检测 的相关文章

随机推荐

  • iOS 自动布局与 UIScrollview:为什么滚动视图的内容视图不填充滚动视图?

    以下代码 在 viewDidLoad 中调用 会导致全红屏幕 我希望它是一个完全绿屏 为什么是红色的 我怎样才能让它全部变绿呢 UIScrollView scrollView UIScrollView new scrollView tran
  • Google Drive Rest API v3 - 如何将文件移至垃圾箱?

    Google Drive Rest API v3 有一个 Drive Files Delete 方法 但会永久删除文件 如何将文件移动到垃圾箱 我查看了用于更新文件元数据的文档 并尝试执行此操作 但它似乎不起作用 File file new
  • 完整页面 DOM 的序列化。我可以获取加载的 JS 代码吗,还是必须单独 AJAX?

    我正在尝试找出一个错误 但由于网络应用程序的复杂性 很难做到这一点 有许多框架和许多以不同方式嵌入到 HTML 中的 Javascript 代码实例 需要修复的是使用以下命令创建的子页面showModalDialog 所以你已经知道这将是一
  • 带有“不存在”的 SQL 查询不起作用

    我正在尝试使用一个简单的查询 但我没有得到任何结果 目标是 学习 不存在 是如何工作的 我有一个简单的表 其中 idUsuario 作为用户的默认 ID 和名称 SELECT FROM usuario WHERE NOT EXISTS SE
  • 如何将字符串与传入消息进行比较

    我知道这听起来很简单 但我遇到了一些麻烦 我正在尝试制作一个带有 pic 微控制器 MCU 和 xamarin android 应用程序的系统 从应用程序到 pic MCU 的发送部分已解决 但当我想将数据从 MCU 发送到应用程序时 它不
  • 从经度\纬度转换为笛卡尔坐标

    我有一些以纬度和经度给出的以地心坐标点 WGS 84 http en wikipedia org wiki World Geodetic System 如何将它们转换为原点位于地球中心的笛卡尔坐标 x y z 这是我找到的答案 为了使定义完
  • 混合 Objective-C 和 C++

    我正在尝试将 Objective C 与 C 混合在一起 当我编译代码时 出现几个错误 A h import
  • React:数组状态的高效更新

    React 的基本思想之一是状态更改应该始终且仅通过以下方式发生 this setState 并且不手动操纵状态 但对于状态是深层数组 即对象文字数组 实际上是一些 JSON 数据 的情况 更新该状态变得非常昂贵 如果我只想更新这样一个数组
  • htaccess:允许来自域名而不是IP/子网

    在我的身份验证页面上 我只允许来自某些 IP 是否可以通过域名允许 我的家庭网络的 IP 是动态的 但域名 mysite com 始终指向正确的 IP 地址 我遇到这个是因为我遇到了同样的问题 以防万一其他人发现这个 我找到了完美的解决方案
  • Ionicframework中$window和window的区别

    ionic framework 中 window 和 window 之间的确切区别是什么 例如 在 learn ionicframework com formulas localstorage 的 localstorage 教程中 同时使用
  • 如何使用 ExpressPlay sdk 将 epub 文件集成到自己的电子书阅读器应用程序中?

    我必须使用 ExpressPlay Sd k 将 epub 文件集成到我们现有的电子书阅读器应用程序中 但是 我无法得到解决方案 我通过给定的链接得到了一些想法 https www expressplay com ebooks https
  • 如何使用 Typeorm 仅返回关系的某些列

    好吧 我在获取与 typeorm 的关系时遇到了麻烦 当我运行该服务时 它会返回该关系中的所有数据 而我只想要特定的字段 例如 id 和 name 这是我的代码 async findById id string Promise
  • Varnish:仅缓存特定域

    我一直在积极地谷歌搜索 但没有运气 我使用 Varnish 取得了很好的效果 但我想在单个服务器 Apache 上托管多个网站 而不用 Varnish 缓存所有网站 我可以通过 URL 指定要缓存的网站吗 Thanks 评论后编辑 它是 r
  • 处理“抛出的异常类型不可无抛出复制构造”警告

    时隔 12 年 重返 C 开发 我正在使用 JetBrains 的 CLion 软件 该软件非常棒 因为它针对我的类设计中可能出现的问题提供了大量输入 我在类的构造函数 throw 语句中收到的警告之一是 Thrown exception
  • 有没有办法自动查找项目中使用的所有第三方组件?

    是否有任何 Delphi 专家或类似专家可以让我自动查找项目中使用的所有第三方组件 我需要发送一个使用多个第三方组件的项目 为了进行编译 我还必须包含它使用的第三方组件 还有比手动查看第三方组件的所有表单更快的方法吗 清除全局和项目选项中的
  • 将列表视图限制为 25 个项目

    我使用以下代码以编程方式显示列表视图 以下是如何以编程方式显示列表视图 messagesList ListView findViewById R id listMessages messageAdapter new MessageAdapt
  • Ansible 模板在破折号后跳过字符串

    我正在 Ansible 中使用一组变量模板化一个文件 我的一些条目defaults main yaml文件是 jenkins plugins ant 1 8 antisamy markup formatter 1 5 apache http
  • Xslt 如何设置条件奇数/偶数行的样式

    我有一个使用 xslt 转换编写的 html 表 如下所示 table table
  • 替换长度 > 2 的相同值的序列

    我有一个测量变量的传感器 当没有连接时 它总是返回最后看到的值 而不是NA 因此 在我的向量中 我想用估算值替换这些相同的值 例如 na approx set seed 3 vec lt round runif 20 10 1 2 8 4
  • 64位windows VMware检测

    我正在尝试开发一个应用程序来检测程序是否在虚拟机内运行 对于32位Windows 已经有方法在以下链接中解释 http www codeproject com Articles 9823 Detect if your program is