ZwMapViewOfSection:错误 0xc0000017(至 ntoskrnl.exe)和 0xc0000604(至 win32k.sys)

ZwMapViewOfSection: error 0xc0000017 (to ntoskrnl.exe) and 0xc0000604 (to win32k.sys)

我想直接从两个内核模块(文件)和以下内容中获取基地址(不要与图像基地址混淆)从 Win XP 到 Win 7 x32,代码 100% 有效。

当我尝试在 Win 8.1 上映射 ntoskrnl.exewin32k.sys 时出现这些错误(仍然没有在 Win 10 中测试)。

ntoskrnl.exe 0xc0000017win32k.sys (使用 KeStackAttachProcesscsrss.exe 过程,(没有 KeStackAttachProcess 未测试)来自 0xc0000604 (未记录的错误)).

如何修复?

#define SEC_IMAGE 0x1000000

   ///////////////////////////// VARIABLES ///////////////////////////////////

    CHAR buf[MAXIMUM_FILENAME_LENGTH]="\SystemRoot\system32\ntoskrnl.exe";
    OBJECT_ATTRIBUTES oaNtoskrnl,oa;
    IO_STATUS_BLOCK stStatusBlock;
    HANDLE hNtoskrnl=0,hSection=0;
    UNICODE_STRING us;
    PVOID pNtoskrnl=0;
    ULONG dwViewSize=0;
    STRING as;

   //////////////////////////////////////////////////////////////////////////

        RtlInitString(&as,(PCSZ)buf);
        RtlAnsiStringToUnicodeString(&us,&as,TRUE);

        DbgPrint("%wZ", &us);

        InitializeObjectAttributes(&oaNtoskrnl,&us,OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,NULL,NULL);

        status=ZwCreateFile(
        &hNtoskrnl,
        FILE_READ_DATA,
        &oaNtoskrnl,
        &stStatusBlock,
        NULL,
        FILE_ATTRIBUTE_NORMAL,
        FILE_SHARE_READ|FILE_SHARE_WRITE,
        FILE_OPEN,
        NULL,
        NULL,
        NULL);

    RtlFreeUnicodeString(&us);

    if(!NT_SUCCESS(status))
    {
        DbgPrint("Failed ZwCreateFile! 0x%x \n", status);
    }

    InitializeObjectAttributes(&oa,NULL,OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,NULL,NULL);

    status=ZwCreateSection(
        &hSection,
        SECTION_MAP_READ,
        &oa,
        NULL,
        PAGE_READONLY,
        SEC_IMAGE,
        hNtoskrnl
        );
    if(!NT_SUCCESS(status))
    {
        DbgPrint(("Failed ZwCreateSection! 0x%x \n", status));
        ZwClose(hNtoskrnl);
    }

    status=ZwMapViewOfSection(
        hSection,
        NtCurrentProcess(),
        &pNtoskrnl,
        16,
        NULL,
        NULL,
        &dwViewSize,
        ViewUnmap,
        NULL,
        PAGE_READWRITE
        );

    if(!NT_SUCCESS(status))
    {
        DbgPrint("Failed ZwMapViewOfSection! 0x%x \n", status);
        ZwClose(hSection);
        ZwClose(hNtoskrnl);
    }

    DbgPrint("Initialize finished! 0x%x \n", pNtoskrnl); 

    ZwUnmapViewOfSection(NtCurrentProcess(), pNtoskrnl);
    ZwClose(hSection);
    ZwClose(hNtoskrnl); 

编辑:

这里的建议部分更改后,但仍然有同样的问题(现在也在 Win 10 上测试)。

ULONG modsz = 0; // receives size of file after execute MyEnumKernelModule()

MyEnumKernelModule("\systemroot\system32\win32k.sys",&ModuleAddress, &modsz);

status=ZwCreateSection(
        &hSection,
        SECTION_ALL_ACCESS,
        &oa,
        (PLARGE_INTEGER)modsz,
        PAGE_EXECUTE_READWRITE,
        SEC_COMMIT,
        hNtoskrnl
        );

status=ZwMapViewOfSection(
        hSection,
        NtCurrentProcess(),
        &pNtoskrnl,
        NULL,
        NULL,
        NULL,
        &modsz,
        ViewUnmap,
        MEM_RESERVE,
        PAGE_EXECUTE_READWRITE
        );

基于错误代码:

  • 错误代码:(NTSTATUS) 0xc0000017 (3221225495) - {没有足够的配额}没有足够的虚拟内存或分页文件配额可用于完成指定的操作。
  • 错误代码:(NTSTATUS) 0xc0000604 (3221227012) - 由于进程禁止动态代码生成,操作被阻止。

似乎是基于错误的进程限制。