【Windows驱动】如何Hook一个Kernel Space的函数,改变它默认的执行流程? 代码鉴赏 科普

我不当学长 管理员组 2023-7-31 591

背景知识:

  • 这是windows驱动开发的高级操作,针对于驱动开发者、搞逆向的,一般的玩家可能用不到。
  • 这个是ChatGPT回答的,内容正确与否待定

需要被劫持的kernel函数:

该如何做?(Answered By ChatGPT

  • 要劫持并改变一个内核函数的执行流程,你可以使用钩子技术。在这种情况下,你可以使用Inline Hook来劫持函数NtQuerySystemInformation,并改变它的执行流程。
  • 以下是一个简单的示例,演示如何使用Inline Hook来劫持NtQuerySystemInformation函数:
#include <ntddk.h>

// 定义一个函数指针类型,用于保存原始的NtQuerySystemInformation函数地址
typedef NTSTATUS (*NtQuerySystemInformationPtr)(SYSTEM_INFORMATION_CLASS SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength);

// 定义一个全局变量,用于保存原始的NtQuerySystemInformation函数地址
NtQuerySystemInformationPtr OriginalNtQuerySystemInformation = NULL;

// 定义劫持后的NtQuerySystemInformation函数
NTSTATUS HookedNtQuerySystemInformation(SYSTEM_INFORMATION_CLASS SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength)
{
    // 在执行a = 1之前直接返回,不执行原始的NtQuerySystemInformation函数
    return STATUS_SUCCESS;
}

// 钩子函数,用于劫持NtQuerySystemInformation函数
NTSTATUS HookNtQuerySystemInformation()
{
    NTSTATUS status;

    // 获取NtQuerySystemInformation函数地址
    OriginalNtQuerySystemInformation = (NtQuerySystemInformationPtr)MmGetSystemRoutineAddress(&NtQuerySystemInformation);

    if (OriginalNtQuerySystemInformation == NULL)
    {
        // 获取函数地址失败
        return STATUS_PROCEDURE_NOT_FOUND;
    }

    // 禁用写保护
    KIRQL irql;
    KeRaiseIrql(DISPATCH_LEVEL, &irql);
    PVOID pNtQuerySystemInformation = &NtQuerySystemInformation;
    ULONG ulSize = sizeof(NtQuerySystemInformation);
    NTSTATUS ntStatus = STATUS_SUCCESS;
    ntStatus = MmProtectMdlSystemAddress(MmCreateMdl(NULL, pNtQuerySystemInformation, ulSize), PAGE_READWRITE);
    if (NT_SUCCESS(ntStatus))
    {
        // 替换NtQuerySystemInformation函数地址为HookedNtQuerySystemInformation
        InterlockedExchangePointer((PVOID*)&NtQuerySystemInformation, (PVOID)HookedNtQuerySystemInformation);
    }
    MmProtectMdlSystemAddress(MmCreateMdl(NULL, pNtQuerySystemInformation, ulSize), PAGE_EXECUTE_READ);

    // 恢复写保护
    KeLowerIrql(irql);

    return STATUS_SUCCESS;
}

// 驱动入口函数
NTSTATUS DriverEntry(PDRIVER_OBJECT driverObject, PUNICODE_STRING registryPath)
{
    UNREFERENCED_PARAMETER(registryPath);

    NTSTATUS status = STATUS_SUCCESS;

    // 劫持NtQuerySystemInformation函数
    status = HookNtQuerySystemInformation();

    if (!NT_SUCCESS(status))
    {
        // 劫持失败
        return status;
    }

    // 其他初始化操作...

    return status;
}

请注意,这只是一个示例代码,实际应用中可能需要根据你的具体需求进行修改和调整。此外,劫持内核函数需要特权级别较高的权限,因此你需要以管理员身份运行你的驱动程序。

希望这个示例可以帮助你开始劫持NtQuerySystemInformation函数并改变其执行流程。如果你有任

 

 


CSGO插件分享-申明 1、本网站名称:CSGO插件分享-中文站  网址:https://bbs.csgocn.net
2、本站的宗旨在于为CSGO玩家提供一个插件分享的中文资源平台,多数插件来源于SourceMod论坛,并配以中文介绍和安装教程。
3、欢迎有能力的朋友共享有趣的CSGO插件资源。
4、本站资源大多为百度网盘,如发现链接失效,可以点: 这里进行反馈,我们会第一时间更新。
最新回复 (0)
返回