Введение
Архитектура операционной системы 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 и избегать небезопасных операций с памятью.
Источники
- Цикл статей "Изучение вредоносных программ" | Шпаргалка по архитектуре винды | Osint42.Org - Безопасность и код
- Цикл статей "Изучение вредоносных программ" | Изучаем динамические библиотеки | Osint42.Org - Безопасность и код
- Цикл статей "Изучение вредоносных программ" | Процессы Windows | Osint42.Org - Безопасность и код
- Цикл статей "Изучение вредоносных программ" | Определение PID нужного процесса, или перечисления процессов | Osint42.Org - Безопасность и код
- Windows Documentation | Microsoft Learn
- Функции процессов и потоков - Win32 apps | Microsoft Learn
