подключение CreateProcess для поддержки моего исполняемого формата - PullRequest
0 голосов
/ 07 августа 2020

У меня есть собственный исполняемый формат (т.е. в дополнение к Win32 PE .exe), и я хочу запускать такие исполняемые файлы из глубокой иерархии вызовов процессов, например, инструмент A вызывает B, B вызывает C, C вызывает D, а D вызывает E. Я контролирую только исходный код инструмента A; B, C, D и E - это исполняемые файлы без доступного исходного кода, которые слишком сложны для дизассемблирования. B, C и D - это обычные Win32 PE .exe (не NET). и E находится в настраиваемом формате файла, который по умолчанию не поддерживается на Windows, и нет возможности установить поддержку.

В моем инструменте A (для которого у меня есть полный исходный код) у меня есть реализация пользовательского формата файла (то есть пользовательской функции загрузчика), и я написал функцию CreateProcessMaybeCustom, которая открывает исполняемый файл, читает заголовок и, если обнаруживает пользовательский формат файла, запускает пользовательскую функцию загрузчика; в противном случае он вызывает исходную функцию CreateProcess. Также во всех других частях исходного кода моего инструмента A я заменил все вызовы CreateProcess на CreateProcessMaybeCustom. Таким образом, если инструмент A вызывает инструмент E напрямую, он работает (т.е. вызывается функция пользовательского загрузчика). Но если инструмент A вызывает B, B вызывает C, C вызывает D, а D вызывает E, то последний шаг не выполняется, потому что D вызывает исходную функцию CreateProcess, которая не знает о пользовательском формате файла.

Я хотел бы вставить код из A в B, B в C и C в D. Внедренный код будет содержать пользовательскую функцию загрузчика, функцию CreateProcessMaybeCustom и ловушку для CreateProcess ( заменив его CreateProcessMaybeCustom). Внедрение будет распространяться от B до C и от C до D. Таким образом, когда D вызывает E, будет запущена функция пользовательского загрузчика. Как мне сделать такую ​​инъекцию? (Все, что у меня есть сейчас, - это реализация пользовательской функции загрузчика и CreateProcessMaybeCustom, и она работает, если A вызывает E напрямую.)

Эти решения не работают. У меня не работает:

  • Ввести новое расширение файла и привязку файла к отдельному loader.exe для настраиваемого формата. Это не работает для меня, потому что это глобальный параметр (влияющий на все программы, запускаемые одним и тем же пользователем), а также для него требуется идентификация формата файла по расширению (а не чтение заголовка), и мне нужно автоматическое определение, а не сознательное явное объявление форматов файлов.

  • Получите исходный код B, C и D и измените их соответствующим образом. Мне невозможно получить исходный код.

Я знаю, что мне нужно подключить несколько функций (например, CreateProcessA, CreateProcessW). Достаточно ли подключить функции CreateProcess ... в KERNEL32.DLL, или мне нужно подключить больше функций, которые используют другой популярный API (и обходят CreateProcess ...)? Я новичок в Программирование Win32, я даже не знаю популярных API для запуска внешних исполняемых файлов. (Я знаю, что на Linux мне пришлось бы подключать все вызовы к системному вызову execve (2) (например, с ptrace (2) ) или всем lib c functions exe c ... (3) , а также system (3) и popen (3) .)

...