我正在开发一个小程序来提高工作效率。它应该在预设的分钟数后断开用户与互联网的连接或关闭您的计算机。不应使用任务管理器关闭该程序。我可以编译该程序并运行它,但我可以使用任务管理器关闭它。我的灵感来自于这一页:
#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;
}
这个功能是故意不支持并积极使其变得棘手:
为什么不能捕获 TerminateProcess?
如果用户启动任务管理器并单击“应用程序”选项卡上的“结束任务”按钮,Windows 首先会尝试正常关闭您的程序,方法是发送WM_CLOSE
给 GUI 程序的消息和CTRL_CLOSE_EVENT
控制台程序的事件。但你没有机会拦截TerminateProcess
。为什么不?
TerminateProcess
是低级进程终止函数。它绕过了DLL_PROCESS_DETACH
以及过程中的其他任何事情。当你用TerminateProcess
,该进程中将不再运行用户模式代码。它消失了。不过去就走。不要收取 200 美元。
如果你能拦截TerminateProcess
,您将加剧程序和用户之间的军备竞赛。假设你可以拦截它。好吧,那么如果你想让你的程序无法被杀死,你只需交出你的TerminateProcess
处理程序!然后人们会要求“一种方法来杀死一个拒绝被杀死的进程TerminateProcess
,”然后我们就会回到开始的地方。
实际上,试图逃避检测和任务终止的程序会尝试将自己重命名为接近 Windows 系统进程的同种型。不要这样做。它保证您的程序将作为恶意软件提交,并会破坏您的信誉。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)