PsSuspendProcess() перебирает с помощью PsGetNextProcessThread() треды и сюспендит их PsSuspendThread(). Последняя в свою очередь проверяет не текущий ли тред мы пытаемся засюспендить, если да - то не проверяем никаких флагов на текущее состояние треда а просто вызывается KeSuspendThread(). И что тогда получается - мы сами себя засюспендим и как тогда произойдет приостановление остальных тредов текущего процесса? в самой KeSuspendThread() меня уже потеряло малость. Можете объяснить как оно происходит с остановом текущего процесса. В частности интересуют методы останова процесса без перебора тредов вручную (NtQuerySystemInformation) но нужно оставить "в живых" текущий тред.
ASMatic Доставляется саспенд апк, в которой поток входит в ожидание на семафоре. По истечению времени или принудительно симафор переводится в сигнальное состояние и тред выходит из ожидания. Про останов - это старая ошибка в реализации, все потоки не будут остановлены. Можно переключится на другой поток, но это грязный хак. В младших версиях системы дёрганье этого сервиса для текущего процесса иногда вешало всю ось, хз почему. Я не юзаю такие грязные хаки, а енумлю треды и останавливаю каждый вручную.
а если во время энума создастся тред - он попадет в енум однозначно? Т.е. мы создали слепок, перебрали+сюспенд = пока сюспендили кто-то мог создать еще поток (которого нету в слепке) и так можно до безконечности искать не засюспенднутые треды, если после сюспенда текущего слепка создать еще один слепок. *работаю из р3, тему сюда перенесли(
ASMatic Я не упоминал слепки. Можно нотифи поставить на создание новых тредов или выполнить какие то действия, которые приведут к выполнению нашего кода в контексте всех потоков.
Malfoy Да я понял что вы о других методах говорите, т.к. топик в кернел разделе, потому какбы и подчеркнул о р3. По поводу нотифи - есть может какие р3 варианты?
ASMatic Способов не меряно. Начиная от элементарных дллмейн и кончая IDP, куками етц. Просто суть же не в том. Для чего нужно саспендить потоки - нормальный алго не требует этого. Обычно для модификации кода такое делают, если она грамотно выполнятеся, то не нужен никакой саспенд.
Malfoy Ну да точно - нужно мысли обширней) = благодарочка! да, сплайсы нужны. Без саспенда можно потрейсить правда (это пока все что в голове крутилось по этому поводу) - дабы треды "вывести" с участка заменяемого, но с саспендом оно как-то проще выглядит, хотя с костылями которые тож нужно разруливать.
ASMatic Патч не годный. Следует выполнять потоковую маршрутизацию на буфер, после которой все потоки должны быть направлены на общую точку в оригинальном коде, это да, требует саспенд. Но обычно нет смысла юзать начало процедур, всегда найдётся инструкция длинее 5 байт.
Malfoy суть в том что это не системный код патчится будет, т.е. не могу рассчитывать что там не будет сразу short jmp или еще какое ветвление, потому какбы не хотелось бы разбирать что там за код, а просто попатчить его и пусть пропадет оно пропадом) а это какбы вариант. опять таки - нужно думать "шире") гденить описывале как люди "в черном" это делают? а то у для меня это просто термин, среализацией пока хз(
ASMatic http://wasm.ru/forum/viewtopic.php?pid=460090#p460090 Я бы это нивкоем случае не делал. Всегда можно найти годное место для маршрутизации. До вашего места будет есчо наверно куча кода выполнена, управление на котором можно получить.
Malfoy благодарю за консультацию! *веселого нг (хотя для меня он уже прошел две недели назад) буду искать варианты, теперь есть над чем по раздумывать.
ASMatic Вот нашёл описание алго: http://wasm.ru/forum/viewtopic.php?pid=431525#p431525 Это успешно работает во всей линейке и в W8.
Malfoy благодарю! вродь понял что к чему. Для "локального" пользования норм решение (для хендлера создания треда). А с вопросами по созданию процесса - отправился в тот топик.