为了账号安全,请及时绑定邮箱和手机立即绑定

如何利用TerminateProcess()和OpenProcess()函数阻止结束进程?

如何利用TerminateProcess()和OpenProcess()函数阻止结束进程?

子衿沉夜 2021-08-02 18:07:46
求一个简单的C#程序源码,利用上面两个API函数阻止用户通过任务管理器等工具结束自己的进程。以下思路为网上所找:任务管理器的“结束任务”实际上就是强制终止进程,它调用一个叫做TerminateProcess()的Win32 API函数BOOL TerminateProcess(HANDLE hProcess, // 将被结束进程的句柄UINT uExitCode // 指定进程的退出码);可见TerminateProcess在判断结束进程前会先判断当前进程hProcess是不是我要结束的那个,而获得hprocess的方法需要调用OpenProcess所以我们只要在结束进程前给OpenProcess这个函数并传入要访问的进程ID来获得进程的句柄HANDLE OpenProcess(DWORD dwDesiredAccess, // 希望获得的访问权限BOOL bInheritHandle, // 指明是否希望所获得的句柄可以继承DWORD dwProcessId // 要访问的进程ID);中的dwProcessId赋一个错误的ID,管理器得不到正确的ID自然就不能结束这个进程,随后再弹出对话框利用自己的关闭方法我想就可以实现了请把代码写在一个文件里贴上来,在线等,非常感谢。请注意,思路我已经有了,写在上面,我现在要的是实现的代码,一定要是代码,因为我不清楚具体应该怎么用,所以要个源码参考一下,谢谢。请把代码写在一个文件里贴上来。非常感谢。
查看完整描述

2 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

windows 系统有一个叫做system hook的技术,用于让你对系统api做些手脚。
你可以通过注册一个新的TerminateProcess函数钩子,当系统调用这个函数时,就会调用你的函数,你的函数可以判断这个进程是不是你的程序,比如通过窗口的title,class什么的。
如果不是你的窗口,就调用原始的TerminateProcess,如果是你的窗口,就直接return.

另外,你也可以试试重载你的C#程序的WinProc方法,对于WM_CLOSE, WM_DESTORY, WM_QUIT之类的消息进行忽略,只对于自己发出的关闭才正常响应。

上述两个思路,你选择吧。代码没有功夫写。

你的那个思路技术上有些问题。

查看完整回答
反对 回复 2021-08-09
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

STARTUPINFO StartupInfo;//定义STARTUPINFO结构指针 memset(&StartupInfo,0,sizeof(STARTUPINFO)); StartupInfo.cb = sizeof(STARTUPINFO); StartupInfo.dwFlags=STARTF_USESHOWWINDOW; StartupInfo.wShowWindow=SW_SHOW; PROCESS_INFORMATION ProcessInfo; if (!CreateProcess("D:\\Program Files\\Fluent.Inc\\ntbin\\ntx86\\gambit.exe" , cmdline.GetBuffer(cmdline.GetLength()),NULL,NULL,FALSE,0,NULL,"E:\\zuoye\\gambit1",&StartupInfo,&ProcessInfo)){cout<<"Create Fail!"<<endl;exit(1);}else{cout<<"Success!"<<endl;} WaitForSingleObject(ProcessInfo.hProcess,INFINITE);}void main(){gambit();HANDLE han=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //取进程快照 PROCESSENTRY32 lpp; lpp.dwSize=sizeof(PROCESSENTRY32);BOOL bo;bo=Process32First(han,&lpp); //从快照里取第一个进程信息 TCHAR *str1;while(bo){str1=lpp.szExeFile ; if(!strcmp(str1,"exceed.exe") || !strcmp(str1,"gambit.exe")){HANDLE han2=OpenProcess(1,TRUE,lpp.th32ProcessID); //取进程实例 PROCESS_TERMINATE //cout<<str; TerminateProcess(han2,0); //关闭}bo=Process32Next(han,&lpp); //取下一个进程信息}CloseHandle(han); ------解决方案--------------------------------------------------------TerminateProcess结束进程是不安全的。这个进程最好没有带锁的资源。而你的这个里面好像用到了cout,虽然我不知道这个到底是否有没有锁,但是这个cout肯定是互斥的。这样就有可能导致了结束进程失败 ------解决方案--------------------------------------------------------先确定有没有执行到TerminateProcess ------解决方案--------------------------------------------------------既然是windows 平台, 那就用system 调用相关的 命令吧, system 执行 下面的命令, 绝大部分进程都能结束,方便实用。



查看完整回答
反对 回复 2021-08-09
  • 2 回答
  • 0 关注
  • 745 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信