Domanda Problemi con IoCreateDriver

Rusher632

Utente Iron
22 Giugno 2020
1
1
0
10
Ciao a tutti,
Sto cercando di sviluppare un driver del kernel (kinda basic) solo per fare un semplice RW sulla memoria di processo.
Tuttavia, poiché sto caricando quel driver con un manual mapper (sto usando un bootkit UEFI), continua a bloccarsi con KERNEL_SECURITY_CHECK_FAILURE.
Ho letto che anche con l'opzione / GS- con WDK 10 continua a controllare lo stack canary.

Tuttavia, quando rimuovo ogni riferimento ai parametri della funzione di inizializzazione, il driver non da alcun problema.

Vorrei inserire quel codice nel driver stesso, senza modificare il codice del loader, se possibile.
Qualche suggerimento?

Queste sono le funzioni di entrypoint e di inizializzazione:
C:
    NTSTATUS Initialize(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath) {
        UNREFERENCED_PARAMETER(pRegistryPath);
    
        NTSTATUS ntStatus;
    
        RtlInitUnicodeString(&devName, L"\\Device\\" DRIVER_NAME);
        ntStatus = IoCreateDevice(pDriverObject, 0, &devName,
            FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, TRUE, &pDriverObject->DeviceObject);
    
        if (!NT_SUCCESS(ntStatus)) {
            return ntStatus;
        }
    
        RtlInitUnicodeString(&symLink, L"\\DosDevices\\" DRIVER_NAME);
        ntStatus = IoCreateSymbolicLink(&symLink, &devName);
    
        pDriverObject->DeviceObject->Flags |= DO_BUFFERED_IO;
    
        for (int t = 0; t <= IRP_MJ_MAXIMUM_FUNCTION; t++)
            pDriverObject->MajorFunction[t] = &UnsupportedDispatch;
    
        pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = &DevIODispatch;
        pDriverObject->MajorFunction[IRP_MJ_CREATE] = &CreateDispatch;
        pDriverObject->MajorFunction[IRP_MJ_CLOSE] = &CloseDispatch;
        pDriverObject->DriverUnload = NULL;
    
        pDriverObject->DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
    
        return STATUS_SUCCESS;
    }
    
    NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath) {
        UNREFERENCED_PARAMETER(pDriverObject);
        UNREFERENCED_PARAMETER(pRegistryPath);
    
        PVOID pDriverBase = NULL;
        IrCreateCookie(pDriverBase); // Initialize the stack canary since wdk 10 is shit
    
        RtlInitUnicodeString(&drvName, L"\\Driver\\" DRIVER_NAME);
        return IoCreateDriver(&drvName, &Initialize);
    }
 
Ultima modifica:
Vengono fatti molti check di sicurezza sui driver Windows, dovresti vedere il valore del parametro 1 (corruption type) di KERNEL_SECURITY_CHECK_FAILURE (microsoft docs). Il fatto che l'errore viene dato solo se fai riferimento ai parametri potrebbe essere la mancanza dei dovuti controlli di sicurezza sui dati passati dalla user-mode, fai riferimento a questo paragrafo.
Comunque il security cookie va controllato prima di ritornare dalla funzione, salva l'NTSTATUS di ritorno da IoCreateDriver in una variabile, poi controlla il cookie e poi ritorni la variabile. La stack canary serve anche nella funzione Initialize.
 
  • Mi piace
Reazioni: DanyDollaro