代码之家  ›  专栏  ›  技术社区  ›  Dr Deo

如何停止应用程序执行

  •  0
  • Dr Deo  · 技术社区  · 15 年前

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

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

    4 回复  |  直到 15 年前
        1
  •  3
  •   Bob Moore    15 年前

    假设您希望停止从可移动驱动器启动任何进程,这似乎是shell挂钩的应用程序。在过去的半小时里,我编写了以下代码,它看起来测试正常。记住,编写一个钩子是一个非常重要的过程,全局钩子需要编写一个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钥匙启动的任何应用程序。

    请注意,此解决方案适用于所有GUI进程(即非控制台进程),但要求它们响应顶级窗口上关闭的wm_。更具攻击性的通用解决方案可能需要您将Hwnd解析为hProcess并调用TerminateProcess:我提供的解决方案是“kinder”(链接的DLL将被卸载等),但不太通用。

    如果你想知道写一个系统范围的钩子的基本知识,你可以在我的网站上找到它们。 here . 请注意,上面的代码不是生产质量代码,我把它破解成了一个旧的ansi dll,我一直在使用它,因此缺少对unicode的支持,或者任何接近良好调试能力的东西。但它显示了基本的想法。

        2
  •  1
  •   ChadNC    15 年前

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

        3
  •  0
  •   Arsen Mkrtchyan    15 年前

    如果当前磁盘类型是可移动设备,则可以编写从主方法返回的代码段。
    呼叫 GetCurrentDirectory 拆分磁盘名并使用 WMI ( this 或者更好。 GetDriveType ( this 这里有帮助)方法知道它是否在可移动磁盘上

        4
  •  0
  •   Elemental    15 年前

    在我看来,你正在寻找一种通用的方法来阻止任何应用程序从已经运行的应用程序中从设备上启动。 所以基本上有三个问题: 1.已开始检测新应用程序 2。检查正在运行的设备类型 三。如果你不想要的话,就迫使应用程序死掉

    第1部分:这是一个困难的一方,我认为你需要使用不是很好的EnumProcess定期进行投票,或者检查生成wm_activateapp的应用程序。

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

    第3部分:TerminateProcess应该为您这样做

    推荐文章