Используя windows api и C ++, как я могу загрузить исполняемый файл с жесткого диска и запустить его в своем собственном потоке? - PullRequest
1 голос
/ 10 января 2011

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

Если у меня есть два exe, один из которых называется foo.exe, а другой bar.exe, как я могу загрузить foo.exe содержимое bar.exe в память, а затем выполнить его оттуда в своем собственном потоке?Я знаю, как поместить его в память, используя MapViewOfFile или просто загрузив содержимое на жесткий диск в буфер.Я предполагаю, что просто скопировать содержимое bar.exe на диск в свой собственный приостановленный поток и запустить его не будет работать.Я почти знаком с внутренними файлами PE.Вся помощь очень ценится, конечно:)

Ответы [ 3 ]

4 голосов
/ 10 января 2011

Во-первых, Ламберт прав.EXE запускаются в своем собственном процессе.Причина, по которой EXE-файлы не могут загружаться в другой процесс, заключается в том, что они не скомпилированы для относительной адресации, и их код не может быть легко переназначен на другой адрес.Разработчики запускают другие EXE-программы с помощью системного вызова Win32 «CreateProcess».Но я не думаю, что это был ваш вопрос ...

Я думаю, вы хотите знать, как вручную загрузить код из двоичного файла в запущенный процесс (и запустить его в выделенном потоке).Большинство разработчиков просто вызывают LoadLibrary / GetProcessAddress, чтобы отобразить DLL в пространство процесса, и CreateThread, чтобы запустить поток.

Так что я думаю, что вы в основном спрашиваете: «Как реализовать основной компонент ядра и ОСизвестный как погрузчик?Или, другими словами, «как мне реализовать CreateProcess и LoadLibrary?»

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

Я рекомендую просмотреть в книге Рихтера разделы, посвященные процессам, потокам и библиотекам DLL.Он обсуждает немного этого и некоторые детали разбора PE-формата PE.

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

3 голосов
/ 10 января 2011

Исполняемый файл всегда запускается как отдельный процесс .Он не может быть запущен в потоке какого-либо другого процесса .Однако вы можете запустить свой исполняемый файл как процесс из потока другого процесса.Взгляните на функцию CreateProcess () !

2 голосов
/ 10 января 2011

Поскольку мне лично не нравятся ответы, в которых говорится: «Почему вы вообще хотите это делать?», вот ссылка , которая была бы очень полезна.Но имейте в виду, что вы, вероятно, не добьетесь успеха, поскольку EXE просто не ожидают запуска в потоке другого процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...