大家好,我正在编写一个程序来提高工作效率。它应该断开用户与Internet的连接,或者在预设的分钟数后关闭计算机。不应该使用任务管理器关闭该程序。我可以编译程序并运行,但我可以用任务管理器关闭它。我从这个页面得到了灵感 Prevent user process from being killed with "End Process" from Process Explorer
#include <iostream>
#include <Windows.h>
#include <AccCtrl.h>
#include <AclAPI.h>
#include <tchar.h>
#include "shutdown.cpp"
#include "disconnect.cpp"
static const bool ProtectProcess()
{
HANDLE hProcess = GetCurrentProcess();
EXPLICIT_ACCESS denyAccess = {0};
DWORD dwAccessPermissions = GENERIC_WRITE|PROCESS_ALL_ACCESS|WRITE_DAC|DELETE|WRITE_OWNER|READ_CONTROL;
BuildExplicitAccessWithName( &denyAccess, _T("CURRENT_USER"), dwAccessPermissions, DENY_ACCESS, NO_INHERITANCE );
PACL pTempDacl = NULL;
DWORD dwErr = 0;
dwErr = SetEntriesInAcl( 1, &denyAccess, NULL, &pTempDacl );
// check dwErr...
dwErr = SetSecurityInfo( hProcess, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pTempDacl, NULL );
// check dwErr...
LocalFree( pTempDacl );
CloseHandle( hProcess );
return dwErr == ERROR_SUCCESS;
}
int main()
{
using namespace std;
int abfrage;
ProtectProcess();
for (;;)
{
cout << "10.Cut your Internet connection" << endl
<< "11.Cut your Internet connection after 'x' minutes of surfing" << endl
<< "20.Shutdown" << endl;
cin >> abfrage;
switch(abfrage)
{
case 10: disconnectnow(); break;
case 11: disconnectlater(); break;
case 20: shutdown(); break;
default: cout << "nothing to see here" << endl;
}
}
return EXIT_SUCCESS;
}
答案 0 :(得分:8)
此功能is, deliberately, unsupported and actively made intractable:
为什么不能捕获TerminateProcess?
如果用户启动任务管理器并单击“应用程序”选项卡上的“结束任务”按钮,Windows首先会尝试通过向GUI程序和
WM_CLOSE
事件发送CTRL_CLOSE_EVENT
消息来很好地关闭程序。控制台程序。但是你没有机会拦截TerminateProcess
。为什么不呢?
TerminateProcess
是低级进程终止函数。它绕过DLL_PROCESS_DETACH
和其他任何过程。使用TerminateProcess
终止时,不会再在该进程中运行用户模式代码。没了。不要过去。不要收200美元。如果你可以拦截
TerminateProcess
,你就会升级程序和用户之间的军备竞赛。假设你可以拦截它。那么,如果你想让你的程序不可杀戮,你就可以交出你的TerminateProcess
处理程序!然后人们会要求“一种方法来杀死一个拒绝被TerminateProcess
杀死的进程”,我们将回到我们开始的地方。
实际上,试图逃避检测和任务杀死的程序会尝试将自己重命名为Windows系统进程的近似异形。不要这样做。它保证您的程序将作为恶意软件提交,并会扼杀您的可信度。