Как я уже говорил, перехватить могут и Ps. Было как-то дело и я, для того, чтобы обойти перехват Zw, грузил оригинальные байты с диска. Но, что очевидно, от инлайна Ps это не спасет. Ну а самое важное - в ядре любое противостояние это борьба с ветряными мельницами, все бесполезно. Да я думаю, что ТС врядли этими тонкостями интересовался.
Twister Благо если хэндлер проверяет PreviousMode, иначе крах. Кодер не способный разбирать код не кодер. Вам как никому сдесь должно быть хорошо известно про коденг шадова в ядре, про экспорт можно забыть сразу. Когда он откроет для себя граф и начнёт мыслить отрешённо от кода, тогда и проблемы исчезнут. Например мне обычно достаточно одного и тогоже кода, который парсит код и создаёт граф, надстройка занимает десятки байт, что им мешает сделать тоже самое.
Отсутствие знаний. Ибо зачем тогда им задавать здесь вопросы? Наше же дело наставить на путь истинный. По началу на самый простой, до более продвинутых дойдут потом, с опытом.
спасибо всем за ответы попытылся реализовать и не совсем разобрался что к чему Код (Text): NtStatus =ObOpenObjectByPointer( (PVOID) pTargetProcess, OBJ_EXCLUSIVE, //HandleAttributes, NULL, // PassedAccessState OPTIONAL, STANDARD_RIGHTS_ALL,// GENERIC_READ, // DesiredAccess, NULL, // ObjectType, KernelMode, // AccessMode Handle ); // NtStatus = ZwTerminateProcess( *Handle, 0xC0000005 ); после многочисленных БСОДов дошел до NtStatus == STATUS_INVALID_PARAMETER (0xC000000D )и застопорился, в MSDN написанно очерь расплывчато ( как в 90% MSDN )
может быть проблема с Handle? память под хендл выделена, или вы просто объявили ее как указатель? не проще ли сделать так: Код (Text): HANDLE Handle = NULL; ... NtStatus = ObOpenObjectByPointer(..., &Handle); NtStatus = ZwTerminateProcess(Handle, 0xC0000005);
На секунду задумываемся, а потом читаем чуть выше (собственно, Rel уже это подметил) В msdn написано все четко и ясно, где тут расплывчатость? Хотя на самом деле это не совсем правда. В драйвере по приходу IRP от приложения (т.е. не в контексте system) элементрано можно открыть хэндл без флага OBJ_KERNEL_HANDLE для передачи в юзермод и там его преспокойно использовать, проверено. Правда я конкретно указывал ObjectType, может быть это как-то повлияло.
Еще раз спасибо всем за ответы в таком виде вырубает без проблем Код (Text): NtStatus =ObOpenObjectByPointer( (PVOID) pTargetProcess, OBJ_KERNEL_HANDLE, NULL, PROCESS_ALL_ACCESS, //PROCESS_TERMINATE, NULL, KernelMode, &Handle ); NtStatus = ZwTerminateProcess( Handle, 0xC0000005 );
Офф. Приходилось наблюдать ситуации, когда процесс завершить невозможно. Ни таскманагер, ни куча утил, которые якобы завершают любые процессы не помогли. Воспроизвести ситуацию на XP_SP3 с определенной вероятностью можно. Берем напрочь убитый диск, толкаем в привод, пытаемся окрыть этот диск в проводнике. Пока привод ломает голову, прибиваем explorer в taskmanager'е. В рез-те, хотя десктоп пропадает, эксплорер остается висеть в списке процессов. Не убивается ничем, привод продолжает шуршать. Мельком глянул, трабла вроде в PspExitThread. Лекарство возможно?
Помогут. Пусть сперва научатся завершать процесс, имея его PEPROCESS, через открытие хендла и завершение. medstrax1 Процесс висит, процессорного времени не жрет, память вся постепенно уйдет в стендбай или модифаед списки, а потом и вовсе выгрузится на диск. Зачем его убивать? +) запусти еще один, будет два а серьезно, попробуй получить адрес IRP потока, который висит, и комплитнуть его с ошибкой или отменить.