亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何利用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 關注
  • 891 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號