【问题标题】:How to stop application from executing如何阻止应用程序执行
【发布时间】:2025-11-25 22:00:01
【问题描述】:

我正在开展一个项目,以防止从可移动设备启动应用程序。 有谁知道我该怎么做?最好在 Windows 平台上使用 C++。

我的目标是阻止执行 exe 文件,即使用户双击它或尝试从命令行启动它。

【问题讨论】:

  • 您使用复数“应用程序”似乎表明您想要停止从可移动驱动器运行的任何应用程序。是这种情况,还是您试图阻止您的应用程序从可移动驱动器运行?我在下面的回答假设前者,而不是后者。
  • IOW,如果您的应用驻留在可移动存储上,您希望它拒绝运行吗?
  • 并不是我只是想阻止可能尝试从可移动设备启动的新可执行文件

标签: c++ windows security removable-storage


【解决方案1】:

假设您希望停止从可移动驱动器启动的任何进程,这似乎是一个外壳挂钩的应用程序。我在过去半小时内编写了以下代码,似乎测试正常。请记住,编写钩子是一个不平凡的过程,而全局钩子需要编写 DLL。这是钩子 DLL 的相关内容:

BOOL __declspec(dllexport) __stdcall InstallShellHook ()
{
   lpfnHookProc = (HOOKPROC) ShellFunc ;
   BOOL bRetVal = FALSE;

   if (hShellHook == NULL)
   {
      hShellHook = SetWindowsHookEx (WH_SHELL, 
                                     lpfnHookProc, 
                                     hInstance, 
                                     NULL);
      return TRUE;
   }
   return FALSE;
}

LRESULT CALLBACK ShellFunc(int nCode, WPARAM wParam, LPARAM lParam)
{
   HWND hWndNew;
   char szBuff  [_MAX_PATH];
   char szDrive [_MAX_DRIVE];

   switch (nCode)
   {
      case HSHELL_WINDOWCREATED:
         hWndNew = (HWND)wParam;
         GetWindowModuleFileName (hWndNew, szBuff, _MAX_PATH);
         _splitpath (szBuff, szDrive, NULL, NULL, NULL);
         if (GetDriveType (szDrive) ==  DRIVE_REMOVABLE)
         {
            PostMessage (hWndNew, WM_CLOSE, 0, 0);
         }
         break;

      default:
         break;
   }
   return 0;
}

我已经测试了这段代码,它是从一个简单的对话框测试平台安装的,它允许我从我的硬盘驱动器启动任何窗口应用程序,但会立即关闭我从 USB 密钥启动的任何应用程序。

请注意,此解决方案适用于所有 GUI 进程(即非控制台),但要求它们在*窗口上响应 WM_CLOSE。更激进的通用解决方案可能需要您将 hwnd 解析为 hprocess 并调用 TerminateProcess:我提供的解决方案是“更友好”(链接的 DLL 将被卸载等),但不太通用。

如果您想了解编写系统范围挂钩的基础知识,可以在我的网站here 上找到它们。请注意,上面的代码不是生产质量的代码,我将它破解成一个旧的 ANSI dll,因此缺乏对 Unicode 的支持,或者任何接近体面的调试能力的东西。但它显示了基本思想。

【讨论】:

  • 即使在修改此代码以使用 TerminateProcess 之后,我也很确定(根据过去的经验)这不适用于控制台应用程序。这是因为控制台应用程序的处理方式与 csrss.exe(某种“控制台服务器”)的窗口应用程序不同,后者也处理它们的消息循环。我无法从您的回答中完全理解这种解决方案是否适合这种情况。
  • 控制台应用程序不是 GUI 进程,所以不,我发布的代码不适合控制台应用程序。我对 TerminateProcess 的评论涉及忽略 WM_CLOSE 的应用程序,而不是控制台应用程序。我认为 OP 需要更清楚地了解确切的要求:获得适用于所有情况的东西是非常棘手的。可能这段代码就够了,但具体意图只有他自己能说清楚。
【解决方案2】:

您的网络管理员无需编写任何代码即可解决此问题。我们在这里实现了完全相同的东西,以防止员工将客户私人信息复制到可移动设备的可能性,并且网络管理员自己实现了它,而我们在开发部门不需要做任何事情。我不知道这是否适用于您的情况,但值得考虑。

【讨论】:

  • 尝试:开始->运行->“secpo.msc”->安全设置->软件限制策略->附加规则,右键->新建路径规则。应该可以编写一个应用程序来设置它。
【解决方案3】:

如果当前磁盘类型是可移动设备,您可以编写从 Main 方法返回的 sn-p。
调用GetCurrentDirectory拆分磁盘名称并使用WMIthis可以帮助)甚至更好的GetDriveTypethis可以在这里提供帮助)方法来知道它是否在可移动磁盘上

【讨论】:

  • 一个简单的解决方案。您只需在启动时对其进行测试,如果它不是从硬盘驱动器中退出。
【解决方案4】:

在我看来,您正在寻找一种通用方法来阻止从设备上从已经运行的应用程序启动任何应用程序。 所以本质上是三个问题: 1.检测新应用已经启动 2.检查它正在运行的设备类型 3. 不想要的应用就强制死掉

第 1 部分:这是困难的一方,我认为您需要使用 EnumProcess 定期轮询,这不是很好,或者只是检查生成 WM_ACTIVATEAPP 的应用程序

第 2 部分:ArsenMkrt 的解决方案似乎适用于此

第 3 部分:TerminateProcess 应该为您完成

【讨论】:

    最近更新 更多