Подскажите, как это можно сделать (желательно без перехвата API)...
Без перехвата стопроцентный способ только один - разубедить систему в том, что это процесс.
Теперь на пальцах:
Есть в ядре такая табличка, называется PspCidTable. Она хранит в себе списки потоков и
процессов и именно по этой таблице ориентируются такие функции, как OpenProcess/Thread.
Организована она как HANDLE_TABLE (здесь описывать структуру не буду - читайте
ms-rem'a на васме).
Так вот: если пробежаться по этой табличке и удалить (а точнее занулить) все записи,
связанные с нашим процессом (т.е. потоки включительно), то процесс уже не убить ни как -
сама система не сможет этого сделать. Правда есть один недостаток - такой процесс уже не
сможет порождать другие потоки (а, следовательно, и процессы!). На счет окон не помню -
кажись все нормально.
Хотел было нарыть готовый код (писал драйверок на асме), но что-то на работе его нет.
Вечером дома посмотрю, если кому интересно.
Касаемо остальных методов сделать процесс неубиваемым:
1. Хуки.
В юзермоде от них толку нет. В ядре побольше, но тоже мало - можно подгрузить ядро с диска и
вызвать нехученную ZwTerminateProcess.
2. Deadlock.
При использовании хэндла именованого канала, работающего в блокируещем режиме, возникает
дидлок и поток на всегда замерает. Толку от этого метода нет, так как нет проку от неработающего потока.
3. IRP
Если послать драйверу IRP, но не вернуть его (бесконечный цикл в драйвере), то вызывающий поток (и, следовательно. процесс) тоже станет неубиваемым. От такого потока тож нет толку +
на одноядерной машине загрузка камня процессом System стремится к 100%.
4. Перезапуск.
Требует наличия потока вне контекста своего процесса, который будет ждать завершения нашего
и перезапускать. Наверное, самый толковый метод, но тоже обходится заморозкой ждущего
потока.
5. Права.
Ну тут все понятно - если сидеть под администратором (как делает большинство) и получить SeDebugPrivilege, то можно убить даже критические системные процессы.
6. Подмена PID
Можно сменить PID своего процесса на 4 - тогда из юзермода его уже не убить. Зато некоторые проги начинают реально глючить - виндовый TaskMan, PETools и другие начинают находить много разных и интересных процессов в системе.
Так что не страдайте ерундой - если захотят прибить, все равно прибьют. Если нужно обезопасить какой-то код от преждевременного завершения - юзайте системные потоки, но это уже ядро...
А я все практикую лечение травами...