加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-14 02:03:08 所属栏目:Windows 来源:网络整理
导读:我想崩溃我选择的正在运行的程序(例如,notepad,becrypt,word)用于软件测试. 我知道如何BSOD,我知道如何导致我编写的程序崩溃,我知道如何结束进程 – 但是如何崩溃现有进程我不知道! 任何帮助? 解决方法 好吧,在远程进程上使用CreateRemoteThread并调用可靠
我想崩溃我选择的正在运行的程序(例如,notepad,becrypt,word)用于软件测试.

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

任何帮助?

解决方法

好吧,在远程进程上使用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(),&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,&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,processID);
    if(hProcess)
    {
        if(!setCurrentPrivilege(TRUE,SE_DEBUG_NAME))
        {
            _tprintf(TEXT("Could not enable debug privilegen"));
        }
        HANDLE hThread = ::CreateRemoteThread(hProcess,NULL,(LPTHREAD_START_ROUTINE)1,NULL);
        if(hThread)
        {
            ::CloseHandle(hThread);
        }
        else
        {
            _tprintf(TEXT("Error: %dn"),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用于获得完全调试权限,因此我们可以做我们的恶行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读