Версия ядра

Тема в разделе "WASM.BEGINNERS", создана пользователем Aspire, 20 окт 2008.

  1. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Какой из 4-х (ntoskrnl.exe, ntkrnlmp.exe, ntkrnlpa.exe, ntkrpamp.exe)
    Как программно это узнать из юзермода?
    Пока что мысль только заюзать GetSystemInfo с дальнейшим в просмотром параметров: кол-во ядер и размер страницы.
    Или даже GetSystemInfo чтоб узнать кол-во процессоров + GlobalMemoryStatusEx чтобы узнать объем памяти..

    Проще можно?
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    SystemModuleInformation, первый модуль в списке.
     
  3. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Clerk
    Я об этом знаю, но хотелось бы обойтись без нее, потому как тут трабла следующая:
    после вызова SystemModuleInformation у меня обламывается LoadLibraryEx("ntkrnlpa.exe", 0, 1) с ошибкой ERROR_INVALID_PARAMETER.
    Если вызывать их в обратном порядке - то все норм.
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Aspire
    покажи код, так не должно быть. нужно избавлять не от симптомов, а от причин

    Могу тебя огорчить - параметром /KERNEL в boot.ini можно задать собственное ядро, указав например ntoskrnl.exe на многопроцессорной системе, либо вообще указать собственный файл, например chkdkrnl.exe - так делают при неполной устновке checked build файлов в систему (ядро, hal).
     
  5. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Проверить парамтры в boot.ini - не проблема
    Код (Text):
    1. start proc
    2. LOCAL pBUF:dword, szBUF:dword, hNtDll: dword, pKernelName: dword
    3. mov szBUF, 10000h
    4. mov hNtDll, f(GetModuleHandle, s("ntdll.dll"))
    5. mov pBUF, f(VirtualAlloc, 0, szBUF,MEM_COMMIT, PAGE_READWRITE)
    6. invoke GetProcAddress, hNtDll, s("NtQuerySystemInformation")
    7. xinvoke eax, SystemModuleInformation, pBUF, szBUF, NULL
    8. mov pKernelName, s("ntkrnlpa.exe")
    9. scan:
    10. @<xor ecx,ecx>, <xor eax,eax>
    11. mov ebx, pBUF
    12. mov ecx, dword ptr [ebx] ; число структур
    13. add ebx, 20h
    14. ;assume ebx: ptr SYSTEM_MODULE_INFORMATION
    15. .while ecx != 0
    16.     push ecx
    17.     invoke strcmpr, ebx, pKernelName, 0Ch
    18.     test eax,eax
    19.     jne @f
    20.         pop ecx
    21.         .break
    22.     @@:
    23.     pop ecx
    24.     dec ecx
    25.     add ebx, sizeof SYSTEM_MODULE_INFORMATION
    26. .endw
    27. sub ebx, 14h
    28. mov eax, dword ptr [ebx]
    29. push eax
    30. inv VirtualFree, pBUF, szBUF, MEM_DECOMMIT
    31. invoke LoadLibraryEx, s("ntkrnlpa"), 0, 1
    32. pop eax
    33. ret
    34. @@:
    35. invoke VirtualFree, pBUF, szBUF, MEM_DECOMMIT
    36. mov eax,-1
    37. ret
    38. start endp
    Фигня в том, что если не сканировать стуктуры, то вызов лоадлибрари проходит, если сканируем - нет. При этом не важно совободили мы память или нет.
    Код сокращен до минимума, повырезал лишнее. Не пойму в чем шляпа. Подскажите, плиз.
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Хз в чем смысл твоего кода который сканирует структуры ив се равно берет предопределенное имя ядра.
    Вот я переписал на Си - работает нормально. Выбирает имя ядра из структур

    Код (Text):
    1. #include <ntdll.h>
    2. #include <stdio.h>
    3.  
    4. int main()
    5. {
    6.     PVOID pBuffer;
    7.     ULONG BufferLength = 0x10000;
    8.     PSTR pKernelName = "ntkrnlpa.exe";
    9.     NTSTATUS Status;
    10.     HANDLE hKernel;
    11.  
    12.     pBuffer = VirtualAlloc (0, BufferLength, MEM_COMMIT, PAGE_READWRITE);
    13.     if (pBuffer)
    14.     {
    15.         Status = ZwQuerySystemInformation (SystemModuleInformation, pBuffer, BufferLength, NULL);
    16.         if (NT_SUCCESS(Status))
    17.         {
    18.             PSYSTEM_MODULE_INFORMATION modinfo = (PSYSTEM_MODULE_INFORMATION) pBuffer;
    19.  
    20.             char KernelName[1024];
    21.  
    22.             GetSystemDirectory (KernelName, sizeof(KernelName));
    23.             KernelName[2] = 0;
    24.  
    25.             lstrcat (KernelName, (char*)modinfo->Modules[0].Name);
    26.  
    27.             pKernelName = KernelName;
    28.         }
    29.  
    30.         VirtualFree (pBuffer, BufferLength, MEM_DECOMMIT);
    31.        
    32. load:
    33.         printf("KernelName = %s\n", pKernelName);
    34.  
    35.         hKernel = LoadLibraryEx (pKernelName, 0, 1);
    36.  
    37.         printf("hKernel = %08x (lasterr = %08x)\n", hKernel, GetLastError());
    38.     }
    39.  
    40.     return 0;
    41. }
    PS. в упор не понимаю зачем такой код на ассемблере писать :dntknw: есть же куда более удобный Си.
    PPS. Префикс sz означает не размер, а null-terminated строку.
     
  7. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Great
    Вообще верхняя процедура находит базу модуля по (заданному) его имени, посмотри по внимательнее. Этот факт замылен вызовом LoadLibraryEx, который я туда влепил для описания проблемы (на самом деле он находится в другой процедуре)
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Но ведь сначала нужно найти имя - это раз.
    Во-вторых, ты утверждал, что LoadLIbraryEx не работает послe ZwQuerySystemInfformation - я тебе привел обратный пример, где находится имя ядра и загружается. все чудесно работает.

    А зачем тебе искать базу неизвестного ядра я так и не понял до сих пор
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Great
    Вот скажи, у многих юзеров загружено ядро отличное от тех четырёх(ntoskrnl.exe, ntkrnlmp.exe, ntkrnlpa.exe, ntkrpamp.exe) ?
     
  10. Osen

    Osen Рие

    Публикаций:
    0
    Регистрация:
    5 апр 2008
    Сообщения:
    283
    Адрес:
    Париж
    Передавать ZwQuerySystemInformation буфер фиксированного размера - большой фейл. Надо передать буфер, например размера 4 байта, функция вернет STATUS_INFO_LENGTH_MISMATCH, и заполнит переменную нужным размером.
     
  11. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Osen
    Имхо, но STATUS_INFO_LENGTH_MISMATCH просто возвращает true если памяти выделенной под буфер мало, а мы уже сами увеличиваем выделенный буфер.

    Код (Text):
    1. Status = ZwQuerySystemInformation(SystemProcessesAndThreadsInformation,
    2.                                                   pBuffer,
    3.                                                   cbBuffer,
    4.                                                   NULL);
    5. if (Status == STATUS_INFO_LENGTH_MISMATCH){
    6.     ExFreePool(pBuffer);
    7.     cbBuffer *= 2;
    8. }
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    JCronuz
    Нет. Osen прав. Для некоторых инфоклассов не возвращается размер, для некоторых возвращается. Для SystemProcessesAndThreadsInformation возвращается требуемый размер.
    Код (Text):
    1. ZwQuerySystemInformation(SystemProcessesAndThreadsInformation, NULL, NULL, ReturnLength)
    вернёт в переменную ReturnLength необходимый размер буфера на момент вызова. Его следует немного увеличить, например на размер страницы.
     
  13. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Osen Вот пипец ты умный.