我想崩潰正在運行的程序(例如,notepad ++,becrypt,word)以進行軟件測試。強制任何正在運行的進程崩潰
我知道如何BSOD,我知道如何導致我編寫的程序崩潰,我知道如何結束進程 - 但如何崩潰現有的進程我不!
有幫助嗎?
我想崩潰正在運行的程序(例如,notepad ++,becrypt,word)以進行軟件測試。強制任何正在運行的進程崩潰
我知道如何BSOD,我知道如何導致我編寫的程序崩潰,我知道如何結束進程 - 但如何崩潰現有的進程我不!
有幫助嗎?
您可以使用DLL injection technique將代碼注入到另一個進程中。然後在你的注入代碼中做一些簡單的事情,比如放棄()或零除。
那麼,在遠程進程上使用CreateRemoteThread
並調用 [1]會使進程可靠地崩潰。我不確定CreateRemoteThread
是否能夠防止空指針,但是您可以將空頁中的地址傳遞給它,並讓遠程進程執行該地址。
[1]空指針或空頁的訪問,除0,調用特權指令,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
被用來獲得完全的調試特權,所以我們可以做我們的惡行。
需要一種兩步機制:
如果這是一個程序,你可以附加一個調試器,那麼你可以退出調試器而不分離 - 這會導致你的應用程序崩潰 –