Изменение потока программы при запуске под управлением отладчика

#.net #debugging #in-memory #cracking

#.net #отладка #в памяти #взлом

Вопрос:

Есть ли какой-либо способ определить, что отладчик запущен в памяти?

и здесь появляется псевдокод загрузки формы.

 if debugger.IsRunning then
Application.exit
end if
  

Редактировать: первоначальное название было «Обнаружение отладчика в памяти»

Комментарии:

1. Большинство отладчиков могут быть подключены к процессу во время выполнения. В этом случае проверка наличия debugger в statrup не сильно поможет.

Ответ №1:

Попробуйте следующее

 if ( System.Diagnostics.Debugger.IsAttached ) {
  ...
}
  

Ответ №2:

Прежде чем использовать это для закрытия приложения, запущенного в отладчике, следует иметь в виду две вещи:

  1. Я использовал отладчик для извлечения трассировки сбоев из рекламного ролика .СЕТЕВОЕ приложение и отправьте его в компанию, где впоследствии это было исправлено, с благодарностью за упрощение и
  2. Эту проверку можно тривиально обойти.

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

 private object _calculatedProperty;

public object SomeCalculatedProperty
{
    get
    {
        if (_calculatedProperty == null)
        {
            object property = /*calculate property*/;
            if (System.Diagnostics.Debugger.IsAttached)
                return property;

            _calculatedProperty = property;
        }

        return _calculatedProperty;
    }
}
  

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

 private object _calculatedProperty;

public object SomeCalculatedProperty
{
    get
    {
        bool debuggerAttached = System.Diagnostics.Debugger.IsAttached;

        if (_calculatedProperty == null || debuggerAttached)
        {
            object property = /*calculate property*/;
            if (debuggerAttached)
                return property;

            _calculatedProperty = property;
        }

        return _calculatedProperty;
    }
}
  

Комментарии:

1. Это классная идея — но она изменяет поток вашей программы при запуске под управлением отладчика, поэтому вы больше не отлаживаете код, который используете в release. ИМХО, в большинстве случаев было бы лучше предоставить некэшированный вариант свойства (внутри #if DEBUG, чтобы оно не было встроено в релизы), который вы можете использовать в отладчике для проверки значения, оставив «реальное» свойство, работающее одинаково в сборках debug и release.

2. @Jason: и да, и нет. В этом случае все методы, вызываемые для оценки свойства, являются чистыми (без побочных эффектов независимо от того, когда они были вызваны), поэтому я фактически гарантировал, что это применимо и к свойствам с точки зрения приложения.

3. Как вы думаете, этот подход допустим, если вы хотите создать библиотеку, которая работает только в режиме отладки из visual Studio? Я хочу создать библиотеку, которую можно бесплатно тестировать в visual Studio, но которую нельзя включить в приложение, созданное в режиме выпуска