windows xusb21.sys驱动对虚拟手柄个数限制

news/2025/3/16 15:05:06/文章来源:https://www.cnblogs.com/tieyan/p/18342977

由于windows授权限制,云游戏服务器上的windows版本多数为server 2019
部分游戏用到了手柄,调研后基于 https://github.com/nefarius/ViGEmBus 来魔改虚拟出84个手柄
(一个容器只跑一个游戏,一个游戏独立使用4个手柄,一台云游戏服务器预开21个容器,所以理论至少需要能创建84个手柄)

但是实际过程中发现ViGEmBus只能虚拟21个手柄,第22个时候系统就返回失败,
由于是必现且windows没有反调试/代码混淆
所以很快定位到ViGEmBus会调用系统的xusb21.sys,但是xusb21.sys返回了false

ida64加载xusb21.sys,但是不清楚微软的符号服务器为什么没有xusb21.sys的pdb,而xusb22.sys就有,
所以先分析xusb22.sys,如果代码逻辑类似而且能解决的话再把修改移植回xusb21.sys

1 xusb22.sys DriverEntry会申请288字节的内存作为驱动的全局的私有结构体,整个结构体初始化为0

通过函数对DriverGlobals内存的使用,大概分析出结构体的定义

//size 288
struct DriverGlobals{//offet 0int64  unknown0;//offset 8char flag[64];//offset 72XenonBusInformation*  bus_info[16];//offset 200GamepadInformation*   gamepad_info[4];//offset 232AudioInformation*     audio_info[4]//offset  264  66*4ulong  unknown1;//offset  268  67*4ulong  unknown2;//offset  272  68*4ulong  unknown3;//offset  276  69*4ulong  unknown4;//offset  280 70*4ulong  unknown5;
}

2 通过windbg调试得知 InterfaceDevice::Initialize 返回了false,分析手柄的创建流程

创建一个手柄xusb22.sys需要分配三个设备,每个设备需要占用DriverGlobals中char flag[64]的一个字节,如果没有可用的flag那么函数返回失败。 64//3=21, 所以21个手柄的限制就来自这里

d:\>python
Python 3.11.9 (tags/v3.11.9:de54cf5, Apr  2 2024, 10:12:12) [MSC v.1938 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 64//3
21

3 知道了问题,接下来就是如何修复了

由于设备驱动同时会以单字节保存在flag的index(为了设备卸载时候重置对应的flag数组)
一个手柄使用3个设备,一个容器使用4个手柄,一共21个容器,0xfc刚好在一个字节范围内, 那么目前也无需修正设备驱动对Index的存储

d:\>python
Python 3.11.9 (tags/v3.11.9:de54cf5, Apr  2 2024, 10:12:12) [MSC v.1938 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> hex(3*4*21) 
'0xfc'

首先扩大DriverGlobals结构体的大小 (ida的keypatch插件可直接修改汇编)

然后修正对flag数组的所有访问,原先偏移是8,这里修改成512 (512大于288, 也不会覆盖原始的结构体信息)

以某处为例

原来的指令只有5个字节,不够patch,所以在代码段中寻找缝隙来填充

call cmp完直接ret了,也可以改成jmp然后cmp再jmp回去

所有引用处修改后验证成功,再把xusb22.sys的修改移植回xusb21.sys,同样满足需求

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/778084.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ComfyUI插件:ComfyUI-BrushNet节点

前言: 学习ComfyUI是一场持久战,而ComfyUI-BrushNet是最近的局部重绘节点,其包含BrushNet和Powerpaint两个主要节点,其中BrushNet有SD1.5和SDXL两个版本,PowerPaint只有1.5的模型可以使用,学会该插件,你可以完成对图片的局部重绘以及产品换背景等多个工作流。祝大家学习…

[学习笔记]后缀数组(Suffix Array)

后缀数组(suffix array)是一个通过对字符串的所有后缀经过排序后得到的数组。后缀数组被 Manber 和 Myers 于1990年提出, 作为对后缀树的一种替代, 更简单以及节省空间。它们也被Gaston Gonnet 于1987年独立发现, 并命名为“PAT数组”。 后缀数组有很多奇妙的性质, 这些性质可以…

2023 福建省第三届工业互联网创新大赛CTF Misc-Covertchannel2

2023 福建省第三届工业互联网创新大赛CTF Misc-Covertchannel2题目:近日,公司Windows服务器被入侵,黑客使用了一个比较隐蔽的信道将机密凭据传输了出去,但是蛛丝马迹还是被流量采集设备捕获了,你能从中找回丢失的flag吗?分析: 分析该流量包发现了有一个 rsa.key,并且在…

mybatis 源码环境搭建

参考 从头到尾手把手教你搭建阅读Mybatis源码的环境(程序员必备技能) Cannot enable lazy loading because Javassist is not available. Add Javassist to your classpath. 下载源码 https://github.com/mybatis/mybatis-3/ https://github.com/mybatis/parent/tree/mybatis-p…

05、Pod网络

4.1 Pod网络 在K8s集群中,多个节点上的Pod相互通信,要通过网络插件来完成,比如Calico网络插件。 使用kubeadm初始化K8s集群时,有指定一个参数 --pod-network-cidr=10.18.0.0/16 它是用来定义Pod的网段。 而我们在配置Calico的时候,同样也定义了一个CALICO_IPV4POOL_CIDR的…

Ros2 Moveit2 之 围绕对象进行规划 - 添加障碍物

本教程将向您介绍如何将对象插入规划场景并围绕它们进行规划。 先决条件 如果您还没有这样做,请确保您已完成RViz 中的可视化hello_moveit中的步骤。本项目假设您从上一个教程结束的地方开始。如果您只想运行本教程,您可以按照Docker 指南启动一个包含已完成教程的容器。 步骤…

使用 clearError 清除已处理的错误

title: 使用 clearError 清除已处理的错误 date: 2024/8/5 updated: 2024/8/5 author: cmdragon excerpt: 摘要:“文章介绍了clearError函数的作用与用法,用于清除已处理的错误并可实现页面重定向,提升用户体验。通过示例展示了在表单提交场景中如何应用此函数进行错误处理…

破局SAP实施难题、降低开发难度,定制化需求怎样快速上线?

前言 SAP 是全球领先的业务流程管理软件供应商之一,其提供广泛的模块化解决方案和套件,所开发的软件解决方案面向各种规模的企业,帮助客户规划和设计业务流程、分析并高效设计整个价值链,以更好的了解和响应客户需求。ERP 是企业资源规划的简称,ERP 软件涵盖所有核心业务领…

ComplatebleFuture异步调用方法,喝茶你也可以很快

ComplatebleFuture的异步用法: ComplateFuture.supplyAsync()方法会将方法体里面的方法进行异步调用,不用一直等待; ComplateFuture.allof()方法用于等待所有complatebleFutrue方法执行完毕。

若依框架导入阿里OSS报错问题解决方案

1、首先使用终端查看java JDK版本号 java -version 输出结果: java version "1.8.0_361" Java(TM) SE Runtime Environment (build 1.8.0_361-b09) Java HotSpot(TM) 64-Bit Server VM (build 25.361-b09, mixed mode) javac-version 输出结果: javac 1.8.0_361 如…

php---空合并运算符

在做PHP开发的过程中,在引入SDK做项目开发的时候,经常会遇到一些不常见的运算符,正好自己也学习一下。运行的结果:就比如上面看到的运算符 ?: 和 ?? 运算符和我们常见的三目运算符不同,但是也有点类似。 三目运算符是这样的:$abs = !empty($list) ? a : b;而空合并运…