Необходимо внедриться в сторонний процесс и выполнить свой код именно в основном потоке. Естественно, чем проще и надежнее, тем лучше
SetWindowsHooks отпадают, потому что у процесса может не быть окошка.
Предположим, свою DLL мы уже загрузили в процесс, что дальше?
В голову приходит только поставить хук на что-нибудь из kernel32, и там уже ждать нужный поток. Например, EnterCriticalSection. Однако, тут тоже не все шоколадно — какой метод гарантированно (регулярно) будет вызываться в произвольном процессе?
Может быть, есть еще способы?
Re: Исполнение кода в основном потоке "левого" процесса
Здравствуйте, CyberDemon, Вы писали:
CD>Необходимо внедриться в сторонний процесс и выполнить свой код именно в основном потоке. Естественно, чем проще и надежнее, тем лучше CD>SetWindowsHooks отпадают, потому что у процесса может не быть окошка. CD>Предположим, свою DLL мы уже загрузили в процесс, что дальше? CD>В голову приходит только поставить хук на что-нибудь из kernel32, и там уже ждать нужный поток. Например, EnterCriticalSection. Однако, тут тоже не все шоколадно — какой метод гарантированно (регулярно) будет вызываться в произвольном процессе? CD>Может быть, есть еще способы?
У Рихтера есть пример внедрения через CreateRemoteTrhread и LoadLibrary.
Не совсем понятна цель: именно в основном потоке. Т.е. ты точно знаешь, в какой точке тебе надо что-то выполнить. Стало быть, в этой точке тебе надо делать jmp в свой код и потом возвращать управление назад.
Здравствуйте, _Butch_, Вы писали:
_B_>Если инжект DLL выполняет посторонний процесс, то ему доступен вариант SuspendThread -> SetThreadContext -> ResumeThread
CD>Необходимо внедриться в сторонний процесс и выполнить свой код именно в основном потоке. Естественно, чем проще и надежнее, тем лучше
Надежного способа не будет, основной поток может к примеру спать вечным сном вплоть до завершения приложения, и это может быть его совершенно естественным состоянием
Вообще в терминах win32 нету "основного" потока, main может завершить исполнение мимо CRT и процесс останется работать пока будет жив хотябы один его поток, неважно — изначальный ли или позжее стартованный. Так что вы лучше изначальную задачу опишите.
Как много веселых ребят, и все делают велосипед...
Re[2]: Исполнение кода в основном потоке "левого" процесса
Здравствуйте, CyberDemon, Вы писали:
CD>Необходимо внедриться в сторонний процесс и выполнить свой код именно в основном потоке.
Какие именно причины заставляют искать определённый поток из N существующих в процессе? От этого и плясать. В особо невезучих случаях иначе как патчингом секции кода не обойтись (скажем, поток гоняется по бесконечному циклу, без какой-либо очереди сообщений). Плюс, как уже указывали выше, искомый поток может быть в suspended-состоянии, и что тогда?
Re[2]: Исполнение кода в основном потоке "левого" процесса
Здравствуйте, ononim, Вы писали:
O> Надежного способа не будет, основной поток может к примеру спать вечным сном вплоть до завершения приложения, и это может быть его совершенно естественным состоянием
Для того что бы заснуть вечным сном потоку как минимум надо начать выполняться.
По моему вариант с использованием WaitForDebugEvent отлично подойдет.
Потому что можно отловить момент когда поток ещё вообще не выполнил ни одной команды
Стартуем процесс с флагом DEBUG_ONLY_THIS_PROCESS, он создастся спящим, далее используем цикл WaitForDebugEvent / ContinueDebugEvent
Отлавливаем событие CREATE_PROCESS_DEBUG_EVENT, после которого создан основной поток, внедряем свой кусок кода в адресное пространство этого потока
Через SetThreadContext правим EIP на свой код, в конце своего кода делаем jmp на начало основного потока.
O> Вообще в терминах win32 нету "основного" потока,
Есть
O> main может завершить исполнение мимо CRT и процесс останется работать пока будет жив хотябы один его поток, неважно — изначальный ли или позжее стартованный.
А вот ни понятия main, ни понятия CRT в WINAPI нет. Это уже детали реализации конкретного компилятора что он напичкает внутрь exe файла.
Для винды существует только формат файла exe, в котором есть такая штука как EntryPoint. Именно с этого адреса начинается выполнение программы и по которому создается основной поток. И вот мой описанный способ гарантировано позволяет выполнить свой код до того как начнет выполняться программа.
При чём нужно понимать что точка входа это далеко не начало функции main в случае если программа написана на c/c++
В общем ты всё напутал. Ситуация в реале с точностью до наоборот.
Re[3]: Исполнение кода в основном потоке "левого" процесса
Здравствуйте, Evgeniy Skvortsov, Вы писали:
ES>Здравствуйте, ononim, Вы писали:
O>> Надежного способа не будет, основной поток может к примеру спать вечным сном вплоть до завершения приложения, и это может быть его совершенно естественным состоянием ES>Для того что бы заснуть вечным сном потоку как минимум надо начать выполняться.
ES>По моему вариант с использованием WaitForDebugEvent отлично подойдет. ES>Потому что можно отловить момент когда поток ещё вообще не выполнил ни одной команды
ES>Стартуем процесс с флагом DEBUG_ONLY_THIS_PROCESS, он создастся спящим, далее используем цикл WaitForDebugEvent / ContinueDebugEvent
а какое отношение это имеет к заявленным ТС "Исполнение кода в ... "левого" процесса"?
с дочерним процессом и так можно много чего, в разных извращенных формах, делать