Детект открытия своего процесса другим процесом ring-3

Тема в разделе "WASM.BEGINNERS", создана пользователем Flaer, 7 апр 2022.

  1. Flaer

    Flaer Member

    Публикаций:
    0
    Регистрация:
    10 дек 2019
    Сообщения:
    32
    В общем такие дела, необходимо определить, что кто-то открыл мой процесс.
    Могу ли я получить список всех хендлов в системе при помощи NtQuerySystemInformation с классом SystemHandleInformation, а затем отсеивая все хендлы являющиеся по типу хендлами "процесса" и получать для этих хендлов соответствующий им PID, если этот PID соответствует моему, значит меня кто-то открыл ? Или это так не работает ? Я пока что не разобрался где именно искать тип хендла, но по названию поля в структуре SYSTEM_HANDLE_TABLE_ENTRY_INFO это выглядит как ObjectTypeNumber, если рассуждаю неверно пните в нужную сторону
     

    Вложения:

    • 000.png
      000.png
      Размер файла:
      6,7 КБ
      Просмотров:
      151
  2. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.498
    Адрес:
    Россия, Нижний Новгород
    Ты можешь получить имя типа хэндла и на основе этого искать хэндлы процессов. Чтобы получить PID процесса, на который указывает хэндл, скопируй хэндл к себе через DuplicateHandle и получи PID через GetProcessId(hDuplicatedHandle).
    Пример определения имени типа хэндла:
    Код (C++):
    1.  
    2. extern "C" NTSYSCALLAPI NTSTATUS NtQueryObject(
    3.     IN OPTIONAL HANDLE Handle,
    4.     IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
    5.     OUT OPTIONAL PVOID ObjectInformation,
    6.     IN ULONG ObjectInformationLength,
    7.     OUT OPTIONAL PULONG ReturnLength
    8. );
    9.  
    10. std::wstring getTypeName(const HANDLE handle)
    11. {
    12.     std::vector<unsigned char> buf(64);
    13.  
    14.     ULONG returnedLength = 0;
    15.     const NTSTATUS status = NtQueryObject(handle, OBJECT_INFORMATION_CLASS::ObjectTypeInformation, &buf[0], static_cast<ULONG>(buf.size()), &returnedLength);
    16.     if (!NT_SUCCESS(status))
    17.     {
    18.         if (status != STATUS_INFO_LENGTH_MISMATCH)
    19.         {
    20.             return {};
    21.         }
    22.  
    23.         buf.resize(returnedLength);
    24.         const NTSTATUS retryStatus = NtQueryObject(handle, OBJECT_INFORMATION_CLASS::ObjectTypeInformation, &buf[0], static_cast<ULONG>(buf.size()), &returnedLength);
    25.         if (!NT_SUCCESS(retryStatus))
    26.         {
    27.             return {};
    28.         }
    29.     }
    30.  
    31.     const auto* const info = reinterpret_cast<const PUBLIC_OBJECT_TYPE_INFORMATION*>(buf.data());
    32.     std::wstring name(info->TypeName.Buffer, info->TypeName.Length / sizeof(wchar_t));
    33.     if (name.back() == L'\0')
    34.     {
    35.         name.pop_back();
    36.     }
    37.  
    38.     return name;
    39. }
    40.  
    41. int main()
    42. {
    43.     HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessId());
    44.     const auto typeName = getTypeName(hProcess);
    45.     // typeName == L"Process"
    46. }
    47.  
    Как найдёшь хэндл с именем типа L"Process" - посмотри, какой у него индекс типа - такой же индекс будет у всех хэндлов этого типа (чтобы не дёргать на каждый хэндл NtQueryObject).
     
    M0rg0t нравится это.