Исполнение кода в основном потоке "левого" процесса
От: CyberDemon Россия  
Дата: 25.04.17 18:44
Оценка:
Необходимо внедриться в сторонний процесс и выполнить свой код именно в основном потоке. Естественно, чем проще и надежнее, тем лучше
SetWindowsHooks отпадают, потому что у процесса может не быть окошка.
Предположим, свою DLL мы уже загрузили в процесс, что дальше?
В голову приходит только поставить хук на что-нибудь из kernel32, и там уже ждать нужный поток. Например, EnterCriticalSection. Однако, тут тоже не все шоколадно — какой метод гарантированно (регулярно) будет вызываться в произвольном процессе?
Может быть, есть еще способы?
Re: Исполнение кода в основном потоке "левого" процесса
От: CEMb  
Дата: 26.04.17 03:06
Оценка:
Здравствуйте, CyberDemon, Вы писали:

CD>Необходимо внедриться в сторонний процесс и выполнить свой код именно в основном потоке. Естественно, чем проще и надежнее, тем лучше

CD>SetWindowsHooks отпадают, потому что у процесса может не быть окошка.
CD>Предположим, свою DLL мы уже загрузили в процесс, что дальше?
CD>В голову приходит только поставить хук на что-нибудь из kernel32, и там уже ждать нужный поток. Например, EnterCriticalSection. Однако, тут тоже не все шоколадно — какой метод гарантированно (регулярно) будет вызываться в произвольном процессе?
CD>Может быть, есть еще способы?
У Рихтера есть пример внедрения через CreateRemoteTrhread и LoadLibrary.
Не совсем понятна цель: именно в основном потоке. Т.е. ты точно знаешь, в какой точке тебе надо что-то выполнить. Стало быть, в этой точке тебе надо делать jmp в свой код и потом возвращать управление назад.

Рихтер: Внедрение DLL и перехват API-вызовов
Re: Исполнение кода в основном потоке "левого" процесса
От: _Butch_  
Дата: 26.04.17 05:06
Оценка: +1
Если инжект DLL выполняет посторонний процесс, то ему доступен вариант SuspendThread -> SetThreadContext -> ResumeThread
Re[2]: Исполнение кода в основном потоке "левого" процесса
От: rumit7  
Дата: 26.04.17 05:39
Оценка: 6 (1)
Здравствуйте, _Butch_, Вы писали:

_B_>Если инжект DLL выполняет посторонний процесс, то ему доступен вариант SuspendThread -> SetThreadContext -> ResumeThread


накидаю еще ссылок для ТС, может пригодиться:

https://github.com/OpenSecurityResearch/dllinjector/blob/master/src/ExecThread.cpp#L23
http://www.rohitab.com/discuss/topic/34052-thread-hijacker/
https://github.com/juntalis/project52a/tree/master/injector/src
http://syprog.blogspot.com/2012/05/createremotethread-bypass-windows.html
http://www.kdsbest.com/?p=159
https://github.com/hzeroo/Carberp/blob/master/source%20-%20absource/pro/all%20source/Demo_Cur2/Source/Inject.cpp#L276
https://github.com/gbrindisi/malware/blob/master/windows/gozi-isfb/Common/pssup.c#L691
Re: Исполнение кода в основном потоке "левого" процесса
От: ononim  
Дата: 26.04.17 09:44
Оценка: +4
CD>Необходимо внедриться в сторонний процесс и выполнить свой код именно в основном потоке. Естественно, чем проще и надежнее, тем лучше
Надежного способа не будет, основной поток может к примеру спать вечным сном вплоть до завершения приложения, и это может быть его совершенно естественным состоянием
Вообще в терминах win32 нету "основного" потока, main может завершить исполнение мимо CRT и процесс останется работать пока будет жив хотябы один его поток, неважно — изначальный ли или позжее стартованный. Так что вы лучше изначальную задачу опишите.
Как много веселых ребят, и все делают велосипед...
Re[2]: Исполнение кода в основном потоке "левого" процесса
От: Pavel Dvorkin Россия  
Дата: 03.05.17 13:46
Оценка: +1
Здравствуйте, ononim, Вы писали:

O>Вообще в терминах win32 нету "основного" потока, main может завершить исполнение мимо CRT


Не говоря уж о том. что в общем случае нет ни main, ни CRT
With best regards
Pavel Dvorkin
Re: Исполнение кода в основном потоке "левого" процесса
От: Mr.Delphist  
Дата: 03.05.17 18:57
Оценка:
Здравствуйте, CyberDemon, Вы писали:

CD>Необходимо внедриться в сторонний процесс и выполнить свой код именно в основном потоке.


Какие именно причины заставляют искать определённый поток из N существующих в процессе? От этого и плясать. В особо невезучих случаях иначе как патчингом секции кода не обойтись (скажем, поток гоняется по бесконечному циклу, без какой-либо очереди сообщений). Плюс, как уже указывали выше, искомый поток может быть в suspended-состоянии, и что тогда?
Re[2]: Исполнение кода в основном потоке "левого" процесса
От: Evgeniy Skvortsov Россия  
Дата: 04.05.17 12:56
Оценка:
Здравствуйте, 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]: Исполнение кода в основном потоке "левого" процесса
От: rumit7  
Дата: 04.05.17 13:05
Оценка:
Здравствуйте, Evgeniy Skvortsov, Вы писали:

ES>Здравствуйте, ononim, Вы писали:


O>> Надежного способа не будет, основной поток может к примеру спать вечным сном вплоть до завершения приложения, и это может быть его совершенно естественным состоянием

ES>Для того что бы заснуть вечным сном потоку как минимум надо начать выполняться.

ES>По моему вариант с использованием WaitForDebugEvent отлично подойдет.

ES>Потому что можно отловить момент когда поток ещё вообще не выполнил ни одной команды

ES>Стартуем процесс с флагом DEBUG_ONLY_THIS_PROCESS, он создастся спящим, далее используем цикл WaitForDebugEvent / ContinueDebugEvent


а какое отношение это имеет к заявленным ТС "Исполнение кода в ... "левого" процесса"?

с дочерним процессом и так можно много чего, в разных извращенных формах, делать
Отредактировано 04.05.2017 13:07 rumit7 . Предыдущая версия .
Re[4]: Исполнение кода в основном потоке "левого" процесса
От: Evgeniy Skvortsov Россия  
Дата: 04.05.17 13:15
Оценка:
Здравствуйте, rumit7, Вы писали:

R>а какое отношение это имеет к заявленным ТС "Исполнение кода в ... "левого" процесса"?


А сори, что-то я тупанул с этим. В требованиях ТС процесс уже запущен.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.