Здравствуйте, dongyi, Вы писали:
D>вызываю ZwQuerySystemInformation с SystemModuleInformation, возвращает c0000003 STATUS_INVALID_INFO_CLASS. работаю на windows 7 64 бит. D>исходный код (KernelGetModuleBase): http://alter.org.ua/ru/docs/nt_kernel/procaddr/#KernelGetModuleBase D>в чем может быть проблема?
Скорее всего неправильно определена функция ZwQuerySystemInformation, параметр SystemInformationClass у вас имеет размер dword — 4 байта, а надо qword — 8 байт (если компилируете на x64 соответственно). Так что получается система ложит в нижние 4 байта правильную информацию, а в верхние — мусор. Система распознает класс как 8ми байтовое значение и так как верхние 4 байта содержат мусор, парамерт класса получается неправильный.
Здравствуйте, dongyi, Вы писали:
D>вызываю ZwQuerySystemInformation с SystemModuleInformation, возвращает c0000003 STATUS_INVALID_INFO_CLASS. работаю на windows 7 64 бит. D>исходный код (KernelGetModuleBase): http://alter.org.ua/ru/docs/nt_kernel/procaddr/#KernelGetModuleBase D>в чем может быть проблема?
Выравнивание надо поставить вот для этой структуры, чтобы на x86 она была 4 байта, а на x64 — 8 байт.
У вас тут компилятор скорее всего думает что она размером в 1 байт, от этого и косяки.
если возвращает c0000003 STATUS_INVALID_INFO_CLASS то однозначно SystemModuleInformation неправильно определён (!= 11). а вообще код по сылке просто жесть. например __try/__except зачем ? типа незнаю, но на всякий случай пусть будет ?
Здравствуйте, anonymous185, Вы писали:
A>а вообще код по сылке просто жесть. например __try/__except зачем ? типа незнаю, но на всякий случай пусть будет ?
Вот тоже не знаю зачем автор так написал. Но сам дров UniATA нормально написан.
В своём кодесе так ищу базу ядра:
PVOID KernelGetModuleBaseByPtr(IN PVOID ptrInSection, OUT PVOID * PEAddr)
{
PUCHAR p;
PIMAGE_DOS_HEADER dos;
PIMAGE_NT_HEADERS nt;
p = (PUCHAR)((SIZE_T)ptrInSection & ~(PAGE_SIZE-1));
KdPrint(("KernelGetModuleBaseByPtr: START at %p ... \n", ptrInSection));
for( ; p; p -= PAGE_SIZE) {
if ((SSIZE_T)p >= 0) break;
if (!MmIsAddressValid(p)) {
KdPrint(("KernelGetModuleBaseByPtr: BAD Addr = %p \n", p));
continue;
}
dos = (PIMAGE_DOS_HEADER)p;
if (dos->e_magic == IMAGE_DOS_SIGNATURE) { // MZ
nt = (PIMAGE_NT_HEADERS)((SIZE_T)dos + dos->e_lfanew);
if (((SIZE_T)nt > (SIZE_T)dos) && ((SIZE_T)nt < (SIZE_T)ptrInSection)) {
if (nt->Signature == IMAGE_NT_SIGNATURE) { // PEif (PEAddr) *PEAddr = (PVOID)&nt->Signature;
KdPrint(("KernelGetModuleBaseByPtr: find NtosBase = %p, PE = %p \n", p, (PVOID)&nt->Signature));
return p;
}
}
}
}
return NULL;
}
Работает на всех системах (x86 + x64).
Но вот что скажут ядерные эксперты по поводу использования MmIsAddressValid ?
обновил определение функции на ZwQuerySystemInformation и код заработал.
NTSTATUS NTAPI ZwQuerySystemInformation(
IN ULONG SystemInformationClass,
IN OUT PVOID SystemInformation,
IN ULONG SystemInformationLength,
OUT PULONG ReturnLength OPTIONAL ) ;
Здравствуйте, enigmas, Вы писали:
E>Выравнивание надо поставить вот для этой структуры, чтобы на x86 она была 4 байта, а на x64 — 8 байт. E>У вас тут компилятор скорее всего думает что она размером в 1 байт, от этого и косяки.
E>typedef enum _SECTION_INFORMATION_CLASS { E> SectionBasicInformation, E> SectionImageInformation E>} SECTION_INFORMATION_CLASS, *PSECTION_INFORMATION_CLASS ;
Я просто поражаюсь как вы с такими знаниями умудряетесь писать коммерческий протектор Такие перлы выдаете, шо пипец.