forcer tout processus en cours d’exécution à tomber en panne

Je voudrais planter un programme en cours de mon choix (par exemple, notepad ++, becrypt, word) à des fins de test logiciel.

Je sais comment BSOD, je sais comment provoquer un programme que j’écris pour écraser, je sais comment terminer le processus – mais comment planter un processus existant, je ne le fais pas!

de l’aide?

Eh bien, utilisez CreateRemoteThread sur un processus distant et appelez quelque chose [1] qui bloque le processus de manière fiable. Je ne suis pas sûr que CreateRemoteThread protège contre les pointeurs nuls, mais vous pouvez lui transmettre une adresse dans la page null et le faire exécuter par le processus distant.

[1] pointeur nul ou access à la page null, division par zéro, int3 une instruction privilégiée, int3


Exemple:

 #include  #include  #include  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].Atsortingbutes = (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); } 

Bien sûr, vous voudrez ajuster le PID dans l’appel à killProcess . Compilé avec WNET DDK et testé sur 2003 Server R2.

L’essentiel est de dire au processus distant d’exécuter du code à l’adresse 0x1 ( (LPTHREAD_START_ROUTINE)1 ), qui se trouve dans la page null, mais pas dans un pointeur nul (s’il existe des vérifications par rapport à cela). Le crud autour de la fonction, en particulier setCurrentPrivilege est utilisé pour obtenir des privilèges de débogage complets afin que nous puissions faire notre mal.

Vous pouvez utiliser la technique d’injection DLL pour injecter votre code dans un autre processus. Ensuite, dans votre code injecté, faites quelque chose de simple comme abort () ou division par zéro.

Un mécanisme en deux étapes est nécessaire:

  1. injecter le processus à planter (en utilisant une bibliothèque d’injection, en utilisant Detours , en utilisant une installation Hook, etc.). Ce que vous choisissez dépend du temps et des connaissances que vous avez et d’autres conditions préalables (comme les informations d’identification, la protection anti-injection, la taille de l’empreinte que vous souhaitez laisser ..)
  2. effectuer une opération invalide dans le processus injecté (comme int 2Eh, diviser par null, etc.)