Коллеги, всем всего доброго!
Похоже, что .NET прибавил интеллекта функции GetThreadContext.
Задача типовая — создаем процесс с CREATE_SUSPENDED, через вызов GetThreadContext определяем точку входа в exe и прописываем туда свой код. В случае не-.NET процессов все работает как и планировалось. А вот если с .NET такую штуку проделать, то внедренный код не получает управления.
Если взять простой отладчик (MSVS2005) и после вызова GetThreadContext посмотреть в CONTEXT.Eax, то там будет адрес, похожий на точку входа, типа 0x0004.....
А вот если помимо CONTEXT.Eax посмотреть еще и CONTEXT.Eip, взять значение CONTEXT.Eip, пойти в WinDbg и сделать bu на это значение, то WinDbg в этой точке в Eax будет показывать адрес в аккурат _CorExeMain. И при трассировке прямиком туда и попадет.
Я вижу три варианта того, что происходит.
1. Либо GetThreadContext стал очень умным и подменяет значение в EAX, когда там адрес _CorExeMain, на адрес точки входа.
2. Либо WinDbg стал очень умным и подменяет значение в EAX на _CorExeMain (типа все равно по стандартной заглушке туда попадешь).
3. Либо меня глючит и обе машины, где я это наблюдал, тоже. Обе XP SP2.
Вы за какой вариант голосуете?
Может быть у вас есть свои варианты?