结束进程的12种方法

方法一针对有窗口的
消息攻击法

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上查找到。

如或有其他更好方法,欢迎评论!

转载于:https://www.cnblogs.com/Leoleepz/p/6259413.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一些常见的结束进程思路,共列举了20种: 1. 使用操作系统提供的任务管理器或进程管理工具手动结束进程。 2. 在命令行界面使用`taskkill`命令(Windows)或`kill`命令(Linux)终止进程。 3. 使用C++编程语言调用操作系统提供的API函数,如`TerminateProcess`(Windows)或`kill`(Linux)。 4. 使用C++编程语言调用操作系统提供的API函数,如`OpenProcess`和`TerminateProcess`(Windows)或`fork`和`kill`(Linux)。 5. 使用C++编程语言调用第三方库,如Boost.Process或Poco库,来结束进程。 6. 使用注册表编辑器或命令行工具修改系统注册表,以禁用或删除进程的启动项。 7. 使用系统工具或第三方软件,如Sysinternals Suite(Windows)或htop(Linux),来查找并结束进程。 8. 使用系统管理员权限登录,并使用管理员命令终止进程。 9. 使用远程管理工具,如远程桌面协议(RDP)或SSH,在远程计算机上结束进程。 10. 在安全模式下启动计算机,并使用任务管理器或命令行工具结束进程。 11. 使用调试器工具,如GDB(Linux)或WinDbg(Windows),附加到进程并终止它。 12. 使用系统监控工具,如Process Explorer(Windows)或top命令(Linux),找到并结束进程。 13. 使用系统安全软件,如防火墙或杀毒软件,设置规则以阻止或终止指定进程。 14. 在命令行界面使用`ps`命令(Linux)或`tasklist`命令(Windows)查找进程ID,然后使用`kill`或`taskkill`命令终止进程。 15. 使用批处理脚本或PowerShell脚本编写一段自动化的脚本来结束进程。 16. 使用系统策略或组策略编辑器设置,限制特定用户或用户组对进程的访问权限。 17. 使用系统资源管理器或文件管理器终止进程,如Windows资源管理器或Linux文件管理器。 18. 使用系统命令行工具,如wmic(Windows)或ps(Linux),查询进程信息并终止进程。 19. 使用系统性能监测工具,如Performance Monitor(Windows)或top命令(Linux),找到并结束进程。 20. 使用第三方进程管理工具,如Process Hacker、Sysinternals Suite或htop,来查找并结束进程。 这些思路提供了不同的方式来结束进程,可以根据具体情况选择合适的方法。请注意,在实际使用中要遵循法律法规,并确保有足够的权限来执行这些操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值