Ваше рассуждение о GetLastError()
(его не следует использовать, поскольку последняя ошибка может быть перезаписана платформой .NET Framework из-за любой другой внутренней/невидимой/фоновой операции) также относится к SetLastError()
. Просто вы не можете надежно вызвать его и ожидать, что его значение сохранится без изменений, пока вы не вызовете Marshal.GetLastWin32Error()
.
Мы можем обсудить, как обойти эту проблему, однако...
... этот метод имеет (каким-то) смысл для собственного кода, потому что OutputDebugString()
широко используется, а дизассемблировать скомпилированный код сложнее (тогда вы защитите себя с помощью некоторого запутанного кода). Однако управляемый код легко декомпилировать и по-прежнему легко читать и понимать, такая простая запутанность не поможет, и вам следует просто использовать свойство System.Diagnostics.Debugger.IsAttached
.
Если вы действительно хотите обнаружить отладчик (даже если очень легко увидеть, что вы делаете, это не обеспечит достаточной защиты), вам придется все усложнить, потому что вы можете захотеть защититься от отладчика. управляемый отладчик или собственный отладчик. Да они разные.
Если управляемый отладчик не построен поверх собственного, то при вызове собственного IsDebuggerPresent()
вы всегда получите FALSE
для управляемого отладчика, где Debugger.IsAttached
вернет true
. Также возможен и противоположный сценарий: с подключенным родным отладчиком вы получите TRUE
из IsDebuggerPresent()
, но false
из Debugger.IsAttached
. В большом мире вы встретите все три типа отладчика. Чтобы лучше обсудить IsDebuggerPresent()
, вы можете прочитать Антиотладка.
Вы можете проверить оба, но вы все еще далеки от обнаружения отладчиков, потому что они проверяют только локальные управляемые/собственные отладчики, но у вас нет информации об удаленных отладчиках (если вы также не вызываете CheckRemoteDebuggerPresent()
) или отладчиках, которые не живут в user- режиме (если вы также не играете с NtQuerySystemInformation
). Есть несколько более надежных методов, но вы не можете использовать их в управляемом мире (см. также Обнаружение системного отладчика).
Одним из возможных решений является отладка вашего собственного процесса с помощью DebugActiveProcess()
, если вы терпите неудачу (и это не ошибка разрешения), тогда подключается другой отладчик, более того, пока вы не останетесь подключенным, другой отладчик не сможет подключиться. Обратите внимание, что процесс не может отлаживать себя (AFAIK), тогда это должно быть выполнено из дочернего процесса (который каким-то образом взаимодействует с основным процессом, который вы хотите защитить). В этом нет ничего нового, в основном тот же метод, описанный в Как определить, запущен ли текущий процесс GDB?, но специфичен для Windows .
См. также Отладчики не должны изменять поведение и управляемый и . Встроенные API отладки для получения дополнительной информации по этой теме.
person
Adriano Repetti
schedule
04.12.2015