2012-05-21 14 views
5

ソフトウェアテストの目的で、実行中のプログラム(たとえば、notepad ++、becrypt、word)をクラッシュさせたいと思います。実行中のプロセスが強制的にクラッシュするようにする

私はBSODの方法を知っています。プログラムをクラッシュさせる方法を知っています。プロセスを終了する方法はわかっていますが、既存のプロセスをクラッシュさせる方法はありません。

助けてくださいか?

+0

デバッガを接続できるプログラムであれば、デバッガを切り離さずに終了することができます。これによりアプリケーションがクラッシュします –

答えて

1

DLL injection techniqueを使用すると、コードを別のプロセスに注入できます。次に、注入されたコードでは、abort()やゼロ除算のような単純な処理を行います。

4

まあ、リモートプロセスでCreateRemoteThreadを使用し、何か [1]を呼び出してプロセスを確実にクラッシュさせます。私はCreateRemoteThreadがヌルポインターを守っているかどうかは分かりませんが、nullページにアドレスを渡してリモートプロセスに実行させることができます。

[1] NULLポインタまたはnullページへのアクセス、ゼロによる除算を、特権命令、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. は(ETC、フックインストールを使用して、Detoursを用いて、射出ライブラリを使用して..)クラッシュするプロセスを注入します。あなたが選択するものは、あなたが持っている時間と知識、そして資格、アンチインジェクション保護、残したい足のサイズなどの前提条件に依存します。
  2. 注入されたプロセスで無効な操作を実行します(int 2Eh、nullで割るなど)
関連する問題