Я нашел несколько статей о том, как вносить патчи в старые версии Windows. Одна из них — XP. Я отладил это и обнаружил, что вносится патч в GetMouseCoord, внутри которого есть GetMouseCoordinateAbsolute/GetMouseCoordinateRelative. Я попытался внести патч, но получил синий экран смерти (BSOD) с ошибкой PROCESS_HAS_LOCKED_PAGES. Как это исправить? Здесь в XP x86 функция GetMouseCoord патчится следующим образом. непатченный патчированный Сравнить MouseSpeed с 0 JE DoNotApplyAccel [ApplyAccel] Patched: Сравнить MouseSpeed с 0 JAE DoNotApplyAccel [ApplyAccel] Здесь я пытаюсь изменить функции GetMouseCoordinateRelative/GetMouseCoordinateAbsolute Код (Text): NTSTATUS PatchFunction(PVOID functionAddress) { PMDL mdl = IoAllocateMdl(functionAddress, 1, FALSE, FALSE, NULL); if (mdl == NULL) { DbgPrint("Failed to allocate MDL\n"); return STATUS_INSUFFICIENT_RESOURCES; } __try { MmProbeAndLockPages(mdl, KernelMode, IoWriteAccess); PVOID mappedAddress = MmGetSystemAddressForMdlSafe(mdl, NormalPagePriority); if (!mappedAddress) { __leave; } // Patch the function: Write a RET instruction *(volatile UCHAR*)mappedAddress = 0xC3; // RET DbgPrint("Function at %p patched to return immediately\n", functionAddress); } __except (EXCEPTION_EXECUTE_HANDLER) { MmUnlockPages(mdl); IoFreeMdl(mdl); return GetExceptionCode(); } MmUnlockPages(mdl); IoFreeMdl(mdl); return STATUS_SUCCESS; } Код (Text): EXTERN_C NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath) { UNREFERENCED_PARAMETER(RegistryPath); UNREFERENCED_PARAMETER(DriverObject); DriverObject->DriverUnload = DriverUnload; PVOID baseAddress = GetModuleBaseAddress(L"win32kbase.sys"); //DbgPrint("Base Address of win32kbase.sys: %p\n", baseAddress); OK Patch GetMouseCoordinateAbsolute ULONG_PTR absoluteFuncAddress = (ULONG_PTR)baseAddress + 0x10D58; NTSTATUS status = PatchFunction((PVOID)absoluteFuncAddress); if (!NT_SUCCESS(status)) { return status; } // Patch GetMouseCoordinateRelative ULONG_PTR relativeFuncAddress = (ULONG_PTR)baseAddress + 0x10B64; status = PatchFunction((PVOID)relativeFuncAddress); if (!NT_SUCCESS(status)) { return status; } return STATUS_SUCCESS; }
Я не могу опубликовать это, потому что в каждой сборке Windows смещение в функциях GetMouseCoordinateAbsolute/GetMouseCoordinateRelative меняется