Архитектура Windows для исследования защиты: процессы, потоки, DLL и перечисление процессов

Введение​


Архитектура операционной системы Windows представляет собой сложную экосистему, в которой процессы, потоки, динамические библиотеки (DLL) и управление памятью взаимодействуют между собой для обеспечения стабильной работы приложений. Понимание этих компонентов особенно важно при исследовании защиты, поскольку они служат основой для реализации механизмов безопасности, таких как ASLR, DEP, и контроль доступа к памяти.

В данной статье рассматриваются ключевые аспекты архитектуры Windows, включая структуру процессов и потоков, работу с DLL, а также методы получения информации о запущенных процессах. Эти знания необходимы для разработчиков, исследователей безопасности и специалистов по анализу вредоносного ПО.

Процессы в Windows​


Процесс в Windows — это экземпляр выполняющейся программы, который имеет собственное адресное пространство и ресурсы. Каждый процесс включает в себя один или несколько потоков, а также данные, необходимые для его выполнения. Процессы создаются и управляются через API Windows, например, с помощью функции CreateProcess или CreateProcessAsUser.

Структура процесса​


Каждый процесс в Windows связан с объектом PEB (Process Environment Block), который содержит информацию о состоянии процесса, включая:

  • Список загруженных модулей (DLL)
  • Параметры запуска процесса
  • Информацию о среде выполнения

PEB представлен в виде структуры, включающей поля, такие как Ldr (для загрузчика), ProcessParameters (параметры запуска), и PostProcessInitRoutine (пользовательская инициализация).

Типы памяти процесса​


В Windows различают три типа памяти, которые определяют уровень доступа к страницам:

  • Свободная — страница не используется, недоступна для процесса.
  • Зарезервированная — зарезервирована для будущего использования, недоступна и не связана с физической памятью.
  • Закоммитированная — страница доступна и может быть загружена в физическую память при необходимости.

Каждая закоммитированная страница имеет определённые атрибуты защиты, такие как:

  • PAGE_NOACCESS — запрещает любой доступ к странице.
  • PAGE_READONLY — разрешает только чтение.
  • PAGE_EXECUTE_READWRITE — разрешает чтение, запись и выполнение (опасно).

Защита памяти​


Windows предоставляет механизмы защиты памяти, такие как DEP (Data Execution Prevention) и ASLR (Address Space Layout Randomization):

  • DEP — предотвращает выполнение кода в области памяти, помеченной как readonly.
  • ASLR — случайное расположение ключевых областей данных, таких как база исполняемого файла, стека, кучи и DLL, чтобы усложнить эксплуатацию уязвимостей.

Потоки в Windows​


Поток — это единица выполнения внутри процесса. Каждый поток имеет свой стек, регистры и указатель инструкции. Потоки внутри одного процесса разделяют адресное пространство, но имеют собственные ресурсы, такие как стек и контекст.

Структура потока​


Каждый поток связан с объектом TEB (Thread Environment Block), который содержит информацию о состоянии потока, включая:

  • Стек потока
  • Локальные переменные
  • Указатели на глобальные данные

TEB также включает информацию о TLS (Thread Local Storage), что позволяет потокам иметь свои локальные данные.

Управление потоками​


Windows предоставляет функции для управления потоками:

  • CreateThread — создаёт новый поток.
  • OpenThread — получает дескриптор существующего потока.
  • SuspendThread / ResumeThread — приостанавливает и возобновляет поток.

Динамические библиотеки (DLL) в Windows​


DLL — это файл, содержащий код и данные, которые могут быть использованы несколькими процессами. Использование DLL позволяет эффективно использовать память и повторно использовать код.

Типы DLL​


  • System DLL — встроенные библиотеки, такие как kernel32.dll, ntdll.dll, user32.dll.
  • Application DLL — пользовательские библиотеки, разрабатываемые для конкретных приложений.

ntdll.dll и Native API​


ntdll.dll — это системная DLL, которая предоставляет Native API (NTAPI), который используется для взаимодействия с ядром Windows. NTAPI — это более низкоуровневый интерфейс, чем WinAPI, и предоставляет прямой доступ к функциям ядра.

Загрузка DLL​


DLL можно загрузить в процесс с помощью функций:

  • LoadLibrary — загружает DLL и возвращает дескриптор.
  • GetProcAddress — получает адрес функции в загруженной DLL.

Пример загрузки DLL и вызова функции:

C:
HMODULE hModule = LoadLibraryA("sampleDLL.dll");
PVOID pHelloWorld = GetProcAddress(hModule, "HelloWorld");
typedef void (WINAPI* HelloWorldFunctionPointer)();
HelloWorldFunctionPointer HelloWorld = (HelloWorldFunctionPointer)pHelloWorld;
HelloWorld();

Экспорт функций DLL​


Функции DLL могут быть экспортированы с помощью файла .def или аннотаций в коде:

C:
extern "C" __declspec(dllexport) void HelloWorld() {
    // Функция кода
}

Перечисление процессов в Windows​


Для получения информации о запущенных процессах в Windows можно использовать функции API, такие как NtQuerySystemInformation.

Структура SYSTEM_PROCESS_INFORMATION​


Структура SYSTEM_PROCESS_INFORMATION содержит информацию о каждом процессе, включая:

  • Имя процесса (ImageName)
  • ID процесса (UniqueProcessId)
  • Количество потоков (NumberOfThreads)
  • Размеры виртуальной памяти (VirtualSize)

Пример перечисления процессов​


C:
// Получение адреса NtQuerySystemInformation
fnNtQuerySystemInformation pNtQuerySystemInformation = (fnNtQuerySystemInformation)GetProcAddress(GetModuleHandle(L"NTDLL.DLL"), "NtQuerySystemInformation");

// Первый вызов для получения необходимого размера буфера
pNtQuerySystemInformation(SystemProcessInformation, NULL, NULL, &uReturnLen1);

// Выделение памяти
PSYSTEM_PROCESS_INFORMATION SystemProcInfo = (PSYSTEM_PROCESS_INFORMATION)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (SIZE_T)uReturnLen1);

// Второй вызов для получения данных
pNtQuerySystemInformation(SystemProcessInformation, SystemProcInfo, uReturnLen1, &uReturnLen2);

// Обход списка процессов
while (TRUE) {
    if (wcscmp(SystemProcInfo->ImageName.Buffer, L"notepad.exe") == 0) {
        // Найден нужный процесс
        break;
    }
    if (!SystemProcInfo->NextEntryOffset) break;
    SystemProcInfo = (PSYSTEM_PROCESS_INFORMATION)((ULONG_PTR)SystemProcInfo + SystemProcInfo->NextEntryOffset);
}

Управление памятью и защита​


В Windows управление памятью осуществляется через механизм страниц памяти. Каждая страница может находиться в одном из трёх состояний:

  • Свободная — не используется.
  • Зарезервированная — зарезервирована, но не связана с физической памятью.
  • Закоммитированная — доступна, может быть загружена в физическую память.

Атрибуты защиты страниц​


  • PAGE_NOACCESS — запрещает любой доступ.
  • PAGE_READONLY — разрешает только чтение.
  • PAGE_EXECUTE_READWRITE — разрешает чтение, запись и выполнение.

DEP и ASLR​


  • DEP — предотвращает выполнение кода в области памяти, помеченной как readonly.
  • ASLR — случайное расположение ключевых областей данных, чтобы усложнить эксплуатацию уязвимостей.

Взаимодействие с ядром Windows​


Windows предоставляет механизм взаимодействия с ядром через NTAPI. Ядро Windows находится в файле ntoskrnl.exe и управляет ресурсами системы.

Пример вызова NTAPI​


C:
NTSTATUS status = NtQuerySystemInformation(SystemProcessInformation, buffer, size, &returnLength);

Заключение​


Архитектура Windows включает сложную систему процессов, потоков, DLL и управления памятью. Понимание этих механизмов необходимо для разработки защищённых приложений, анализа вредоносного ПО и реализации механизмов безопасности. Использование функций, таких как NtQuerySystemInformation, LoadLibrary, и CreateThread, позволяет эффективно взаимодействовать с системой и получать информацию о процессах и потоках.

Для безопасного и точного анализа рекомендуется использовать только проверенные API и избегать небезопасных операций с памятью.

Источники​


 
Назад
Верх Низ