![]() |
eXeL@B —› Программирование —› Инжект через SetThreadContext. |
Посл.ответ | Сообщение |
|
Создано: 11 июня 2009 11:13 · Поправил: mjau · Личное сообщение · #1 Мутодика обычная - suspend, set, resume. На XP работало отлично, с переходом на Win7 (на висте не пробовал, но говорят тоже косяки есть) обнаружилось, во первых, что SetThreadContext иногда выставляет только eip (а нужно было и другой регистр), изза чего целевой поток падает. Кстати, нашел поиском такую же проблему на форуме, но там так решения и нет. Исследования показали, что несмотря на SuspendThread, целевой поток попадает на точку выполнения уже после SetThreadContext, а не ResumeThread, как положено. По всей видимости, потоки, находящиеся в ожидании как-то криво реагируют на суспенд, и гдето там успевают выполняться. Попробовал обойти грабли путем нахождения потока в running state но практика показала, что от момента нахождения потока до его суспенда проходит полгода, и поток может опять кудато провалиться. Вопрос - где я криворук, или чего-то не понимаю? ![]() |
|
Создано: 11 июня 2009 11:41 · Личное сообщение · #2 |
|
Создано: 11 июня 2009 14:54 · Поправил: Clerk · Личное сообщение · #3 Для поля CONTEXT_CONTROL ? Нельзя менять селекторы сегментов стека и кода. Регистр флажков корректируется в KeContextFromKframes(), тамже и при планировании. С остальными тремя регистрами фрейма проблем не должно быть. Для текущего треда регистры регистры Eax, Ecx и Edx могут быть не установлены, так как сервисы NtSetContextThread и NtContinue содержат ошибки(не корректная модель возврата в KiServiceExit(), инструкция Sysexit в отличае от Iretd использует регистры Ecx и Edx для возврата в юзермод(смены CPL). ![]() |
![]() |
eXeL@B —› Программирование —› Инжект через SetThreadContext. |