В предыдущих версиях статей, было очень краткое ознакомление каких-то базовых вещей, без которых вообще проблематично вести разработку.
Понятно что этого недостаточно, но какое-то направление может дать.
Думаю это последняя статья, по теории и следующие статьи будут уже предметные, посвященные конкретно малвари...
Что такое процесс Windows?
Процесс Windows - это программа или приложение, выполняющееся на машине с Windows. Процесс может быть запущен как пользователем, так и самой системой. Процесс потребляет ресурсы, такие как память, дисковое пространство и процессорное время, чтобы выполнить задачу.
Потоки процесса
Процессы Windows состоят из одного или нескольких потоков, которые выполняются одновременно. Поток — это набор инструкций, которые могут выполняться независимо в рамках процесса. Потоки внутри процесса могут обмениваться данными. Потоки планируются к выполнению операционной системой и управляются в контексте процесса.
Память процесса
Процессы Windows также используют память для хранения данных и инструкций. Память выделяется для процесса при его создании, и объем выделенной памяти может устанавливаться самим процессом. Операционная система управляет памятью с использованием виртуальной и физической памяти. Виртуальная память позволяет операционной системе использовать больше памяти, чем физически доступно, создавая виртуальное адресное пространство, которое может быть доступно приложениям. Эти виртуальные адресные пространства разделены на "страницы", которые затем выделяются процессам.
Типы памяти
Процессы могут иметь разные типы памяти:
- Приватная память предназначена для одного процесса и не может быть поделена с другими процессами. Этот тип памяти используется для хранения данных, специфичных для процесса.
- Отображенная память может быть разделена между двумя или несколькими процессами. Она используется для обмена данными между процессами, например, общими библиотеками, общими сегментами памяти и общими файлами. Отображенная память видима для других процессов, но защищена от изменений другими процессами.
- Память образа содержит код и данные исполняемого файла. Она используется для хранения кода и данных, используемых процессом, таких как код программы, данные и ресурсы. Память образа часто связана с файлами DLL, загруженными в адресное пространство процесса.
Process Environment Block (PEB) - это структура данных в Windows, которая содержит информацию о процессе, такую как его параметры, информацию о запуске, информацию о выделенной куче, загруженные DLL и другое. Он используется операционной системой для хранения информации о запущенных процессах и загрузчиком Windows для запуска приложений. Также он хранит информацию о процессе, такую как идентификатор процесса (PID) и путь к исполняемому файлу.
Каждый созданный процесс имеет свою собственную структуру данных PEB, которая содержит свой собственный набор информации о нем.
Структура PEB
Структура PEB в C показана ниже. Зарезервированные члены этой структуры можно игнорировать.
C:
typedef struct _PEB {
BYTE Reserved1[2];
BYTE BeingDebugged;
BYTE Reserved2[1];
PVOID Reserved3[2];
PPEB_LDR_DATA Ldr;
PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
PVOID Reserved4[3];
PVOID AtlThunkSListPtr;
PVOID Reserved5;
ULONG Reserved6;
PVOID Reserved7;
ULONG Reserved8;
ULONG AtlThunkSListPtr32;
PVOID Reserved9[45];
BYTE Reserved10[96];
PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;
BYTE Reserved11[128];
PVOID Reserved12[1];
ULONG SessionId;
} PEB, *PPEB;
Незарезервированные члены объясняются ниже.
BeingDebugged
BeingDebugged - это флаг в структуре PEB, который указывает, отлаживается процесс или нет. Он устанавливается в 1 (TRUE), когда процесс отлаживается, и 0 (FALSE), когда он не отлаживается. Он используется загрузчиком Windows для определения, следует ли запускать приложение с подключенным отладчиком или нет.
Ldr
Ldr - это указатель на структуру PEB_LDR_DATA в PEB. Эта структура содержит информацию о модулях динамической библиотеки (DLL) процесса. Она включает в себя список загруженных в процесс DLL, базовый адрес каждой DLL и размер каждого модуля. Он используется загрузчиком Windows для отслеживания загруженных в процесс DLL. Структура PEB_LDR_DATA показана ниже.
C:
typedef struct _PEB_LDR_DATA {
BYTE Reserved1[8];
PVOID Reserved2[3];
LIST_ENTRY InMemoryOrderModuleList;
} PEB_LDR_DATA, *PPEB_LDR_DATA;
Ldr может быть использован для поиска базового адреса определенной DLL, а также для определения функций, находящихся в ее адресном пространстве. Это будет использоваться в будущих модулях для создания пользовательской версии GetModuleHandleA/W для дополнительной скрытности.
ProcessParameters
ProcessParameters - это структура данных в PEB. Она содержит параметры командной строки, переданные процессу при его создании. Загрузчик Windows добавляет эти параметры в структуру PEB процесса. ProcessParameters - это указатель на структуру RTL_USER_PROCESS_PARAMETERS, показанную ниже.
C:
typedef struct _RTL_USER_PROCESS_PARAMETERS {
BYTE Reserved1[116];
PVOID Reserved2[10];
UNICODE_STRING ImagePathName;
UNICODE_STRING CommandLine;
} RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;
ProcessParameters будет использоваться в будущих статьях для выполнения таких действий, как подмена командной строки.
AtlThunkSListPtr & AtlThunkSListPtr32
AtlThunkSListPtr и AtlThunkSListPtr32 используются модулем ATL (Active Template Library) для хранения указателя на связанный список функций преобразования. Функции преобразования используются для вызова функций, реализованных в другом адресном пространстве, они часто представляют функции, экспортируемые из файла DLL (Dynamic Link Library). Связанный список функций преобразования используется модулем ATL для управления процессом преобразования.
PostProcessInitRoutine
Поле PostProcessInitRoutine в структуре PEB используется для хранения указателя на функцию, которая вызывается операционной системой после завершения инициализации TLS (Thread Local Storage) для всех потоков в процессе. Эта функция может быть использована для выполнения любых дополнительных задач инициализации, необходимых для процесса.
TLS и обратные вызовы TLS будут рассмотрены подробнее позже, когда это потребуется.
SessionId
SessionId в PEB - это уникальный идентификатор, присвоенный одной сессии. Он используется для отслеживания активности пользователя во время сессии.
Thread Environment Block (TEB)
Thread Environment Block (TEB) - это структура данных в Windows, которая хранит информацию о потоке. Он содержит окружение потока, контекст безопасности и другую связанную информацию. Он хранится в стеке потока и используется ядром Windows для управления потоками.
Структура TEB
Структура TEB в C показана ниже. Зарезервированные члены этой структуры можно игнорировать.
C:
typedef struct _TEB {
PVOID Reserved1[12];
PPEB ProcessEnvironmentBlock;
PVOID Reserved2[399];
BYTE Reserved3[1952];
PVOID TlsSlots[64];
BYTE Reserved4[8];
PVOID Reserved5[26];
PVOID ReservedForOle;
PVOID Reserved6[4];
PVOID TlsExpansionSlots;
} TEB, *PTEB;
ProcessEnvironmentBlock (PEB)
Это указатель на структуру PEB, рассмотренную выше. PEB находится внутри Блока окружения потока (TEB) и используется для хранения информации о текущем выполняющемся процессе.
TlsSlots
Слоты TLS (Thread Local Storage) - это места в TEB, которые используются для хранения данных, специфичных для потока. Каждый поток в Windows имеет свой собственный TEB, и каждый TEB имеет набор слотов TLS. Приложения могут использовать эти слоты для хранения данных, специфичных для этого потока, таких как переменные, специфичные для потока, дескрипторы, специфичные для потока, состояния и так далее.
TlsExpansionSlots
Слоты расширения TLS в TEB - это набор указателей, используемых для хранения данных локального хранилища потока. Слоты расширения TLS зарезервированы для использования системными DLL.
Дескрипторы процесса и потока
В операционной системе Windows каждый процесс имеет уникальный идентификатор процесса или идентификатор процесса (PID), который операционная система присваивает при создании процесса. PIDs используются для различия одного работающего процесса от другого. Та же концепция применяется к работающему потоку, где работающий поток имеет уникальный идентификатор, который используется для его отличия от остальных существующих потоков (в любом процессе) в системе.
Эти идентификаторы можно использовать для открытия дескриптора процесса или потока с использованием нижеуказанных WinAPI:
- OpenProcess - открывает существующий дескриптор объекта процесса через его идентификатор.
- OpenThread - открывает существующий дескриптор объекта потока через его идентификатор.
Дескрипторы всегда следует закрывать после того, как они больше не требуются, чтобы избежать утечки дескрипторов. Это достигается с помощью вызова WinAPI CloseHandle.