Во-первых, Ламберт прав.EXE запускаются в своем собственном процессе.Причина, по которой EXE-файлы не могут загружаться в другой процесс, заключается в том, что они не скомпилированы для относительной адресации, и их код не может быть легко переназначен на другой адрес.Разработчики запускают другие EXE-программы с помощью системного вызова Win32 «CreateProcess».Но я не думаю, что это был ваш вопрос ...
Я думаю, вы хотите знать, как вручную загрузить код из двоичного файла в запущенный процесс (и запустить его в выделенном потоке).Большинство разработчиков просто вызывают LoadLibrary / GetProcessAddress, чтобы отобразить DLL в пространство процесса, и CreateThread, чтобы запустить поток.
Так что я думаю, что вы в основном спрашиваете: «Как реализовать основной компонент ядра и ОСизвестный как погрузчик?Или, другими словами, «как мне реализовать CreateProcess и LoadLibrary?»
Загрузчик ОС делает больше, чем просто разбирает двоичные файлы в памяти и устанавливает указатель инструкций на первую строку кода.Он также загружает другие зависимые библиотеки DLL.Поскольку процесс, возможно, уже выделил другой код для запуска по целевому адресу, к которому была скомпилирована DLL, ему также может потребоваться исправить адреса DLL, чтобы загрузить ее по другому адресу.Я, вероятно, пропускаю много других шагов, включая выделение виртуальной памяти для самого двоичного кода.
Я рекомендую просмотреть в книге Рихтера разделы, посвященные процессам, потокам и библиотекам DLL.Он обсуждает немного этого и некоторые детали разбора PE-формата PE.
Изучение реализации ядра Linux того, как он загружает .SO файлы в пространство процесса, также может быть полезным исследованием.