вызов функций памяти драйверов из потоков в драйвере ядра Windows

#c #windows #multithreading #kernel-mode

Вопрос:

У меня есть драйвер ядра Win, который может считывать и записывать виртуальную память процесса. Но проблема в том, что я могу вызывать функции памяти(запись/чтение) только из функций IoControl, DriverEntry и DriverUnload. При попытке вызвать функции памяти из функции потока — получение bsod с именем «KERNEL_SECURITY_CHECK_FAILURE».

Функция резьбы:

 void Thread(PEPROCESS *Process) {
    //code that cannot break anything and works well(no sys calls) (deleted from post)

    if (Address != 0) { // Address - DWORD Address of memory. ClientAdress - too
        KeReadVirtualMemory(Process, ClientAddress   Address, amp;LocalPlayer, sizeof(ULONG)); // crashes here
    }
 

Функция, которая создает поток:

 void Manager(PEPROCESS Process, int Feature, int enabled) {
    ObfReferenceObject(gDriverObject); // global pDriverObject(got from DriverEntry)
    PHANDLE Thr;
    NTSTATUS status = PsCreateSystemThread(amp;Thr, GENERIC_ALL, NULL, NULL, NULL, Thread, amp;Process);
        if (!NT_SUCCESS(status))
        {
            ObfDereferenceObject(gDriverObject);
        }
 

IoControl:

 NTSTATUS IoControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
    NTSTATUS Status;
    ULONG BytesIO = 0;

    PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);

    // Code received from user space
    ULONG ControlCode = stack->Parameters.DeviceIoControl.IoControlCode;

    if (ControlCode == IO_READ_REQUEST)
    {
    // stuff that works well(deleted from post)


    else if (ControlCode == IO_CALL_FNC) {
        PKERNEL_CALL_FNC_REQUEST ReadInput = (PKERNEL_CALL_FNC_REQUEST)Irp->AssociatedIrp.SystemBuffer;
        PKERNEL_CALL_FNC_REQUEST ReadOutput = (PKERNEL_CALL_FNC_REQUEST)Irp->AssociatedIrp.SystemBuffer;

        int Feature = ReadInput->Feature;
        int enabled = ReadInput->enabled;
        PEPROCESS Process;
        if (NT_SUCCESS(PsLookupProcessByProcessId(ReadInput->ProcessId, amp;Process))) {
            Manager(Process, Feature, enabled); // call manager(will create the thread)
            }
    }
 

Кереадвиртуальная память:

 NTSTATUS KeReadVirtualMemory(PEPROCESS Process, PVOID SourceAddress, PVOID TargetAddress, SIZE_T Size)
{
    PSIZE_T Bytes;
    if (NT_SUCCESS(MmCopyVirtualMemory(Process, SourceAddress, PsGetCurrentProcess(),
        TargetAddress, Size, KernelMode, amp;Bytes)))
        return STATUS_SUCCESS;
    else
        return STATUS_ACCESS_DENIED;
}
 

And yes, the last, DriverEntry:

 NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,
    PUNICODE_STRING pRegistryPath)
{
    DbgPrintEx(0, 0, "[hout] Loadedn");

    PsSetLoadImageNotifyRoutine(ImageLoadCallback);

    RtlInitUnicodeString(amp;dev, L"\Device\kernelhout");
    RtlInitUnicodeString(amp;dos, L"\DosDevices\kernelhout");

    IoCreateDevice(pDriverObject, 0, amp;dev, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, amp;pDeviceObject);
    IoCreateSymbolicLink(amp;dos, amp;dev);

    pDriverObject->MajorFunction[IRP_MJ_CREATE] = CreateCall;
    pDriverObject->MajorFunction[IRP_MJ_CLOSE] = CloseCall;
    pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IoControl;
    pDriverObject->DriverUnload = UnloadDriver;

    pDeviceObject->Flags |= DO_DIRECT_IO;
    pDeviceObject->Flags amp;= ~DO_DEVICE_INITIALIZING;

    threads = (Thread*)ExAllocatePoolZero(PagedPool, 16 * sizeof(Thread), 'd');
    threadnum = 0;

    gDriverObject = pDriverObject; // writing to global

    return STATUS_SUCCESS;
}
 

Как вызывать функции памяти из потока? Любая помощь, и, пожалуйста, извините за мой плохой английский…