我想崩溃一个正在运行的程序(例如,notepad ++,becrypt,word)来进行软件testing。
我知道如何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(), 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 R2上测试。
这里的要点是我们告诉远程进程在地址为0x1( (LPTHREAD_START_ROUTINE)1
)的地方执行代码,该代码位于空白页面内,但不是空指针(如果存在对此的检查)。 围绕函数的问题,特别是setCurrentPrivilege
被用来获得完全的调试权限,所以我们可以做我们的恶行。
您可以使用DLL注入技术将代码注入到另一个进程中。 然后在你的注入代码中做一些简单的事情,比如放弃()或零除。
需要两步机制: