Разработка драйвера Windows / руткитов - указатель на функцию - STATUS_INVALID_PARAMETER

Это довольно сложная проблема, чтобы объяснить в Интернете, но я не могу понять, что происходит, и мне действительно нужна помощь, так что здесь!

По сути, я написал программное обеспечение для обеспечения безопасности (в качестве драйвера ядра), которое в конечном итоге перехватит все методы в SSDT (таблица дескрипторов системных служб) для Windows XP - 32-разрядная версия. Каждый раз, когда выполняется системный вызов, я записываю его в файл.

Моя проблема возникла, когда я подключил ZwOpenFile, потому что это системный вызов, который МОЙ код также делает, чтобы открыть файл журнала для записи в него. Итак, я получил ошибку переполнения стека ядра, потому что что-то вызывало бы ZwOpenFile, затем я пытался записать это в журнал, мой регистратор (который является частью моего драйвера) затем вызывал бы ZwOpenFile, который затем вызывал бы ZwOpenFile и так далее, и так далее, пока я не заполнил до стека достаточно, чтобы вызвать синий экран смерти.

Чтобы обойти это, я решил, что каждый раз, когда вызывается функция регистратора, она также будет снабжена указателем на старую функцию ZwOpenFile, отцепленную от нее, чтобы она могла вызывать ее напрямую, а не проходить через мою подключенную функцию и создавать рекурсивный беспорядок Однако, когда регистратор вызывает указатель функции ZwOpenFile, который он предоставляет в качестве параметра, он получает ошибку STATUS_INVALID_PARAMETER. Если ZwOpenFile вызывается напрямую (в отличие от указателя), он работает отлично! Но когда вызывается указатель на то, что должно быть той же функцией с параметрами SAME, он выдает код ошибки STATUS_INVALID_PARAMETER! Однако указатель должен указывать на правильную функцию, иначе он не выдаст это сообщение об ошибке Windows. Вот небольшие и (надеюсь) удобочитаемые фрагменты моего кода, чтобы сделать их более понятными:

*mydriver.h*
    #define UNICODE
    #define _UNICODE
    #include <ntddk.h>
    #include <ntstrsafe.h>

    #define OPEN_FILE_INDEX 0x74

    NTSTATUS newZwOpenFile(
        PHANDLE FileHandle, 
        ACCESS_MASK DesiredAccess, 
        POBJECT_ATTRIBUTES ObjectAttributes, 
        PIO_STATUS_BLOCK IoStatusBlock, 
        ULONG ShareAccess, 
        ULONG OpenOptions);

    typedef NTSTATUS (*ZwOpenFilePtr)(
        PHANDLE FileHandle, 
        ACCESS_MASK DesiredAccess, 
        POBJECT_ATTRIBUTES ObjectAttributes, 
        PIO_STATUS_BLOCK IoStatusBlock, 
        ULONG ShareAccess, 
        ULONG OpenOptions);

*mydriver.c*
    #include "mydriver.h"
    #include "filehandling.c"        

    //global definition of pointer at top of mydriver.c file    
    ZwOpenFilePtr oldZwOpenFile;

    NTSTATUS DriverEntry(PDRIVER_OBJECT  pDriverObject, PUNICODE_STRING pRegistryPath){
       ...
       ...
       //hooks the SSDT using the index of ZwOpenFile in the SSDT
       oldZwOpenFile = (ZwOpenFilePtr)hookSSDTWithIndex(OPEN_FILE_INDEX, (BYTE*)newZwOpenFile, (DWORD*)systemCallTable);
       ...
       ...
    }

    //inside the method body of every hooked function, there is, at some point, the a call to the logger. 
    //This is shown in the context of newZwOpenFile
    NTSTATUS newZwOpenFile(PHANDLE FileHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, PIO_STATUS_BLOCK IoStatusBlock, ULONG ShareAccess, ULONG OpenOptions){
      ...         
      driverWriteFile(&uFullString, &uProcess, *oldZwOpenFile);
      ...
    }

*filehandling.c*
    #include <ntstrsafe.h>

    //the logger file
    //the function doing the opening and writing
    NTSTATUS driverWriteFile(PUNICODE_STRING stringToLog, PUNICODE_STRING filename, NTSTATUS (*fileOpenFunction)(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES,PIO_STATUS_BLOCK,ULONG,ULONG)) {
      ...
      //the failing call that returns c000000d
      ntstatus = fileOpenFunction(&handle, FILE_APPEND_DATA, &objAttr, &ioStatusBlock, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_SYNCHRONOUS_IO_NONALERT);
      ...
  }

Более того, все перехваченные функции извергают ошибку c000000d (используя DbgPrint), но один или два раза это как-то удается... Любая помощь или предложения будут с благодарностью приветствоваться!

1 ответ

Сначала ты не звонишь ZwOpenFile но NtOpenFile, во второй раз, когда вы звоните ZwOpenFile из предыдущего режима ядра является режим ядра и IopCreateFile не проверять параметры (доверие к ядру для ядра). когда ты звонишь NtOpenFile PreviousMode может быть пользовательским режимом, а параметры проверены. и вы используете недопустимые параметры в вызове NtOpenFile - ты используешь FILE_SYNCHRONOUS_IO_ALERT вариант, но не просить SYNCHRONIZE в желаемом доступе. так ты и должен достать STATUS_INVALID_PARAMETER,

Другие вопросы по тегам