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.
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. –