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

Posted

技术标签:

【中文标题】强制任何正在运行的进程崩溃【英文标题】:force any running process to crash 【发布时间】:2012-05-28 00:16:26 【问题描述】:

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

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

有什么帮助吗?

【问题讨论】:

如果这是一个可以附加调试器的程序,那么您可以在不分离的情况下退出调试器 - 这会使您的应用程序崩溃 这能回答你的问题吗? Force crash an application 【参考方案1】:

好吧,在远程进程上使用 CreateRemoteThread 并调用 something [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);

当然,您需要将调用中的 PID 调整为 killProcess。使用 WNET DDK 编译并在 2003 Server R2 上测试。

这里的要点是,我们告诉远程进程在地址 0x1 ((LPTHREAD_START_ROUTINE)1) 处执行代码,该地址位于空页面内,但不是空指针(以防有针对它的检查)。函数周围的垃圾,特别是 setCurrentPrivilege 用于获得完整的调试权限,这样我们就可以做坏事了。

【讨论】:

【参考方案2】:

您可以使用DLL injection technique 将您的代码注入另一个进程。然后在您注入的代码中执行一些简单的操作,例如 abort() 或除以零。

【讨论】:

【参考方案3】:

需要一个两步机制:

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

【讨论】:

【参考方案4】:

以下是使用winapiexec 工具的方法:

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

1234替换为进程id并运行命令,进程会崩溃。

【讨论】:

以上是关于强制任何正在运行的进程崩溃的主要内容,如果未能解决你的问题,请参考以下文章

易语言如何强制删除正在运行的程序?

如果MPI进程崩溃会发生什么?

强制使应用程序崩溃

龙卷风多进程崩溃与nltk

为啥注入的任何 DLL 都会使主机进程崩溃?

如何强制 WCF 线程中未处理的异常使进程崩溃?