方法一針對有窗口的
消息攻擊法
void main(int argc, char **argv) { HWND hwnd = FindWindow(NULL, "Title"); SendMessage(hwnd,WM_CLOSE,0,0); HWND hwnd = FindWindow(NULL, "Title"); SendNotifyMessage(hwnd,WM_CLOSE,0,0); HWND hwnd = FindWindow(NULL, "Title"); SendMessageTimeout(hwnd,WM_CLOSE,0,0,SMTO_NORMAL,2000,NULL); HWND hwnd = FindWindow(NULL, "Title"); SendMessageCallback(hwnd,WM_CLOSE,0,0,NULL,0); }
上面也可以采用PostMessage,具體實現參考MSDN
方法二針對有窗口的
模擬鍵盤和鼠標攻擊法,主要采用keybd_event()函數。
HWND hwnd = FindWindow(NULL, "Title"); SetForegroundWindow(hwnd);//設置為當前窗口 keybd_event(VK_ESCAPE,0,0,0);//模擬鍵盤ESC鍵使其關閉 //或者 hWin = FindWindow(NULL,"test"); SetForegroundWindow(hWin); keybd_event(VK_MENU,0,0,0); keybd_event(VK_F4,0,0,0); keybd_event(VK_MENU,0,KEYEVENTF_KEYUP,0); keybd_event(VK_F4,0,KEYEVENTF_KEYUP,0);//按下alt+f4關閉程序 //或者 keybd_event(VK_MENU,0,0,0); keybd_event(0x20,0,0,0); keybd_event(0x43,0,0,0); keybd_event(VK_MENU,0,KEYEVENTF_KEYUP,0); keybd_event(0x20,0,KEYEVENTF_KEYUP,0); keybd_event(0x43,0,KEYEVENTF_KEYUP,0);//按下alt+空格+C使其關閉 //或者 hWin = FindWindow(NULL,"test"); GetWindowRect(hWin,&Rect); SetForegroundWindow(hWin); //設為當前窗口 Sleep(100); //這里延遲一會 SetCursorPos(Rect.right-7,Rect.top+7); //設置叉號的坐標 mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0); mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);//按下左鍵並松開使完成關閉
方法三
常規API攻擊進程,原理都是一樣的
1 TerminateProcess
2 ZwTerminateProcess/NtTerminateProcess(ring3&ring0 restore ssdt/inline hook等等)
3 WINSTA.dll WinStationTerminateProcess
如下:
hWnd = FindWindow(NULL, "test"); GetWindowThreadProcessId(hWnd, &pid); hDll = LoadLibrary("WINSTA.dll"); pFunc = (PWSTP)GetProcAddress(hDll, "WinStationTerminateProcess"); if((pFunc)(NULL, pid, 0)) printf("Successful!/nProgram Terminated./n"); FreeLibrary(hDll);
4
/* 需要安裝最新的Platform SDK */ #include <Wtsapi32.h> #pragma comment (lib, "Wtsapi32.lib") hWnd = FindWindow(NULL, "test"); GetWindowThreadProcessId(hWnd, &pid); if (WTSTerminateProcess(NULL, pid, 0)) printf("Successful!/nProgram Terminated./n");
注意:本人親測下來,WinStationTerminateProcess和WTSTerminateProcess還都是調用NTAPI的NtTerminateProcess來結束進程的
所以,已經HOOK掉(Nt)TerminateProcess的進程,這兩種操作也都無效了。
5一些vbs腳本的wmi對象
方法四
常規API攻擊線程
TerminateThread
Nt/ZwTerminateThread
EndTask
在這里,本人要說明一下:
不要以為帶Zw的比Nt的底層一些,在應用層調用兩個函數,效果一模一樣。
HWND hWnd = FindWindowA(NULL,"test"); DWORD dwThreadId; dwThreadId = GetWindowThreadProcessId(hWnd,NULL); bSus = EndTask(hWnd,FALSE,TRUE); printf("EndTask :%d LastError :%d /r/n",bSus,GetLastError()); //或者 typedef HANDLE ( _stdcall *XXXOpenThread)( DWORD Access, BOOL bInherit, DWORD dwThreadID); void KillThread() { HANDLE hThread; XXXOpenThread OpenThread; OpenThread = (XXXOpenThread)GetProcAddress( GetModuleHandle("kernel32.dll", "OpenThread")); hThread = OpenThread( THREAD_ALL_ACCESS, FALSE, GetTid() ); TerminateThread( hThread, 0 ); CloseHandle( hThread ); return; }
方法五
作業對象攻擊法
CreateJobObject
然后AssignProcessToJobObject,
最后TerminateJobObject。
下面給出本人的參考代碼:
#include <windows.h> BOOL KillProcessByJob(DWORD pid) { HANDLE hjob = CreateJobObject(0,0); HANDLE hpro = OpenProcess(PROCESS_ALL_ACCESS, 0, pid); AssignProcessToJobObject(hjob,hpro); TerminateJobObject(hjob,0); return GetLastError() == 0; }
本人親測通過:win10
方法六
遠程攻擊線程
1全局勾子
首先用SetWindowsHookEx(或者SetWinEventHook(EVENT_MIN,EVENT_MAX,hMyModule,
(WINEVENTPROC)WinEventProc,0,0,WINEVENT_INCONTEXT | WINEVENT_SKIPOWNPROCESS);
)一個鈎子
然后廣播一個消息 這樣所有的窗體就被注入了(也可以用SendMessage(hwnd , WM_PAINT, 0, 0)或者PostMessage(hWnd,WM_CHAR,13,0);等觸發鈎子執行)
在注入的動態庫的DLL_PROCESS_ATTACH事件中判斷被注入的進程名,調用ExitProcess(0)/TerminateProcess(GetCurrentProcess(),0)/PostQuitMessage(0)
或者在鈎子過程中:
VOID CALLBACK WinEventProc(HWINEVENTHOOK hWinEventHook, DWORD event, HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime) { HWND hwnd1 = FindWindow(NULL,"test"); DWORD Pid; if (hwnd1) { GetWindowThreadProcessId(hwnd1,&Pid); if (Pid == GetCurrentProcessId()) ExitProcess(0); } }
2直接遠程注入一個線程ExitProcess
void RemoteExitProcess() { HANDLE hProcess; HANDLE hThread; DWORD Pid; Pid = GetPid();//得到目標進程Pid if ( Pid == 0 ) return; hProcess = OpenProcess( PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION, FALSE, Pid); if ( hProcess == INVALID_HANDLE_VALUE ) return; hThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE) GetProcAddress( GetModuleHandle("kernel32.dll","ExitProcess" ), 0, 0, NULL ); CloseHandle( hThread ); }
3還是遠程線程,不過方法霸道一些,強制讓其崩潰退出
遠程線程后,
mov fs:[0],0(去除SEH)
mov eax,cr0(使進程崩潰)
方法七
ThreadContext patch法
直接修改目標進程ThreadContext的EIP指向目標程序的kernel32.dll的ExitProcess地址
hThread = OpenThread( THREAD_ALL_ACCESS, FALSE, GetTid() ); SuspendThread( hThread ); bRet = GetThreadContext( hThread, &Context); Context.Eip = (DWORD)GetProcAddress( GetModuleHandle("kernel32.dll"), "ExitProcess" ); bRet = SetThreadContext( hThread, &Context); ResumeThread( hThread ); CloseHandle( hThread );
方法八
句柄攻擊法
hwnd=FindWindow(NULL, 'test'); GetWindowThreadProcessId(hwnd, &pid); hTargetProcess=OpenProcess(PROCESS_DUP_HANDLE, false, pid); DuplicateHandle(hTargetProcess,-1, GetCurrentProcess(),&TargetProcessHandle, PROCESS_ALL_ACCESS, false, DUPLICATE_SAME_ACCESS); //將目標進程句柄復制到自身的TargetProcessHandle中 CloseHandle(hProcess); TerminateProcess(TargetProcessHandle , 0);//日掉 CloseHandle(hp_new);
或者ring0下想辦法得到句柄等等。。。。
另外所有的win32子系統的進程都會有一個句柄在csrss.exe進程里面,也可以在這個里面
找到目標進程句柄
方法九
內存攻擊法
1Process Virtual Address Space Erasing (進程虛擬地址空間擦除)=配合句柄法得到目
標進程句柄,然后暴力寫內存(或者NtFreeVirtualMemory 等)
2ring0附加目標進程寫內存
3直接寫遠程進程的內存WriteProcessMemory
4搜出NtUnmapViewOfSection(更底層的MiUnmapViewOfSection)等等,卸掉目標進程的內存
空間(或者卸kernel32.dll等關鍵dll等也可,VirtualProtectEx設kernel32.dll為不可
讀也讓其崩潰),同樣要配合句柄法得到目標進程句柄才行
方法十
調試器攻擊法
1 DebugActiveProcess-->DebugSetProcessKillOnExit
2 ntsd -c q -p pid 借助windows WDK調試器 ntsd.exe
代碼實現:
#define _WIN32_WINNT 0x0502 #include <windows.h> #include <stdlib.h> BOOL KillProcessUseDebug_Routine(DWORD PID) { DebugActiveProcess(PID); DebugSetProcessKillOnExit(0); //Exit Status return NULL; } void Use_ntsd() { system("ntsd -c q -pn/pid"); }
方法十一
ring0線程進程攻擊法
NtQuerySystemInformation(SystemProcessesAndThreadsInformation)
遍歷線程后做判斷是否目標進程的,然后:
1 Apc攻擊結束(ring3/ring0)--->然后PsTerminateSystemThread-->最好用
PspExitThread
2 PspTerminateProcess(更底層的PspTerminateThreadByPointer)
3 修改pid和tid為自身的,再插apc(防止消息死循環進程保護)
方法十二
偽關機法
先提升權限得到19號關機特權,然后hook關機消息(hook NtShutdownSystem),里面過濾
掉除了目標進程意外的所有進程的消息。
ring3下
ExitWindows(0,0); //第一個參數分別為0,1,2時 分別是注銷,關機,重起.所以是3種
Logs off the interactive user, shuts down the system, or shuts down and
restarts the system. It sends the WM_QUERYENDSESSION message to all
applications to determine if they can be terminated.
ring0下NtShutdownSystem(0)為關機,NtShutdownSystem(1)為重啟。
或者再底層點NtSetSystemPowerState
這樣,目標進程接到關機消息over了,但系統不會處理關機消息
以上所有函數原型均可在MSDN上查找到。
如或有其他更好方法,歡迎評論!