在 Windows 中从内核验证客户端

问题描述 投票:0回答:1

我用 C# 制作了一个桌面应用程序和一个 Windows 内核驱动程序(主要针对 Windows 10 和 11)。现在我的目标是出售这两个,但我想知道如何加强打击盗版。我了解并做了很多事情来强化我的桌面应用程序,从加密到服务器检查,再到逆向工程等都非常具有挑战性。实际上,这一切似乎都很难绕过,但这并非不可能,因为拥有足够时间和专业知识的用户可能会重新创建删除我的验证检查后的过程。这就是为什么我想利用我的内核驱动程序在减少盗版方面发挥作用,就像视频游戏反作弊试图阻止修改客户端一样。这是因为我的驱动程序是人们购买我的软件的关键组件,并且尝试破解内核驱动程序比破解简单的桌面应用程序更具挑战性。

这里不存在的一个关键是,我相当确定内核驱动程序不应该尝试通过网络连接到我不这样做的任何东西。无论如何,这个问题的重点是尝试寻求一种解决方案来验证我的桌面应用程序尚未从我的内核驱动程序修改。另外,我的应用程序和驱动程序相互通信的方式是通过 IOCTL。当然,我可以做一些事情,比如像反作弊那样尝试剥夺读和写等权限,但我认为最通用的攻击方式是将 exe 扔进 DnSpy 并慢慢尝试逆转它并在之前删除我的保护创建一个新的 exe。

当然,我的驱动程序和我的应用程序将被签名,因此一种检查是验证签名是否有效。我还可以尝试获取文件的哈希值并验证其是否有效(类似于校验和),但我不知道这在内核中是否可能。我也不确定是否可以查看您正在通过 IOCTL 与哪个进程进行通信,因为我被告知在 IOCTL 队列中运行以下内容并不总是会产生客户端应用程序。

    PEPROCESS Process = NULL;
    HANDLE ProcessId = PsGetCurrentProcessId(); // Gets the current process ID
    if (NT_SUCCESS(PsLookupProcessByProcessId(ProcessId, &Process))) {

真的,我不知道如何验证有关客户端的任何信息,因为获取 EPROCESS 没有任何作用,因为微软决定不通过函数或通过记录结构来提供其任何内容。我还打赌,为内核驱动程序中的每个版本手动记录它是不可取的,即使这在技术上可以解决我的问题。那么,有谁知道如何从内核驱动程序内部验证客户端的真实性?

windows kernel windows-kernel
1个回答
0
投票

一种方法是从内核模式计算用户模式进程的某种哈希值,并使用预期的哈希值进行验证。

这是假设您的驱动程序已签名且无法篡改,这意味着在不破坏驱动程序签名的情况下,无法将预期验证值更改为用户模式进程的被篡改版本的哈希值。

© www.soinside.com 2019 - 2024. All rights reserved.