プロセスが終了しないように保護するには、API フックが必要です。システム全体の dll インジェクションとメモリ編集、またはデバイス ドライバーが必要なため、API フックは簡単ではありません。アイデアを得るためにこれを読んでください。
幸いなことに、このライブラリのような既存のライブラリがありますが、残念ながら現在はシェアウェアになっていると思います。私もこれを見つけました。おそらく、Google でさらに多くのフリーウェアを見つけることができます。
最初の質問に答えると、システム プロセスを終了するのは非常に簡単です。Process.Killメソッドを使用する C#では、少なくとも Windows 7 では、システム プロセスを終了し、Windows システム サービスから実行するとブルー スクリーンが発生する可能性があります (私はこれを難しい方法で学びました...)。サービスの外部からTerminateProcess()関数を使用して実行すると、特定の権限を有効にした場合にのみ機能します: http://www.codase.com/search/call?name=AdjustTokenPrivileges - 私が間違っていなければ、SE_DEBUG_NAME を有効にする必要があります。 .
ウイルス対策をオフにするには、通常、そのためのメニューがあります:)。それらを強制的に終了するには、フックしない終了メソッドを使用する必要があります。このページでは多くのことを説明しています。
使用する API 関数がフックされていないと仮定して、必要なプロセスを終了できるサンプルを次に示します。ブルースクリーンの原因となる可能性があるため、何をしているのかわからない限り、これを実行しないでください。
#include <stdio.h>
#include <windows.h>
#include <process.h>
#include <iostream>
using namespace std;
int EnablePrivilege(const char * lpPrivilegeName, BOOL bEnable)
{
TOKEN_PRIVILEGES Privileges;
ZeroMemory(&Privileges, sizeof(Privileges));
HANDLE hToken;
BOOL bResult;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return 1;
Privileges.PrivilegeCount = 1;
Privileges.Privileges[0].Attributes = (bEnable) ? SE_PRIVILEGE_ENABLED : 0;
if (!LookupPrivilegeValue(NULL, lpPrivilegeName,
&Privileges.Privileges[0].Luid))
{
CloseHandle(hToken);
return 2;
}
bResult = AdjustTokenPrivileges(hToken, FALSE, &Privileges, sizeof(Privileges), NULL, NULL);
CloseHandle(hToken);
return bResult;
}
int main()
{
cout << EnablePrivilege(SE_DEBUG_NAME, TRUE);
HANDLE procHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 500); // replace 500 with the PID of the process you want to terminate - can be taken from taskmanager.
TerminateProcess(procHandle, 0);
CloseHandle(procHandle);
}