Я хочу получить базовый адрес (не путать с основа изображения) непосредственно из двух модулей ядра (файлов) и следующий код работает на 100% от Win XP до Win 7 x32.
Эти ошибки возникают, когда я пытаюсь отобразить ntoskrnl.exe или же win32k.sys на Win 8.1 (до сих пор не проверено в 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
);
На основании кодов ошибок:
Похоже, ограничение процесса на основе ошибки.
Других решений пока нет …