2012-05-21 74 views
5

我想崩潰正在運行的程序(例如,notepad ++,becrypt,word)以進行軟件測試。強制任何正在運行的進程崩潰

我知道如何BSOD,我知道如何導致我編寫的程序崩潰,我知道如何結束進程 - 但如何崩潰現有的進程我不!

有幫助嗎?

+0

如果這是一個程序,你可以附加一個調試器,那麼你可以退出調試器而不分離 - 這會導致你的應用程序崩潰 –

回答

1

您可以使用DLL injection technique將代碼注入到另一個進程中。然後在你的注入代碼中做一些簡單的事情,比如放棄()或零除。

4

那麼,在遠程進程上使用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被用來獲得完全的調試特權,所以我們可以做我們的惡行。

1

需要一種兩步機制:

  1. 注入過程崩潰(使用注射文庫,使用Detours,使用鉤安裝,等等。)。您選擇的內容取決於您擁有的時間和知識以及其他先決條件(如憑證,防注入保護,您要離開的打印尺寸..)
  2. 在注入過程中執行無效操作(如int 2Eh,除以空等)。