Понимаю, что тема вобщем-то для многих заезженная но.. ,короче, появилось у меня немного свободного времени и я решил немного покопать архив васма на предмет интересных и новых для меня статей. Нашел статью MS-REM'a и начал экспериментировать с Dll инжектом на основе WriteProcessMemory+CreateRemoteThread. После загрузки собственно dll в remote процесс в статье написано, что будет выполнена точка входа c DLL_PROCESS_ATTACH, но не сказано в контексте какого потока. Выяснил, что вход выполится в контексте основного потока и, к примеру, код моей DLL Код (Text): switch(dwReason) { ... case DLL_PROCESS_ATTACH: Sleep(INFINITE); ... } просто завесит программу. Вопрос в том - в каком месте основной поток программы прерывается, чтобы выполнить DllMain?
Выполняется в контексте вызывающего потока, зависает вероятно потомучто вы не отпускаете тред, а в это время второй("основной") входит в критическую секцию лоадера(например изза GUI-хуков, uxtheme.dll подгружается многократно) и будет ждать освобождение кс первым тредом, а он висит. Нет понятия главного потока, треды равноправны и независимы друг от друга.