背景知识:
- 这是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函数并改变其执行流程。如果你有任