6

I would like to crash a running program of my choice (e.g., notepad++, becrypt, word) for software testing purposes.

I know how to BSOD, I know how to cause a program I write to crash, I know how to end process - but how to crash an existing process I do not!

any help?

4

4 に答える 4

7

リモート プロセスで使用し、プロセスを確実にクラッシュさせる [1]ものCreateRemoteThreadを呼び出します。null ポインターをガードするかどうかはわかりませんが、null ページのアドレスを渡して、リモート プロセスにそれを実行させることができます。CreateRemoteThread

[1] NULL ポインタまたは NULL ページ アクセス、0 による除算、特権命令の呼び出し、int3...


例:

#include <stdio.h>
#include <tchar.h>
#include <Windows.h>

BOOL setCurrentPrivilege(BOOL bEnable, LPCTSTR lpszPrivilege)
{
    HANDLE hToken = 0;
    if(::OpenThreadToken(::GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, FALSE, &hToken)
        || ::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
    {
        TOKEN_PRIVILEGES tp;
        LUID luid;

        if(!::LookupPrivilegeValue(
            NULL,            // lookup privilege on local system
            lpszPrivilege,   // privilege to lookup 
            &luid ) )        // receives LUID of privilege
        {
            ::CloseHandle(hToken);
            return FALSE; 
        }
        tp.PrivilegeCount = 1;
        tp.Privileges[0].Luid = luid;
        tp.Privileges[0].Attributes = (bEnable) ?  SE_PRIVILEGE_ENABLED : 0;

        // Enable the privilege or disable all privileges.
        if(!::AdjustTokenPrivileges(
            hToken,
            FALSE,
            &tp,
            sizeof(TOKEN_PRIVILEGES),
            (PTOKEN_PRIVILEGES) NULL,
            (PDWORD) NULL)
            )
        {
            CloseHandle(hToken);
            return FALSE; 
        }
        ::CloseHandle(hToken);
    }
    return TRUE;
}

int killProcess(DWORD processID)
{
    HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, processID);
    if(hProcess)
    {
        if(!setCurrentPrivilege(TRUE, SE_DEBUG_NAME))
        {
            _tprintf(TEXT("Could not enable debug privilege\n"));
        }
        HANDLE hThread = ::CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)1, NULL, 0, NULL);
        if(hThread)
        {
            ::CloseHandle(hThread);
        }
        else
        {
            _tprintf(TEXT("Error: %d\n"), GetLastError());
            ::CloseHandle(hProcess);
            return 1;
        }
        ::CloseHandle(hProcess);
    }
    return 0;
}

int __cdecl _tmain(int argc, _TCHAR *argv[])
{
    killProcess(3016);
}

もちろん、 への呼び出しで PID を調整する必要がありますkillProcess。WNET DDK でコンパイルされ、2003 Server R2 でテストされています。

ここでの要点は、リモート プロセスにアドレス 0x1 ( (LPTHREAD_START_ROUTINE)1) でコードを実行するように指示することです。これはヌル ページ内にありますが、ヌル ポインターではありません (それに対するチェックがある場合)。特に、関数の周りの crud は、setCurrentPrivilege完全なデバッグ権限を取得するために使用されるため、悪事を行うことができます。

于 2012-05-21T13:45:08.573 に答える
1

コードを別のプロセスに挿入するために、DLL インジェクション手法を使用できます。次に、挿入されたコードで、abort() やゼロ除算などの簡単なことを行います。

于 2012-05-21T13:43:39.570 に答える
1

2 段階のメカニズムが必要です。

  1. プロセスを注入してクラッシュさせます (注入ライブラリを使用する、Detoursを使用する、フック インストールを使用するなど)。何を選択するかは、あなたが持っている時間と知識、およびその他の前提条件 (資格情報、注射防止保護、残したいフットプリントのサイズなど) によって異なります。
  2. 注入されたプロセスで無効な操作を実行します (int 2Eh、null による除算など)。
于 2012-05-21T15:47:57.453 に答える