为了软件测试的目的,我想使我选择的正在运行的程序(例如,notepad++、becrypt、word)崩溃。
我知道如何蓝屏,我知道如何导致我编写的程序崩溃,我知道如何结束进程 - 但如何让现有进程崩溃我不知道!
有什么帮助吗?
好吧,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
. 使用 WNET DDK 编译并在 2003 Server R2 上测试。
这里的要点是,我们告诉远程进程在地址 0x1 ( ) 处执行代码,(LPTHREAD_START_ROUTINE)1
该地址位于空页面内,但不是空指针(以防有针对它的检查)。函数周围的垃圾,特别setCurrentPrivilege
是用于获得完整的调试权限,以便我们可以做我们的坏事。
需要一个两步机制:
您可以使用DLL 注入技术将代码注入另一个进程。然后在您注入的代码中执行一些简单的操作,例如 abort() 或除以零。
以下是使用该winapiexec
工具执行此操作的方法:
winapiexec64.exe CreateRemoteThread ( OpenProcess 0x1F0FFF 0 1234 ) 0 0 0xDEAD 0 0 0
替换1234
为进程id并运行命令,进程将崩溃。