gpt4 book ai didi

c - Windows 驱动程序/Rootkit 开发 - 函数指针 - STATUS_INVALID_PARAMETER

转载 作者:行者123 更新时间:2023-11-30 16:47:03 25 4
gpt4 key购买 nike

这是一个很难在网上解释的问题,但我不知道发生了什么,我真的需要帮助,所以这里!

基本上,我编写了一个安全软件(作为内核驱动程序),最终将 Hook Windows XP(32 位)SSDT(系统服务描述符表)中的每个方法。每次进行系统调用时,我都会将其记录在文件中。

当我挂接 ZwOpenFile 时,出现了我的问题,因为这是一个系统调用,我的代码也会打开日志文件进行写入。所以我得到了一个内核堆栈溢出错误,因为有些东西会调用 ZwOpenFile,然后我会尝试记录它,我的记录器(这是我的驱动程序的一部分)然后会调用 ZwOpenFile,然后 ZwOpenFile 会调用 ZwOpenFile 等等,直到我填满堆栈上升足以导致蓝屏死机。

为了解决这个问题,我决定,每次调用记录器函数时,都会向它提供一个指向旧的、未 Hook 的 ZwOpenFile 函数的指针,这样它就可以直接调用该函数,而不是通过我的 Hook 函数并造成递归困惑。但是,当记录器调用作为参数提供的 ZwOpenFile 函数指针时,它会收到 STATUS_INVALID_PARAMETER 错误。如果直接调用 ZwOpenFile(而不是通过指针),它可以完美工作!但是,当调用指向具有相同参数的同一函数的指针时,它会抛出 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);
...
}

更重要的是,所有 Hook 函数都抛出 c000000d 错误(使用 DbgPrint),但是一两次,它确实以某种方式成功......任何帮助或建议将非常感谢!

最佳答案

首先您调用的不是ZwOpenFile,而是NtOpenFile。其次,当您从内核调用 ZwOpenFile 时,PreviousMode 是内核模式,并且 IopCreateFile 不检查参数(内核对内核的信任)。当您调用 NtOpenFile PreviousMode 可以是用户模式并检查参数。并且您在调用 NtOpenFile 中使用了无效参数 - 您使用了 FILE_SYNCHRONOUS_IO_ALERT 选项,但未在所需访问中请求 SYNCHRONIZE。所以你必须得到STATUS_INVALID_PARAMETER

关于c - Windows 驱动程序/Rootkit 开发 - 函数指针 - STATUS_INVALID_PARAMETER,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43502316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com