ソフトウェアテストの目的で、実行中のプログラム(たとえば、notepad ++、becrypt、word)をクラッシュさせたいと思います。実行中のプロセスが強制的にクラッシュするようにする
私はBSODの方法を知っています。プログラムをクラッシュさせる方法を知っています。プロセスを終了する方法はわかっていますが、既存のプロセスをクラッシュさせる方法はありません。
助けてくださいか?
ソフトウェアテストの目的で、実行中のプログラム(たとえば、notepad ++、becrypt、word)をクラッシュさせたいと思います。実行中のプロセスが強制的にクラッシュするようにする
私はBSODの方法を知っています。プログラムをクラッシュさせる方法を知っています。プロセスを終了する方法はわかっていますが、既存のプロセスをクラッシュさせる方法はありません。
助けてくださいか?
DLL injection techniqueを使用すると、コードを別のプロセスに注入できます。次に、注入されたコードでは、abort()やゼロ除算のような単純な処理を行います。
まあ、リモートプロセスで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
という関数の周りには、完全なデバッグ権限を得るために使われているので、私たちは悪意のある行為をすることができます。
二段階機構が必要である:
デバッガを接続できるプログラムであれば、デバッガを切り離さずに終了することができます。これによりアプリケーションがクラッシュします –