强制任何正在运行的进程崩溃

时间:2012-05-21 13:30:56

标签: windows testing crash

我想崩溃我选择的正在运行的程序(例如,notepad ++,becrypt,word)用于软件测试。

我知道如何BSOD,我知道如何导致我编写的程序崩溃,我知道如何结束进程 - 但是如何崩溃现有进程我不会!

任何帮助?

4 个答案:

答案 0 :(得分:6)

好吧,在远程进程上使用CreateRemoteThread并调用某些 [1]可靠地崩溃进程。我不确定CreateRemoteThread是否可以防止空指针,但是您可以将空页中的地址传递给它并让远程进程执行该指针。

[1]空指针或空页访问,除以零,调用特权指令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);
}

当然,您希望在调用killProcess时调整PID。使用WNET DDK编译并在2003 Server R2上进行测试。

这里的要点是我们告诉远程进程在地址0x1((LPTHREAD_START_ROUTINE)1)执行代码,该代码在空页面内但不是空指针(如果有检查)。函数周围的问题,特别是setCurrentPrivilege用于获得完全调试权限,因此我们可以做我们的恶行。

答案 1 :(得分:1)

您可以使用DLL injection technique将代码注入其他进程。然后在你注入的代码中做一些简单的事情,比如abort()或除零。

答案 2 :(得分:1)

需要两步机制:

  1. 将进程注入崩溃(使用注入库,使用Detours,使用Hook安装等)。您选择的内容取决于您拥有的时间和知识以及其他前提条件(如凭据,防注射保护,您要留下的足迹大小......)
  2. 在注入的进程中执行无效操作(如int 2Eh,除以null等)。

答案 3 :(得分:0)

以下是使用winapiexec工具进行的操作:

winapiexec64.exe CreateRemoteThread ( OpenProcess 0x1F0FFF 0 1234 ) 0 0 0xDEAD 0 0 0

用进程ID替换1234并运行命令,该进程将崩溃。