首页 > 系统相关 >windows xusb21.sys驱动对虚拟手柄个数限制

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

时间:2024-08-05 12:17:00浏览次数:8  
标签:21 手柄 windows sys 64 offset xusb21

由于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 0
    int64  unknown0;

    //offset 8
    char flag[64];

    //offset 72
    XenonBusInformation*  bus_info[16];

    //offset 200
    GamepadInformation*   gamepad_info[4];

    //offset 232
    AudioInformation*     audio_info[4]

    //offset  264  66*4
    ulong  unknown1;

    //offset  268  67*4
    ulong  unknown2;

    //offset  272  68*4
    ulong  unknown3;

    //offset  276  69*4
    ulong  unknown4;

    //offset  280 70*4
    ulong  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,同样满足需求

标签:21,手柄,windows,sys,64,offset,xusb21
From: https://www.cnblogs.com/tieyan/p/18342977

相关文章

  • Windows使用命令行终止任务
    在Windows操作系统中,可以使用命令提示符(cmd)或WindowsPowerShell来查看运行的任务并终止指定的任务。以下是一些常用的命令:使用命令提示符(cmd)查看运行的任务:打开命令提示符,然后输入以下命令:tasklist这个命令会显示所有当前运行的进程及其对应的进程ID(PID)。终止指定的任务:......
  • systemverilog中for/foreach并行执行
    目录for-join_none并行foreach并行for-join_none并行for循环和fork-join_none语句可以组合使用来并行执行多个块,这里必须使用非阻塞的fork-join_none来启动多线程,因为使用fork-join_none时每一次循环都会创建新的fork块,并且不影响之后创建fork块,而fork-join则会阻塞后面的for......
  • windows C++-通过 C++/WinRT 使用 API(三)
    统一构造在C++/WinRT版本2.0及更高版本中,有一种优化的构造形式可供你使用,它被称作“统一构造”(请参见C++/WinRT2.0中的新增功能和更改)。若要使用统一构造而不是winrt::make,你需要一个激活工厂。要生成激活工厂,一种好的方式是向IDL添加构造函数。//MainPage.idl......
  • windows C++-通过 C++/WinRT 使用 API(二)
    延迟初始化在C++/WinRT中,每个类型都有一个特殊的C++/WinRTstd::nullptr_t构造函数。除了该构造函数,所有其他类型的构造函数(包括默认的构造函数)都会导致系统创建一个支持的Windows运行时对象,并为你提供它的智能指针。因此,该规则适用于使用默认构造函数的任何地方,例如......
  • UEFI模式下Windows10重启主板喇叭报警
    UEFI模式下Windows10重启主板喇叭报警,并且无法进入bios。主板发生一件怪事,就是正常开机的情况下,开机正常进入系统,也可以进入bios,主板喇叭不会报错。但是进入到系统再手动重启的话,主板喇叭会报错,然后全程黑屏,无法进入bios,黑屏过后直接进入Windows,如果不纠结这个问题其实可以不用管......
  • 教你如何使用Windows电脑对IOS手机上的网页进行调试
    前期准备PC端安装Chrome浏览器。苹果手机一部。连接电脑数据线一条。梯子。PC端安装iTunes或者爱思助手。苹果手机设置打开“设置”→找到“Safari浏览器”点击进去→往下滑找到“高级”进行点击→打开“Web检查器”。电脑配置步骤安装scoop 搜索PowerShell并使用管理......
  • 买二手NVIDIA网卡被坑记录:某宝的咸鱼二手交易网站上购入NVIDIA Mellanox ConnectX-3
    原本是打算去大连的人工智能计算中心去做技术负责人的,不过考虑到工作性质再考虑到自己的一些现实情况也就放弃了这个职位(比较在大连理工大学的博士学位还没有读下来,还是有所牵挂的)。同时,由于自己已经退出了大连理工的相关实验室以及华为集团和大连化物所的相关工作,因此我也就没有......
  • 基于OpenCV C++的网络实时视频流传输——Windows下使用TCP/IP编程原理
    1.TCP/IP编程1.1概念IP是英文InternetProtocol(网络之间互连的协议)的缩写,也就是为计算机网络相互连接进行通信而设计的协议。任一系统,只要遵守IP协议就可以与因特网互连互通。所谓IP地址就是给每个遵循tcp/ip协议连接在Internet上的主机分配的一个32bit地址。按照TC......
  • windows11系统NVIDIA显卡驱动自动升级导致2070 Super显卡失效 —— 552.22版本自动升
    操作系统Windows11,旧版本显卡驱动是552.22,由于安装的是NVIDIAGeforceExperience后显卡驱动自动升级到560.77版本,然后显卡不再工作。重新安装显卡驱动560.77版本显示window11版本操作系统不支持该版本显卡驱动,所以这说明虽然官网上说这个版本的显卡驱动是支持window11的,而且Ge......
  • 在C#中使用 System.Threading.Timer 实现定时任务
    在C#中使用System.Threading.Timer实现定时任务(qq.com)   前言在编写应用程序过程中,高效的任务调度都是必不可少的,无论是在实现后台服务、自动化任务或者定期数据处理。在.NET中,System.Threading.Timer类提供了一种强大而简单的方法来计划任务以特定时间间隔运行。本......