Как остановить приложение от выполнения - PullRequest
0 голосов
/ 10 ноября 2009

Я работаю над проектом по предотвращению запуска приложений со съемных устройств. Кто-нибудь знает, как я могу это сделать? Желательно в C ++ на платформе Windows.

Моя цель - предотвратить выполнение exe-файла, даже если пользователь дважды щелкнет по нему или даже попытается запустить его из командной строки.

Ответы [ 4 ]

3 голосов
/ 10 ноября 2009

Предполагая, что вы хотите остановить ЛЮБОЙ запуск процесса со съемного диска, похоже, это приложение для перехвата оболочки. За последние полчаса я написал следующий код, и похоже, что все в порядке. Имейте в виду, что написание ловушки - нетривиальный процесс, а глобальная ловушка требует написания 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-ключа.

Обратите внимание, что это решение работает для всех процессов с графическим интерфейсом (т.е. не консольных), но требует, чтобы они отвечали на WM_CLOSE в окне верхнего уровня. Более агрессивное общее решение, вероятно, потребует от вас преобразования hwnd в hprocess и вызова TerminateProcess: решение, которое я предоставил, является «более добрым» (связанные DLL будут выгружены и т. Д.), Но менее общим.

Если вы хотите знать основы написания общесистемного хука, вы можете найти их на моем сайте здесь . Обратите внимание, что вышеприведенный код не относится к качеству производственного кода, я взломал его на старую библиотеку ANSI, которую я использовал, отсюда и отсутствие поддержки Unicode или чего-то похожего на приличную возможность отладки. Это показывает основную идею, хотя.

1 голос
/ 10 ноября 2009

Ваш сетевой администратор может позаботиться об этом без необходимости писать какой-либо код. Мы реализовали именно то же самое здесь, чтобы предотвратить возможность копирования сотрудниками частной информации клиентов на съемные устройства, а администратор сети внедрил ее сам, и нам, в отделе разработки, ничего не нужно было делать. Я не знаю, сработает ли это в вашей ситуации, но стоит подумать.

0 голосов
/ 10 ноября 2009

Мне кажется, вы ищете общий способ остановить запуск любого приложения с устройства из уже запущенного приложения. Итак, по сути три вопроса: 1. Обнаружение нового приложения началось 2. Проверка, на каком устройстве оно работает 3. Заставить приложение умереть, если оно вам не нужно

Часть 1: Это сложная вечеринка, я думаю, вам нужно либо регулярно опрашивать с помощью EnumProcess, который не очень хорош, либо просто проверять приложения, генерирующие WM_ACTIVATEAPP

Часть 2: Решение ArsenMkrt кажется подходящим для этого

Часть 3: TerminateProcess должен сделать это за вас

0 голосов
/ 10 ноября 2009

Вы можете написать фрагмент, который возвращается из метода Main, если текущий тип диска - съемное устройство.
Позвоните GetCurrentDirectory разделите имя диска и используйте WMI ( это может помочь) или даже лучше GetDriveType ( это может помогите тут) способ узнать это на съемном диске или нет

...