Привет! 🌟 Сегодня мы заглянем в "кухню" операционной системы Windows и разберем, как работает загрузчик исполняемых файлов. Это как рецепт волшебного зелья: смешиваем технические детали, код на C++ и понятные аналогии. Поехали! PE (Portable Executable) - это формат исполняемых файлов в Windows (.exe, .dll). Представьте его как "чемодан" для переезда: 🔑 Ключевой термин: RVA (Relative Virtual Address) смещение от базового адреса загрузки. Шаг 1️⃣: Проверка файла Загрузчик ищет сигнатуру "PE\0\0" (как проверка паспорта): // Читам заголовки IMAGE_DOS_HEADER* dosHeader = (IMAGE_DOS_HEADER*)fileData; IMAGE_NT_HEADERS* ntHeaders = (IMAGE_NT_HEADERS*)(fileData + dosHeader->e_lfanew); // Магическая проверка if (ntHeaders->Signature != IMAGE_NT_SIGNATURE) { throw "Это не PE-файл!"; } Шаг 2️⃣: Выделение "жилплощади" в памяти Пытаемся загрузить по адресу ImageBase: void* imageBase = VirtualAlloc( (LPVOID)ntHeaders->OptionalHeader.ImageBase, ntHeaders->OptionalHeader.SizeOfImage,