2

注:スーパーユーザーで同様の形式でこの質問をしましたが、ここではSOの方が適しているようです。また、Win32 API の一部、Windows 全般、およびプロセス管理に関係するため、間違いなくプログラミングに関するものでもあります。

そのため、終了できないこれらのプロセスがありますtaskkill-システムプロセス全般。しかし、たとえば、それ自体を「終了不可能」にする私のアンチウイルスプログラムもあります。

  • Windows でシステム プロセスにアクセスし、主にシステム プロセスを終了するにはどうすればよいですか? (マイクロソフトの kill.exe は動作しません)

  • ウイルス対策プログラムなどのプロセスはどのように自分自身を保護しますか? では、どうすればそれらを再びオフにできますか?

4

2 に答える 2

0

「通常の」方法でプロセスを終了できない場合は、さらに極端な手段が必要です。セキュリティ レベルを上げてみることもできますが、うまくいかない場合があります。

ここで試すことができる 2 つのかなり強引な方法を次に示します。どちらもターゲット アプリケーションに正常にインジェクトでき​​る必要があります (NT 4 で 2% の失敗率、XP で 5% の失敗率、Vista、Windows 7 でより高い失敗率など)。 )。

CreateRemoteThread() を使用して DLL をアプリケーションに挿入し、挿入された DLL の DLLMain で次のいずれかを実行してみてください。

  • ExitProcess(exitCode) を呼び出します。
  • 例外ハンドラーを登録してから、例外ハンドラーでキャッチする例外を発生させます。例外ハンドラーで別の例外 (および/またはスタックオーバーフロー) を引き起こします。例外処理中に例外が発生すると、プログラムは即座に終了します。
void KillApp()
{
    int *p;

    p = NULL;

    __試す
    {
            *b = 0;
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        killApp();
    }
}

CreateRemoteThread を使用した注入に関する多数の記事

于 2010-03-29T21:09:36.683 に答える
0

プロセスが終了しないように保護するには、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);
}
于 2010-03-14T20:21:26.683 に答える