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.exe 或 win32k.sys 时出现这些错误(仍然没有在 Win 10 中测试)。
到 ntoskrnl.exe 0xc0000017 和 win32k.sys (使用 KeStackAttachProcess
到 csrss.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) - 由于进程禁止动态代码生成,操作被阻止。
似乎是基于错误的进程限制。
我想直接从两个内核模块(文件)和以下内容中获取基地址(不要与图像基地址混淆)从 Win XP 到 Win 7 x32,代码 100% 有效。
当我尝试在 Win 8.1 上映射 ntoskrnl.exe 或 win32k.sys 时出现这些错误(仍然没有在 Win 10 中测试)。
到 ntoskrnl.exe 0xc0000017 和 win32k.sys (使用 KeStackAttachProcess
到 csrss.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) - 由于进程禁止动态代码生成,操作被阻止。
似乎是基于错误的进程限制。