Препятствуйте приложению C# процесс, уничтожают

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

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

Приложение A является приложением MFC, разработанным другой командой. Это имеет неопубликованный основанный на тексте удаленный интерфейс, который включен с помощью бэкдора.

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

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

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

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

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

Эти приложения работают на Windows XP, но также скоро поддержат Vista и 7.

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

8
задан Jim C 28 June 2010 в 15:31
поделиться

9 ответов

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

4
ответ дан 5 December 2019 в 08:22
поделиться

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

4
ответ дан 5 December 2019 в 08:22
поделиться

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

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

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

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

Краткий ответ: нельзя и не следует.

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

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

2
ответ дан 5 December 2019 в 08:22
поделиться

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

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

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

1
ответ дан 5 December 2019 в 08:22
поделиться

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

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

0
ответ дан 5 December 2019 в 08:22
поделиться

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

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

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

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

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

0
ответ дан 5 December 2019 в 08:22
поделиться

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

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

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

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

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

6
ответ дан 5 December 2019 в 08:22
поделиться

@Jim

Если приложение A может получать запросы на изменение

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

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

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

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

1
ответ дан 5 December 2019 в 08:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: