#.net #debugging #in-memory #cracking
#.net #отладка #в памяти #взлом
Вопрос:
Есть ли какой-либо способ определить, что отладчик запущен в памяти?
и здесь появляется псевдокод загрузки формы.
if debugger.IsRunning then
Application.exit
end if
Редактировать: первоначальное название было «Обнаружение отладчика в памяти»
Комментарии:
1. Большинство отладчиков могут быть подключены к процессу во время выполнения. В этом случае проверка наличия debugger в statrup не сильно поможет.
Ответ №1:
Попробуйте следующее
if ( System.Diagnostics.Debugger.IsAttached ) {
...
}
Ответ №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, но которую нельзя включить в приложение, созданное в режиме выпуска