c++ - 如何停止应用程序执行

标签 c++ windows security removable-storage

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

我的目标是防止执行 exe 文件,即使用户双击它或者即使他试图从命令行启动它也是如此。

最佳答案

假设您希望停止从可移动驱动器启动的任何进程,这似乎是一个 shell Hook 的应用程序。半小时写了下面的代码,测试好像OK。请记住,编写 Hook 是一个非常重要的过程,全局 Hook 需要编写 DLL。这是钩子(Hook) 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 key 启动的任何应用程序。

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

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

关于c++ - 如何停止应用程序执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1707062/

相关文章:

windows - 通缉 : WinAPI calls logger

c# - 在 C# 中修剪部分文本文件的代码

c# - 傻瓜式 SSL

C++17:使用通用可变参数 lambda 包装可调用对象

c++ - 如何通过对象引用传递函数的参数(C++)

c++ - 如何创建可以接受不同参数的函数指针 vector ?

c++ - 如何用原子性保证数据依赖?

windows - 如何定位多个Windows版本

unicode - Unicode镜像字符?

javascript - 如何防止 html 元素转义父元素? (安全)