Здраствуйте. Сосбно сабж, поменял значит я блокноту Пид на 4(просто ради интереса), включаю виндовский таск мангер, он начал добавлять процессы с названием System и Пидом -1, а остальное как у процесса System. Выключил таск манагер. Запускаю от Сис Интерналс вижу Блокнот с Пидом 4. Пытаюсь завершить, а нифига то же самое что завершать System. Посмотрел свойства, вижу 55 потоков + остальное , ну прям System. Посидел минут 10-15, покодил дальше и бац! система медленно начала завершать процессы и ребутнулась(после завершения некоторых процессов). Теперь хочу спросить вас, может кто сталкивался с этим, почему так? почему не сразу ребут, а через 10 - 15 минут? можно ли поменять Пид на другой несуществующий? Я конечно щас и дальше исследовать пойду, но может пока кто-то поделиться инфой которую он имеет?
bogrus приведу кусок кода, но могу выложить и прогу. (Я просто таск манагер пишу , а это пытался придумать способ для убиения процессов как в теме "Как противостоять TerminateProcess" ) Код (Text): TerminateProcess_ proc PID:dword ;try to terminate process. Try to open PID,+1,+2,+3 LOCAL temp[2]:dword LOCAL PID_:dword mov eax,PID dec eax mov PID_,eax @@: inc PID_ invoke OpenProcess_,PID_,PROCESS_TERMINATE .if eax != 0 mov temp,eax push PID pop temp[4] invoke DeviceIoControl,g_hDevice,IOCTL_TERMINATE_PROCESS,addr temp,8,0,0,addr Garbage,0 .if eax == 0 invoke CloseHandle,temp xor eax,eax .endif .else mov eax,PID add eax,4 cmp PID_,eax jnz @B xor eax,eax .endif ret TerminateProcess_ endp .elseif [edi].Parameters.DeviceIoControl.IoControlCode == IOCTL_TERMINATE_PROCESS mov status,STATUS_INVALID_PARAMETER .if [edi].Parameters.DeviceIoControl.InputBufferLength == 8 mov ecx,[esi].AssociatedIrp.SystemBuffer mov status,STATUS_UNSUCCESSFUL push eax invoke PsLookupProcessByProcessId,dword ptr [ecx+4], esp pop peProcess .if eax == STATUS_SUCCESS fastcall ObfDereferenceObject,peProcess mov eax,peProcess add eax,PID_Offset mov dword ptr [eax],32 mov status,STATUS_SUCCESS ;invoke KeAttachProcess,peProcess ; mov ecx,[esi].AssociatedIrp.SystemBuffer ;invoke ZwTerminateProcess,dword ptr [ecx],00h ;.if eax == 0 ; mov status,STATUS_SUCCESS ;.endif ;invoke KeDetachProcess .endif .endif
Тю, я думал без ядра сменил, глючит видимо из-за маленького пида (может его 4 бита выделено для системного использования), поставь больше 16, если глюки не пропадут, значит криво поменял
так, после отдыха, размышлений выяснилось что если: 1)запустить процесс(например калькулятр) 2)поменять пид в Епроцессе на 32(можна и на другой) 3)закрыть его. и проделать всё во второй раз то Бсод. но если поменять на другой пид(24 например) то всё ок. также ProcessNotifyRoutine получает уже новый видоизменёный пид.(а скорее всего и все функции которые не обращаються за Пидом к Пебу, то есть 0 кольца).
Никогда не меняй PID процесса на уже существующий. Два процесса с одинаковым PID приведут к рассогласованию структур ядра и к синему экрану в результате. А простая смена PID на либой другой чревата глюками связанными с этим процессом и с всеми процессами пытающиеся с ним работать. Так как PEB процесса не обновляется, то GetCurrentProcessId будет выдавать ложный PID, а ZwQuerySystemInformation с классом SystemHandlesInformation выдаст вообще чепуху о хэндлах процесса. Короче, глюки будут, но заранее их нельзя предсказать. Возмодно все, вплоть до BSOD.
ну от этого можно избавиться, что нам мешает подправить Пид? Ага, тогда для полной корректности смены PID надо еще в таблицы хэндлов лазить и менять там PID владельца. Еще в структуры сервера подсистемы csrss.exe залезть надо. И еще хз куда. В общем, задача не такая простая.
вот вот, и по мере накопления такого рода глюков твоя система деградирует постепенно, а не сразу. Так, что, лучше тебе бросить это неблагодарное занятие.
ну почему же, мне стало интересно и даже очень... сегодня вечером сяду ещё копать, но вообще это я всё делаю для убиения процесса...
а зачем для убиения процесса менять ему id? не проще ли его просто, пардон, классическим путем ZwTerminateProcess etc )