ZwQuerySystemInformation возвращает c0000003 STATUS_INVALID_INFO_CLASS
От: dongyi  
Дата: 20.05.13 07:26
Оценка:
вызываю ZwQuerySystemInformation с SystemModuleInformation, возвращает c0000003 STATUS_INVALID_INFO_CLASS. работаю на windows 7 64 бит.
исходный код (KernelGetModuleBase): http://alter.org.ua/ru/docs/nt_kernel/procaddr/#KernelGetModuleBase
в чем может быть проблема?
Re: ZwQuerySystemInformation возвращает c0000003 STATUS_INVALID_INFO_CLASS
От: enigmas Ниоткуда  
Дата: 20.05.13 07:36
Оценка:
Здравствуйте, 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 байта содержат мусор, парамерт класса получается неправильный.

Точно такая ошибка есть в free pascal.
The Enigma Protector — software protection system
http://enigmaprotector.com/
Re: ZwQuerySystemInformation возвращает c0000003 STATUS_INVALID_INFO_CLASS
От: enigmas Ниоткуда  
Дата: 20.05.13 07:40
Оценка:
Здравствуйте, 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 байт, от этого и косяки.

typedef enum _SECTION_INFORMATION_CLASS {
SectionBasicInformation,
SectionImageInformation
} SECTION_INFORMATION_CLASS, *PSECTION_INFORMATION_CLASS ;
The Enigma Protector — software protection system
http://enigmaprotector.com/
Re: ZwQuerySystemInformation возвращает c0000003 STATUS_INVALID_INFO_CLASS
От: anonymous185  
Дата: 20.05.13 07:56
Оценка:
если возвращает c0000003 STATUS_INVALID_INFO_CLASS то однозначно SystemModuleInformation неправильно определён (!= 11). а вообще код по сылке просто жесть. например __try/__except зачем ? типа незнаю, но на всякий случай пусть будет ?
Re[2]: ZwQuerySystemInformation возвращает c0000003 STATUS_INVALID_INFO_CLASS
От: anonymous185  
Дата: 20.05.13 07:57
Оценка:
параметр SystemInformationClass у вас имеет размер dword — 4 байта всегда, на x64 тоже
Re[2]: ZwQuerySystemInformation возвращает c0000003 STATUS_INVALID_INFO_CLASS
От: acDev Россия  
Дата: 20.05.13 10:39
Оценка:
Здравствуйте, 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) {   // PE
          if (PEAddr) *PEAddr = (PVOID)&nt->Signature;
          KdPrint(("KernelGetModuleBaseByPtr: find NtosBase = %p, PE = %p \n", p, (PVOID)&nt->Signature));
          return p;
        }       
      }
    }    
  }        
  return NULL;
}


Работает на всех системах (x86 + x64).
Но вот что скажут ядерные эксперты по поводу использования MmIsAddressValid ?
Re[2]: ZwQuerySystemInformation возвращает c0000003 STATUS_INVALID_INFO_CLASS
От: dongyi  
Дата: 20.05.13 12:06
Оценка:
обновил определение функции на ZwQuerySystemInformation и код заработал.
NTSTATUS NTAPI ZwQuerySystemInformation(
    IN ULONG SystemInformationClass,
    IN OUT PVOID SystemInformation,
    IN ULONG SystemInformationLength,
    OUT PULONG ReturnLength OPTIONAL ) ;
Re[2]: ZwQuerySystemInformation возвращает c0000003 STATUS_INVALID_INFO_CLASS
От: drVanо Россия https://vmpsoft.com
Дата: 26.06.13 03:07
Оценка:
Здравствуйте, 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 ;

Я просто поражаюсь как вы с такими знаниями умудряетесь писать коммерческий протектор Такие перлы выдаете, шо пипец.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.