at0m-b0mb/VMware-Hidden-Mode

GitHub: at0m-b0mb/VMware-Hidden-Mode

针对 VMware 环境的反反虚拟机检测工具,通过修补配置与客户机实现隐蔽运行。

Stars: 3 | Forks: 0

# VMware 隐藏模式 这是一组 PowerShell 脚本的集合,旨在移除或掩盖 Windows VM 内部的 VMware 客户机痕迹,从而增加恶意软件或反分析工具检测虚拟化环境的难度。 ## 目录 1. [概述](#overview) 2. [脚本](#scripts) 3. [快速开始 — ARM 版 (Apple Silicon 上的 VMware Fusion)](#quick-start--arm-edition-vmware-fusion-on-apple-silicon) 4. [快速开始 — x86/x64 版](#quick-start--x86x64-edition) 5. [ARM 脚本的具体功能](#what-the-arm-script-does) 6. [解析错误排查](#troubleshooting-the-parse-errors) 7. [已知限制 (Apple Silicon)](#known-limitations-apple-silicon) 8. [运行后的验证](#verification-after-running) 9. [文件参考](#file-reference) ## 概述 当恶意软件或反分析工具在 VM 中运行时,它们通常会检查虚拟化的特征(注册表项、驱动名称、BIOS 字符串、WMI 数据等)。 这些脚本会对这些特征进行清理、重命名或修补,使得被测试的软件将该客户机视为真实的物理机。 ## 脚本 | 文件 | 目标 | 宿主机 | |------|--------|------| | `clean_guest_arm.ps1` | Windows 11 ARM64 客户机 | Apple Silicon (M1/M2/M3/M4) 上的 VMware Fusion 13+ | | `clean_guest.ps1` | Windows 10/11 x86-64 客户机 | Intel 上的 VMware Workstation / Fusion | | `vmstealth_fusion_arm.py` | macOS 宿主机端调整 | macOS (Apple Silicon) | | `vmstealth.py` | macOS/Linux 宿主机端调整 | Intel 宿主机 | ## 快速开始 — ARM 版 (Apple Silicon 上的 VMware Fusion) ### 前置条件 | 要求 | 详情 | |-------------|---------| | 宿主机 | 装有 VMware Fusion 13 或更高版本的 Apple Silicon Mac (M1 / M2 / M3 / M4) 上的 macOS | | 客户机 | Windows 11 ARM64(VM 必须是 ARM64 客户机) | | 权限 | 该脚本**必须**在客户机内以**管理员**身份运行 | | PowerShell | 客户机内的 Windows PowerShell 5.1 **或** PowerShell 7+ | | 快照 | 在运行**之前**拍摄 VM 快照 —— 对注册表和驱动程序的更改可能难以手动还原 | ### 步骤 1. **首先**在 VMware Fusion 中**拍摄快照**。 2. 将 `clean_guest_arm.ps1` 复制到 Windows ARM 客户机中(例如通过 Fusion 的共享剪贴板拖放,或将其放入共享文件夹)。 3. 在客户机内**以管理员身份打开 PowerShell**: - 按 **Win + X** → *Windows PowerShell (管理员)* 或 *终端 (管理员)* 4. 允许脚本运行(绕过执行策略): powershell -ExecutionPolicy Bypass -File .\clean_guest_arm.ps1 或者,如果您已经处于提权的 PowerShell 会话中: Set-ExecutionPolicy Bypass -Scope Process -Force .\clean_guest_arm.ps1 5. 查看带颜色的输出: - `[+]` 绿色 —— 操作成功完成 - `[-]` 灰色 —— 项目不存在 / 已跳过 - `[!]` 黄色 —— 警告,需手动查看 - `[X]` 红色 —— 操作失败 6. 脚本运行结束后**重启客户机**。 7. 重启后,运行[验证命令](#verification-after-running)。 ## 快速开始 — x86/x64 版 步骤与上述 ARM 版完全相同,但需改用 `clean_guest.ps1`。 此脚本针对在 Intel Mac 上的 VMware Workstation 或 VMware Fusion 中运行的 Windows 10/11 x86-64 客户机。 ``` powershell -ExecutionPolicy Bypass -File .\clean_guest.ps1 ``` ## ARM 脚本的具体功能 该脚本按顺序执行以下部分: | # | 部分 | 具体操作 | |---|---------|--------------| | 0 | **Apple SMBIOS** *(ARM 专有)* | 修补 `HKLM:\SYSTEM\...\SystemInformation` 和 `HKLM:\HARDWARE\DESCRIPTION\System`,用 Dell OptiPlex 7090 身份替换 Apple/VMware BIOS 字符串 | | 1 | **注册表项** | 删除 `HKLM:\SOFTWARE\VMware, Inc.` 及所有 VMware 服务/驱动程序注册表项 | | 2 | **服务** | 停止并禁用 VMware 服务(VMTools, VGAuthService, vmci, pvscsi, …) | | 3 | **进程** | 终止正在运行的 VMware 进程(vmtoolsd, vmwaretray, …) | | 4 | **二进制文件** | 将 `%ProgramFiles%\VMware\VMware Tools` 中的 VMware 可执行文件重命名为通用 Windows 名称 | | 5 | **内核驱动程序** | 重命名 `System32\drivers` 中的 VMware `.sys` 文件(ARM64 专有的驱动程序名称) | | 6 | **DLL** | 将 `vmGuestLib.dll`, `vm3dgl.dll`, `vmhgfs.dll` 重命名为无害的名称 | | 7 | **PCI 设备** | 将 VMware VID 0x15AD 设备的 FriendlyName / DeviceDesc 修补为等效的 Intel 名称 | | 8 | **磁盘设备** | 修补 SCSI/IDE FriendlyName 字符串(将 "VMware Virtual …" 替换为 Samsung/WD/Seagate 名称) | | 9 | **网卡 (NIC)** | 修补网卡类项中的 DriverDesc;将适配器重命名为 "Ethernet" | | 10 | **GPU** | 将 DriverDesc 修补为 "Intel UHD Graphics 630" | | 11 | **音频** | 将 DriverDesc 修补为 "Realtek High Definition Audio" | | 12 | **SystemInformation** | 验证 Dell 身份是否已在第 0 部分应用 | | 13 | **卸载注册表** | 从“程序和功能”中移除 "VMware Tools" | | 14 | **Prefetch** | 删除 VMware prefetch 文件 | | 15 | **计划任务** | 移除 VMware 计划任务 | | 16 | **事件日志** | 清除系统 / 应用程序 / 设置日志中的 VMware 条目 | | 17 | **防火墙规则** | 移除 VMware 防火墙规则 | | 18 | **WMI 验证** | 读取 WMI (Win32_ComputerSystem, Win32_BIOS 等),如果存在 VM 字符串则发出警告 | | 19 | **网络** | 检查默认网关是否存在 VMware NAT 指纹 | | 20 | **计算机名** | 如果计算机名与已知的沙箱模式匹配,则发出警告 | | 21 | **用户名** | 如果用户名与已知的沙箱账户名匹配,则发出警告 | | 22 | **内存 (RAM) / CPU** | 如果内存小于 4 GB 或逻辑 CPU 小于 2 个,则发出警告 | | 23 | **磁盘大小** | 如果任何磁盘小于 60 GB,则发出警告 | | 24 | **运行时间 (Uptime)** | 如果运行时间少于 30 分钟,则发出警告 | | 25 | **时区** | 如果时区为纯粹的 UTC,则发出警告 | | 26 | **用户痕迹** | 创建逼真的诱饵文件(预算电子表格、笔记、工作报告)并带有倒填的时间戳 | | 27 | **启动项** | 如果现有条目少于 2 个,则添加逼真的 OneDrive / Discord Run 注册表项 | | 38¹ | **ARM64 指纹** *(ARM 专有)* | 报告 CPU 架构;警告 ARM64 = 12 对原生的 ARM64 进程是可见的 | ## 解析错误排查 如果在运行脚本时看到类似下方的错误,请按照本节中的步骤进行操作。 ``` Variable reference is not valid. ':' was not followed by a valid variable name character. Unexpected token 'VMware' in expression or statement. Missing closing '}' in statement block or type definition. ``` ### 根本原因 存在两个原因: **1. 缺少 BOM 的 UTF-8 编码(影响 Windows PowerShell 5.1)** 当文件**没有 UTF-8 字节顺序标记 (BOM)** 时,Windows PowerShell 5.1 会使用系统 ANSI 代码页(在英文 Windows 上通常是 Windows-1252)来读取 `.ps1` 文件。该脚本包含 Unicode 字符(破折号 `—` 和制表符 `─`)。它们的 UTF-8 字节序列包含 `0x94`,Windows-1252 会将其映射为右双引号(`"`)。PowerShell 的解析器会将其视为字符串的结束定界符,从而破坏字符串文字并导致连锁的解析失败。 **修复方法:** 此仓库中的文件现在已包含 UTF-8 BOM(文件开头的字节为 `EF BB BF`)。请确保您使用的是最新版本的文件。如果您下载的是旧副本,请重新下载。 您可以在 PowerShell 中验证是否存在 BOM: ``` $bytes = [System.IO.File]::ReadAllBytes('.\clean_guest_arm.ps1') '{0:X2} {1:X2} {2:X2}' -f $bytes[0], $bytes[1], $bytes[2] # 应打印: EF BB BF ``` 如果缺少 BOM,请将其添加: ``` $content = Get-Content '.\clean_guest_arm.ps1' -Raw -Encoding UTF8 [System.IO.File]::WriteAllText( (Resolve-Path '.\clean_guest_arm.ps1'), $content, [System.Text.UTF8Encoding]::new($true) # $true = emit BOM ) ``` **2. 字符串插值中的 `$field:` 变量引用(PowerShell 5.1 和 7+)** PowerShell 会将 `"$name: value"` 解释为 PSDrive 限定的变量(类似于 `$env:PATH`)。因为 `field` 不是有效的驱动器名称,解析器会报错 `Variable reference is not valid`。 **修复方法:** 使用 `${field}` 来界定变量名:`"${field}: value"`。这在当前版本的文件中已经应用。 ## 已知限制 (Apple Silicon) | 限制 | 说明 | |------------|-------------| | **ARM64 架构代码 (12)** | `Win32_Processor.Architecture` 对于 ARM64 会返回 `12`。原生的 ARM64 进程可以读取此信息并检测到非 x86 环境。在 WoW64 模拟下运行的 x86/x64 恶意软件看到的则是 `Architecture=9`,因此不受影响。该值无法从客户机内部更改。 | | **SMBIOS 修补需要重启** | 对 `SystemInformation` 的注册表修补会在启动时被读取。必须重启,WMI / `GetSystemFirmwareTable` 查询才能返回新值。 | | **HVCI / Secure Boot 可能会阻止驱动重命名** | 如果启用了基于虚拟化的代码完整性 (HVCI),则无法重命名正在使用的内核驱动文件。脚本会发出警告并要求您先重启。 | | **重新安装 VMware Tools 会重置更改** | 安装或更新 VMware Tools 将恢复许多已修补的值。在任何 Tools 更新后,请重新运行此脚本。 | | **建议使用桥接网络模式** | NAT 模式使用 `192.168.x.2` 范围内的网关地址,这会被识别为 VMware 指纹。将 VM 的网络适配器切换为桥接模式,以获得更干净的网络标识。 | ## 运行后的验证 **重启后**,在客户机内运行以下命令: ``` # 制造商和型号 (应显示 Dell Inc. / OptiPlex 7090) Get-CimInstance Win32_ComputerSystem | Select-Object Manufacturer, Model # BIOS 供应商 (应显示 Dell Inc.) Get-CimInstance Win32_BIOS | Select-Object Manufacturer, SMBIOSBIOSVersion # GPU 名称 (不应包含 VMware/VMXNET) Get-CimInstance Win32_VideoController | Select-Object Name, AdapterRAM # NIC 描述 (不应包含 VMware/VMXNET) Get-CimInstance Win32_NetworkAdapter -Filter "PhysicalAdapter=TRUE" | Select-Object Name, MACAddress # 检查没有 VMware 注册表项残留 Test-Path "HKLM:\SOFTWARE\VMware, Inc." # should be False Test-Path "HKLM:\SYSTEM\CurrentControlSet\Services\VMTools" # should be False ``` 在客户机内运行 `pafish.exe` 或 `al-khaser.exe`,以确认 VM 不再被检测到。 ## 文件参考 ``` VMware-Hidden-Mode/ ├── clean_guest_arm.ps1 # Guest cleaner — Windows 11 ARM64 in VMware Fusion on Apple Silicon ├── clean_guest.ps1 # Guest cleaner — Windows 10/11 x64 in VMware Workstation / Fusion Intel ├── vmstealth_fusion_arm.py # Host-side stealth tweaks for VMware Fusion on Apple Silicon ├── vmstealth.py # Host-side stealth tweaks for VMware Workstation / Fusion Intel └── README.md # This file ```
标签:DAST, IPv6, PowerShell, VMware, 反虚拟机检测, 安全研究, 恶意软件分析, 虚拟机隐藏