Как остановить выполнение приложения

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

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


person Dr Deo    schedule 10.11.2009    source источник
comment
Ваше использование множественного числа приложений может указывать на то, что вы хотите остановить ЛЮБОЕ приложение, работающее со съемного диска. Так ли это, или вы пытаетесь предотвратить запуск ВАШЕГО приложения со съемного диска? Мой ответ ниже предполагает первое, а не второе.   -  person Bob Moore    schedule 10.11.2009
comment
IOW, вы хотите, чтобы ваше приложение отказывалось запускаться, если оно находится на съемном носителе?   -  person Tim Post♦    schedule 10.11.2009
comment
Не совсем, я просто хочу остановить новые исполняемые файлы, которые могут пытаться запускаться со съемных устройств.   -  person Dr Deo    schedule 10.11.2009


Ответы (4)


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

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

person Bob Moore    schedule 10.11.2009
comment
Даже после изменения этого кода для использования TerminateProcess я почти уверен (исходя из прошлого опыта), что это не сработает для консольных приложений. Это связано с тем, что консольные приложения обрабатываются csrss.exe (своего рода консольным сервером) иначе, чем оконные приложения, которые также обрабатывают их циклы сообщений. Я не мог полностью понять из вашего ответа, подходит ли это решение в данном случае. - person Idan K; 10.11.2009
comment
Консольное приложение не является процессом с графическим интерфейсом пользователя, поэтому опубликованный мной код не подходит для консольных приложений. Мой комментарий о TerminateProcess относится к приложениям, которые игнорируют WM_CLOSE, а не к консольным приложениям. Я думаю, что OP должен быть немного более ясным в отношении точных требований: получить что-то, что работает для всех случаев, довольно сложно. Может быть, этого кода достаточно, но только он может уточнить точное намерение. - person Bob Moore; 10.11.2009

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

person ChadNC    schedule 10.11.2009
comment
Попробуйте: Пуск- ›Выполнить-› secpo.msc- ›Параметры безопасности-› Политики ограниченного использования программ- ›Дополнительные правила, щелкните правой кнопкой мыши-› Правило нового пути. Должна быть возможность написать приложение для настройки. - person Skizz; 10.11.2009

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

person Arsen Mkrtchyan    schedule 10.11.2009
comment
Простое решение. Вы просто проверяете его при запуске и выходите, если это не с жесткого диска. - person Goz; 10.11.2009

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

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

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

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

person Elemental    schedule 10.11.2009