2012-05-21 15 views
5

Yazılım testi için tercih ettiğim bir çalışma programını (örneğin, notepad ++, becrypt, word) çökertmek istiyorum.herhangi bir çalışan işlemi çökmeye zorlar

BSOD'un nasıl yapıldığını biliyorum, çökmek için yazdığım bir programın nasıl yapıldığını biliyorum. İşlemi nasıl sonlandıracağımı biliyorum - ancak nasıl varolan bir işlemi çökertmeyeceğim!

Herhangi bir yardım?

+0

Bu, bir hata ayıklayıcısını ekleyebileceğiniz bir program varsa, hata ayıklayıcısını kopmadan çıkartabilirsiniz - bu, uygulamanızı kilitler. –

cevap

1

Kodunuzu başka bir işleme enjekte etmek için DLL injection technique kullanabilirsiniz. Sonra enjekte kodunuzda abort() veya sıfıra bölme gibi basit bir şey yapın.

4

Uzak bir işlemde CreateRemoteThread kullanın ve işlemi güvenilir bir şekilde çökerten [0] [1] 'yi kullanın. CreateRemoteThread'un boş göstericilere karşı koruyup korumadığından emin değilim, ancak null sayfasındaki bir adresi iletebilir ve uzaktaki işlemi yürütür.

[1] ayrıcalıklı talimat, int3 çağırma boş işaretçi veya boş sayfa erişim, sıfıra bölme, ...


Örnek :

#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); 
} 

Tabii ki isteyeceksiniz aramaya PID'yi killProcess'a ayarlayın. WNET DDK ile derlenmiş ve 2003 Server R2'de test edilmiştir.

Burada, uzaktan işlemin, boş sayfanın içinde yer alan boş bir gösterici (buna karşı denetimler olması durumunda) olan 0x1 ((LPTHREAD_START_ROUTINE)1) adresindeki kodu yürütmesi için uzaktan işlem gerçekleştirdiğimiz anlatılmaktadır. Özellikle setCurrentPrivilege işlevinin çevresindeki kaba, tüm hata ayıklama ayrıcalıklarını elde etmek için kullanılır, böylece kötü eylemimizi yapabiliriz.

1

bir iki adım mekanizması gereklidir:

  1. (vs .., bir kanca yükleme kullanılarak, Detours kullanılarak, bir enjeksiyon kitaplığı kullanılarak) çökmesine işlemi enjekte edilir. Seçtiğiniz bilgi, sahip olduğunuz bilgi ve diğer önkoşullara (kimlik bilgileri, anti-enjeksiyon koruması, bırakmak istediğiniz ayak izi boyutu gibi) bağlıdır.
  2. Enjekte edilen işlemde geçersiz bir işlem gerçekleştirin (int 2Eh, null ile bölün, vs ..)
İlgili konular