2010-06-25 1 views
8

Как защитить свое приложение C# от кого-то, убивающего его процесс через taskman или программно?Предотвращение приложения C# из процесса kill

Вот мой сценарий:

App А представляет собой приложение MFC, разработанный другой командой. Он имеет неопубликованный текстовый удаленный интерфейс, который включен через бэкдор.

Я разрабатываю приложение B, приложение C# WinForms, которое взаимодействует с A. B, обеспечивает бэкдор A, когда ему нужен удаленный доступ, закрывает его по завершении (или при сбое).

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

B использует localhost для взаимодействия с A, поэтому меня не беспокоит сценарий отключения питания.

Я ищу решение, которое не включает в себя изменение A.

Я не ожидал, чтобы быть в состоянии остановить Темную Tangent (хотя это будет бонус), но прямо сейчас деточка сценария может иметь свой путь с этим проектом :)

Эти приложения работают на Windows XP, но и в ближайшее время поддержка Vista, 7. &

заранее спасибо, Jim

+1

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

+3

Также интересна тактика, используемая антивирусными/вредоносными сканерами, поскольку вредоносное ПО пытается отключить резидентное программное обеспечение для обнаружения. Это означает, что существуют веские причины для этого, хотя варианты использования (IMO) довольно узко определены. – Joe

+1

Похоже, вы больше заинтересованы в том, как убедиться, что вы убираете, прежде чем уйти. Если вы можете уточнить, вы можете получить ответы на некоторые вопросы, которые помогут вам решить вашу * настоящую проблему. –

ответ

4

Вы не можете - до тех пор, пока пользователь имеет право называть TerminateProcess в вашей программе, вы не можете предотвратить завершение процесса End Process в диспетчере задач. Raymond Chen опубликовал на этом некоторое время назад: http://blogs.msdn.com/b/oldnewthing/archive/2004/02/16/73780.aspx

+0

Тогда вы никогда не видели вирус, который останавливает пользователя от открытия диспетчера задач, панели управления или MSCONFIG?Мой друг поймал это, нажав на «У вас есть вирус!». баннер. Болезненные. –

+0

@Phil - даже я бы не пошел на это зло :) Во всяком случае, можно было написать приложение, которое будет выполнять TerminateProcess программно, поэтому защита от завершения на основе графического интерфейса недостаточно. –

+2

В конце концов, обсуждение в приведенной вами ссылке убедило меня в моей глупости. Я собираюсь вернуться к команде A. –

4

Вы действительно, на самом деле, действительно не хотят этого делать. Это очень сильно раздражает пользователей! Однако, если он должен быть сервисом, запустите его как учетную запись службы и не предоставляйте пользователям права администратора.

+0

См. Отредактированный пост. –

+0

Это приложение WinForms. –

2

Короткий ответ: вы не можете и не должны.

Длинный ответ: вы можете попробовать запустить второй «вспомогательный» процесс, который проверяет каждые x секунд, если ваше приложение все еще работает. Если это не так, он перезапускает его.

Если вы хотите, чтобы процесс работал в течение длительного времени, просто не доверяйте пользователям, чтобы он работал, рассмотрите службы Windows. Они предназначены для этого.

0

Насколько я знаю, вы не можете, и даже если бы вы действительно этого не сделали. представьте, насколько это было бы неприятно, если бы вы не могли заставить убить приложение.

Если важно, чтобы ваше приложение продолжало работать, вы всегда можете создать службу Windows, которая «проверяет» приложение для обеспечения его работы (вы можете использовать именованные каналы, сокеты, файлы pid ... независимо). если служба обнаруживает, что процесс умер, тогда он может просто перезапустить его. это, вероятно, ваш лучший выбор.

5

Я готов закрыть приложение, когда они пытаются, но сначала нужно сделать что-то.

Необходимые шаги при выключениях программы приводят к легкому прорыву программ. Даже если вы можете помешать кому-то убить вашу программу через диспетчер задач, вы не можете остановить их от выключения компьютера или даже вытащить кабель из стены. Любая задача, которая так жизненно важна для завершения, будет потеряна. А что, если есть власть? Снова ваша задача не будет завершена, и ваш жизненный код очистки не будет запущен.

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

Наконец, вы можете добавить в свою программу диалоговое окно, которое при попытке закрыть его предупреждает, что программа должна быть отключена должным образом. Если вы быстро закроете ваш компьютер, пользователи не захотят его убить и позволят ему закончить правильно. Если ваше завершение занимает много времени, люди будут пытаться его убить. Если вы хорошо относитесь к своим пользователям, они тоже будут вам нравятся.

Если вы прекратите работу, это означает, что пользователь потеряет некоторые незавершенные работы, а затем предупредит их об этом и даст им возможность дождаться завершения задачи, но если они действительно захотят выйти из вашей программы, то пусть они уйдут.

+0

Вы делаете широкое предположение для тех, кто так сильно развивается ... В частности, вы предполагаете, ПОЧЕМУ он хочет что-либо запускать при убийстве приложения. Есть причины, чтобы убедиться, что вы запустили работу, кроме того, что там были грязные записи/все еще открытые транзакции. В основном закрытие любых дочерних процессов или других ресурсов. –

+0

У меня была эта проблема. У меня был процесс, который использовал семафоры для общения с другими экземплярами. Если вы прекратили это неправильно, это оставит неизвестное количество отсчетов, оставшихся на семафоре, испортив все остальные экземпляры. – Gabe

+0

@ Jim Leonardo: Еще один способ подойти к проблеме, о которой вы говорите, - это обеспечить, чтобы дочерние процессы запрограммировались более надежно, чтобы правильно обрабатывать условие внезапной прерывания родительской программы. Повышенная прочность в распределенном приложении увеличивается, если каждый компонент способен функционировать разумно независимо от других. –

2

Я думаю, что все пропустили точку. Если я правильно прочитал (после вашего редактирования), вы хотите узнать, когда вас «убили», чтобы вы могли изящно закрыть его?

Пункт «убийство» заключается в том, что вы «не можете» его остановить. Конечно, обходные пути, например, использование второго приложения для оживления убитого приложения, но это не имеет никакого отношения к простому изложению изящно.

Лучшим подходом является либо запуск службы (чтобы вы не могли быть убиты, просто попросили закрыть), либо реструктурировать работу вашего приложения, чтобы не было необходимости «убирать», прежде чем он уйдет. Когда приложение закрывается, большинство ресурсов, которые оно хранит, автоматически очищается, так что это только ваши собственные данные, которые вы должны закрыть. Подходы, которые вы можете попробовать, следующие:

  • Часто фиксируйте свое состояние на диск, чтобы не потерять много (или что-либо), если вы неожиданно уходите. (Не забудьте очистить все потоки ввода-вывода, чтобы убедиться, что они привязаны к диску)
  • Сохраните информацию на диске, которая позволяет вам обнаружить неожиданное завершение работы при следующей запуске вашей программы, чтобы она могла обнаруживать и исправлять любые проблемы возможно, были вызваны убийством.
  • Сообщите своим пользователям, чтобы они не были идиотами, и прекратите свое приложение. Тыкаешь их в глаза, если они игнорируют тебя. Обычно после не более двух раз они слушают :-)
+0

Служба может быть убита. – Rohit

+0

+1 для «выполнить восстановление при следующем запуске приложения», так как происходят неожиданные отключения (событие питания, сбой диска и т. Д.) –

+0

@rohit - Многие пользователи знают, как убивать задачи. Относительно немногие знают, как остановить службу, не говоря уже о «Kill * one». –

0

Когда приложение инициируется в первый раз, вы не можете выполнить третий ap/процесс, который работает в фоновом режиме, и пытается обратный вызов в приложение B каждый раз ofter, поэтому, когда приложение B закрыто. App C может видеть это и выполняет процедуру закрытия бэкдора App A.

Так что, когда приложение B успешно закрывается через предполагаемую кнопку Закрыть это отключит App C от проверки App B все еще работает отлично ...

Im действительно не самое лучшее с C# на данный момент, но глядя на вашем проблема, вероятно, одна из возможных попыток сделать это.

Также, если приложение B проверяет приложение C, а затем, если приложение C исчезло, приложение B закроет бэкдор, если это возможно.

Как говорят другие, это не может быть хорошей идеей.

+0

Интересно. К сожалению, «приложение B» фактически представляет собой класс приложений, каждый из которых манипулирует задней дверью. Хотя во время работы работает только один B, это затруднит то, как третье приложение/служба сможет контролировать существование B. –

+0

AS Я сказал, и я извиняюсь из-за отсутствия навыков в этой области, но мой комментарий основывался на том, что я думал, что это будет возможно, и как я пойду на решение такой ситуации. Создание и развертывание этого на моей стороне не имеет особого значения, я просто пытался дать вам практическое решение. ваш человек, чтобы понять, как это сделать. – RobertPitt

+0

Я понимаю, что. Не желая писать свой код, просто предоставляя вам больше информации о концепции B. –

1

Для того, чтобы предотвратить приложение от быть прекращено, вы запустите приложение, как другого пользователя (т.е. как службы, или в качестве другой учетной записи пользователя), и ограничить пользователям быть Стандартный пользователь.

Таким образом, злоумышленники не могут убить ваш процесс, поскольку только администраторы могут его убить, и это привилегия, по которой вы, по-видимому, никому не доверяете.

Имеет то преимущество, что он соответствует предполагаемому дизайну операционной системы.

1

@Jim

Если приложение А может получать модификации запросов

  1. Предпочтительно, я бы архитектуры, где зарегистрированы все приложения Б при открытии лазейки и необходимы для пинга App A с регистрацией с интервалом, так что приложение А может закрыть собственный бэкдор, если приложение Б не сообщит ему, что ему все еще нужен доступ. Это все еще не совсем безопасно, но приложение А не должно быть структурировано с таким интерфейсом без какого-либо саморегулирования для «надежных» средств связи.

  2. Или вы можете предложить App A изменить, чтобы проверить действительные процессы, и если ни один из них не найден, пока он открыт, он закрывается (это подделывается, поскольку оно обрабатывается именем).

В противном случае, похоже, что приложение B должно закрывать бэкдор как можно чаще, когда ему не нужен немедленный доступ.

Требование к приложению B обеспечить безопасность доступа к приложению A действительно плохой модели.

+0

B закрывает бэкдор, когда задача завершена. Я согласен, что A не оптимально спроектирован. –

Смежные вопросы