将DenuvOwO版本移植到 Linux平台
将 DenuvOwO 版本移植到 Linux 平台。
此项目独立于 DenuvOwO 开发,以他们的开源虚拟机管理程序为参考,并在 Linux 平台上复用了他们的破解程序。
LinUwUx是一个与 DenuvOwO 合作的破解组织/开发团队。
根据近期的新闻报道,这个团队专注于针对 Linux 系统的游戏破解方案。他们在 2026 年 7 月与 DenuvOwO 联合宣布,已经成功开发出了一套绕过 Denuvo 防篡改技术(也就是俗称的“D加密”)的方法,让受保护的 Windows 游戏可以在 Linux 系统上运行。
以下是关于 LinUwUx 和这个项目的一些关键信息:
核心成果:开发了基于修改版 Proton 兼容层的方案,让 Linux 用户(包括 Steam Deck 掌机玩家)能直接运行原本有 D 加密的游戏。
兼容范围:据其声称,该方案目前已适配 173 款游戏,其中包括《刺客信条 4:黑旗 记忆重置》等知名作品。
工作原理:该方法完全在用户空间运行,不需要修改 Linux 内核。对于较老的 CPU(如 AMD Zen 3 及更早架构),会通过一个额外的虚拟机监控器(Hypervisor)来模拟硬件环境,从而骗过 Denuvo 的校验。
所以,你在之前报告里提到的“LinUwUx”,正是指这个为 Linux 游戏破解做出贡献的团队。结合你成功运行《红色沙漠》的情况来看,你使用的 GE-Proton11-1-LunUwUx 应该就是他们团队专门修改过的 Proton 版本。
相关主题
信息:虚拟机监控程序破解 - 最佳实践和发布要求- 如何负责任地使用虚拟机监控程序破解程序以及已批准破解程序发布的质量要求。
支持:虚拟机监控程序破解程序支持- 为所有已批准的虚拟机监控程序破解程序发布提供支持,请在此处报告问题并寻求帮助。请使用此主题,不要在游戏主题中提问。如果此主题已锁定,请耐心等待更新,不要在论坛上发布垃圾信息。
讨论:虚拟机监控程序破解程序讨论- 用于对本帖、上方链接的其他帖子以及所有其他讨论的反馈。请勿在此处寻求支持。Linux
:(本主题)- 在 Linux 上运行虚拟机监控程序破解程序发布,使用已打补丁的 Proton 和用于 CPUID 故障模拟的最小化虚拟机监控程序。
最低配置要求:
Intel 第四代或更新的 CPU;
AMD Ryzen 第一代或更新的 CPU;
Linux 内核版本至少 6.0。AMD
Zen 4 及更新的处理器需要至少 6.18 内核才能使用 cpuid_fault 功能,否则必须使用虚拟机管理程序(适用于运行 SteamOS 的 Ryzen Z1 Extreme 和类似掌机)。
选项/环境变量:
PROTON_AVX=0/1(默认值=0)- 启用 AVX 指令集欺骗支持。仅对需要此功能的游戏启用此选项。如果游戏在生成令牌时未启用 AVX,则启用此选项后游戏将无法启动。
目前唯一需要此选项的游戏是《刺客信条:幻影》。
设置说明:
您需要具备基本的 Linux 知识(例如使用终端、安装软件包)才能按照以下说明进行操作。
此方法与名为“用户模式指令保护 (UMIP)”的 CPU 功能不兼容,因此我们需要在具有此功能的 CPU 上禁用它。
此方法依赖于名为 CPUID 故障检测 (cpuid_fault) 的 CPU 特性。对于不具备此特性的 CPU,我们需要使用虚拟机管理程序来模拟它。Steam
Deck 和 SteamOS 用户可能需要使用HV-Decky,通过 Decky Loader 插件来自动完成设置。
禁用 UMIP -仅适用于 Intel 第九代及更新款处理器、AMD Ryzen 3000 及更新款处理器以及 Steam Deck。
在引导加载程序的内核参数中添加“clearcpuid=514”或“clearcpuid=umip”并重启。
要验证是否成功,您可以运行以下命令:
代码: 全选|行号开启/关闭|展开/收缩
猫/proc/cpuinfo | grep “umip”
如果此命令有输出,则表示 UMIP 仍已启用。如果输出为空,则表示设置成功。
这是一个一次性设置步骤,无需反复启用和禁用。
“设置虚拟机管理程序” -仅适用于 AM4 平台上的 AMD Ryzen(7000 型号之前)和 Steam Deck。
编译虚拟机管理程序模块所需的软件和库:
linux-headers 或 kernel-headers(某些发行版可能需要 linux-devel 或 kernel-devel)
制作
gcc 和 ld
dkms
请查阅您的 Linux 发行版文档,了解如何安装所需的软件包。
高级用户:如果您的内核是用 clang 编译的,则需要 clang、lld 和 llvm。
下载模块源代码:
依恋:
cpuid_fault_emulation.zip [12.7 KiB]
已下载 224 次
解压压缩包,并在目标文件夹(dkms.conf 文件所在文件夹)中打开终端。
将虚拟机管理程序配置为 dkms 模块:
代码: 全选|行号开启/关闭|展开/收缩
sudo dkms add .
sudo dkms build cpuid_fault_emulation/ 0.1 --force
sudo dkms install cpuid_fault_emulation/ 0.1 --force
此操作会将源文件添加到 dkms 构建树,构建并安装模块(详情请参阅 dkms 的手册页)。
安全启动 - 允许加载模块(一次性设置):如果您的系统启用了安全启动,则您的 Linux 发行版
很可能默认使用已签名的 shim 预加载器启动。DKMS会生成一个用于模块签名的自签名 MOK 证书,该证书必须使用 mokutil 进行注册。请按照以下说明进行操作。您只需执行此操作一次,无需在每次内核或虚拟机管理程序更新时都执行。高级用户:如果您使用的是非默认的安全启动设置,则必须确保 dkms 使用的密钥对已注册到您的 UEFI 签名数据库 (db) 中。
正在加载虚拟机管理程序 -仅适用于 AM4 平台上的 AMD Ryzen(7000 之前的型号)和 Steam Deck
每次想玩游戏时都要运行这个命令:
代码: 全选|行号开启/关闭|展开/收缩
sudo modprobe -r kvm_amd kvm
sudo modprobe cpuid_fault_emulation
请注意,像这样卸载 KVM 会终止所有正在运行的虚拟机。
卸载 KVM 是必要的,因为 AMD-V 的设计不支持不同驱动程序同时访问。
结束游戏会话后,您可以运行
代码: 全选|行号开启/关闭|展开/收缩
sudo modprobe -r cpuid_fault_emulation
sudo modprobe kvm_amd kvm
卸载虚拟机管理程序并恢复 KVM 功能。
安装 Proton 构建
下载链接中的 .tar.gz 文件,
运行命令
代码: 全选|行号开启/关闭|展开/收缩
tar -xvzf ~/Downloads/GE-Proton11 -1 -LinUwUx.tar.gz -C ~/ .local /share/Steam /compatibilitytools.d
或者
代码: 全选|行号开启/关闭|展开/收缩
tar -xf ~/Downloads/cachyos -10.0 -sunset-slr-LinUwUx.tar.xz -C ~/ .local / share /Steam/compatibilitytools.d
根据版本不同,请将第一个路径替换为您下载文件的文件夹路径和文件名。
不建议使用图形界面工具(特别是 Ark)进行解压,因为它可能会跳过解压空文件夹。
安装破解程序
与 Windows 系统一样,只需将破解文件解压到游戏文件夹即可。
您可以跳过驱动程序文件夹和 VBS.cmd 文件,因为这些文件不需要,也不会造成任何损害。
大多数游戏需要修改 DenuvOwO.ini 或 Reflex.ini 文件,并将 AutoLoad/AutoLoadHV 设置为 false。
否则,游戏会尝试加载 Windows 虚拟机管理程序,但会失败。
要运行游戏,请在您选择的游戏启动器中选择修改后的 Proton 版本,始终使用此 Proton 版本生成的干净前缀,
并确保如果您的 CPU 需要,虚拟机管理程序始终处于加载状态。
故障排除
引用:
我收到一条错误消息:“虚拟机监控程序未运行,请加载虚拟机监控程序驱动程序并重新启动游戏。”
这是破解程序本身内置的虚拟机管理程序存在性检查,在 Linux 系统上无法正常工作。目前破解程序正在更新至不包含此检查的新版本。请务必始终使用最新版本的破解程序。
引用:
我收到“Denuvo 尝试删除许可证文件”、“阻止删除令牌文件”或“无法初始化 SteamAPI”错误消息。
这些是关于绕过破解失败的一般性提示信息。请仔细检查所有操作。确保您使用的是正确的 Proton 版本,并已禁用 UMIP 和/或根据您的 CPU 情况加载了虚拟机管理程序。
确保您已下载最新的破解补丁,并且正在使用正确的游戏版本(包括游戏更新到正确的版本,以及使用破解补丁信息中指定的 Steam/EA 应用/Ubisoft Connect 版本)。
如果仍然无效,请尝试删除您的 Proton 前缀,并确保修改后的 Proton 版本会创建一个新的前缀。
如果您之前应用了旧版本的破解补丁,然后又用新版本覆盖了它,那么旧破解补丁的残留文件可能会造成干扰。
引用:
我在 Wine 日志中收到“虚拟机管理程序已在运行且 AutoLoadHV 已设置为 true!”、“无法启动 Denuvo 服务”错误消息或“未实现的函数”消息。
请确保在破解配置中禁用自动加载。
引用:
加载虚拟机管理程序时,出现“错误:无法插入‘cpuid_fault_emulation’:没有这样的设备”错误消息。
卸载所有可能使用 AMD-V 硬件的内核模块。大多数情况下是 kvm_amd 和 kvm。如果您使用 VirtualBox 或 VMware,它们可能加载了自己的内核模块。
此外,请确保在 BIOS 设置中启用 AMD-V/虚拟化功能。
引用:
加载虚拟机管理程序时,出现“错误:无法插入模块 cpuid_fault_emulation:服务拒绝了密钥”错误消息。
您的系统正在使用安全启动,因此只有使用已注册密钥签名的内核模块才能加载。DKMS 会自动对模块进行签名,但您需要使用 mokutil/sbctl 注册其默认密钥,或者使其使用系统已用于对引导加载程序进行签名的密钥。
工作原理
Windows 使用虚拟机管理程序执行以下操作:
拦截 CPUID 指令以伪造 CPU 信息并接收来自破解程序的信息
覆盖 KUSER_SHARED_DATA(映射到每个进程的关于硬件和 Windows 安装的只读内存)
通过覆盖指向系统调用钩子的 LSTAR MSR 来接入每个系统调用(本质上是用虚拟机管理程序中的钩子覆盖 Windows 系统调用处理例程)。
拦截 SGDT 指令,返回 GDT 限制 0x7F
Denuvo 使用 CPUID、KUSER_SHARED_DATA 和 GDT Limit 来生成令牌。
此外,它还会运行 NtQuerySystemInformation 系统调用来获取用于生成令牌的更多信息。
系统调用钩子会将系统调用重定向到破解程序(DenuvOwO.dll、Reflex.dll、version.dll、winmm.dll 等),以接管并返回伪造的数据。
在 Linux 系统中,同样的问题以不同的方式解决:
CPUID 通过名为 cpuid_fault 的 CPU 特性进行拦截。如果 CPU 和内核都支持此特性,则可以通过系统调用为该进程及其子进程启用它。连续的 CPUID 指令将导致段错误。这些段错误
可以在 SIGSEGV 处理程序中处理,其方式与 Windows 上的虚拟机管理程序处理段错误的方式相同,只是处理过程发生在用户空间。
对于本身不支持 cpuid_fault 的 CPU,虚拟机管理程序会重新实现 cpuid_fault 的接口,并以与原生硬件相同的方式在 cpuid 指令上抛出故障,因此使用相同的系统调用来启用它。这实际上与 DenuvOwO-bypass 没有任何关系,它只是简单地重新实现了 cpuid_fault。KUSER_SHARED_DATA
既不被内核映射到进程,也不是只读的。我们可以直接写入它。.exe 或 .dll 文件也可以写入。因此,我们只需将 Windows 虚拟机管理程序写入此内存区域的数据即可。
至于系统调用,Windows 系统调用对 Linux 内核没有任何意义,因此在用户空间处理这些系统调用已经是一个已解决的问题。系统调用用户分发 (Syscall User Dispatch) 是 Linux 的一项特性,允许进程通过系统调用触发 SIGSYS 信号。实现此功能是为了让 Wine 本身能够支持 Windows 系统调用。因此,我们接入这些机制的方法是,简单地将 Windows 虚拟机管理程序中的相同系统调用钩子写入 Wine 的 SIGSYS 处理程序中。
遗憾的是,Linux 上没有办法从用户空间拦截和模拟 SGDT 指令。这实际上正是 UMIP 的作用所在:UMIP 会在用户空间执行 SGDT 指令时停止,并引发一般保护错误(本质上是段错误)。
虽然这听起来像 cpuid_fault,但区别在于 Linux 内核不允许我们在用户空间以信号的形式处理这种情况,内核只是用它自己设定的值(GDT 限制为 0,而不是 0x7F)来模拟它。:(
本质上,解决这个问题的方法是修改内核中的这些伪造值并重新编译内核,或者渗透到 Linux 内核邮件列表中,使 UMIP 路径中的 GDT 限制可配置。
但事实证明,当你禁用 UMIP 并让 CPU 运行真正的 SGDT 指令时,真正的 GDT 限制始终为 0x7F!我们真是太幸运了。
顺便一提,如果您想在不禁用 UMIP 的情况下使用自定义内核,相关变量位于 Linux 源文件 arch/x86/kernel/umip.c#L232 中。将 dummy_limit 变量设置为 0x7F 即可。
除了大多数情况下不需要虚拟机管理程序之外,这样做还有另一个好处:除了禁用 UMIP 之外,所有操作都根据设计限制在 Wine/游戏进程内。cpuid_fault
只能由进程自身启用,因此不存在 CPUID 被其他进程伪造的风险。
系统调用用户分发 (Syscall User Dispatch) 也是如此,它仅对游戏进程启用,不会拦截其他系统调用。KUSER_SHARED_DATA
本质上是 Windows 数据结构,其他进程不会使用它,甚至无法访问它。
这种自包含方式的另一个好处是,在 Linux 上同时运行多个不同的绕过 UMIP 的游戏应该不会有问题。
在 Windows 系统中,虚拟机管理程序只能存储一个 TargetSysHandler(用于处理系统调用的内存地址)。不同游戏的 TargetSysHandler 值可能不同,因此在 Windows 系统上一次只能运行一个游戏。
下载链接
我用夸克网盘给你分享了「Linux hv d加密」,点击链接或复制整段内容,打开「夸克APP」即可获取。
/~450f3Zc4G8~:/
链接:https://pan.quark.cn/s/c60d192da6b0
使用命令
代码: 全选|行号开启/关闭|展开/收缩
patch -p1 < ../LinUwUx.patch
这是从 Proton GE-11 版本中提取的。版本差异较大的版本可能会出现一些无法自动修复的冲突,可能需要手动修复被拒绝的问题。
特别感谢:
DenuvOwO的初始实现、解答疑问以及所有版本的发布。感谢
我的匿名好友开发虚拟机管理程序,以及Bareflank和SimpleSvm提供的灵感。感谢
Andreh发现并修复了基于 reflex.dll 的破解程序中的问题。感谢 Mojteam 的
Portal3d和eoran26更新破解程序。感谢
Arn0lo跟踪游戏兼容性。
最后,感谢参与测试的一百多位测试人员。谢谢!
