Как отладить сбой в процессе, содержащем антиотладочные меры

У меня произошел сбой в нашем приложении, который я не могу отладить, так как один из наших партнеров счел нужным использовать действительно ужасный 'CodeMeter' для шифрования своей DLL. Лицензирование CodeMeter предотвращает все попытки отладки приложения, содержащего зашифрованную библиотеку DLL CodeMeter, и, похоже, даже приводит к сбою MiniDumpWriteDump, вызванного из фильтра необработанных исключений (этот метод работает без загрузки этой библиотеки DLL). Сбой происходит только тогда, когда зашифрованная DLL загружается в процесс.

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

Любые предложения - возможно, какой-нибудь ручной код стека и модуля, который я мог бы вызвать из моего необработанного фильтра исключений?

Есть ли в CodeMeter настройки сборки, которые позволят нашему партнеру производить сборку, которая по-прежнему зашифрована и лицензирована, но не так агрессивно саботирует отладку?

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


person persiflage    schedule 02.04.2012    source источник
comment
Похоже, CodeMeter также отключает другие функции DbgHelp.dll. SymInitialize также не работает при наличии этой DLL, зашифрованной CodeMeter. Это заставляет меня задаться вопросом, какие еще части основной операционной системы эта ядовитая программа CodeMeter тайно выбрала для саботажа...   -  person persiflage    schedule 02.04.2012
comment
Я нашел пример кода для обхода стека с помощью CaptureStackBacktrace. Это показывает только стек вызовов фильтра исключений, а не само исключение.   -  person persiflage    schedule 02.04.2012
comment
Теперь удалось перехватить и зарегистрировать сведения об исключении из зашифрованной DLL, используя __try __except. По-прежнему не удается получить действительную трассировку стека из фильтра исключений SEH, используя CaptureStackBacktrace.   -  person persiflage    schedule 05.04.2012


Ответы (1)


Я использовал хорошо работающий код обхода стека, который можно вызывать из SEH или необрабатывать. фильтр исключений путем передачи записи CONTEXT, переданной фильтру исключений.

Адреса в стеке и потенциальные адреса в первых нескольких параметрах исключений можно интерпретировать с помощью SymFromAddr в DbgHelp, включая дескриптор модуля. Добавьте к этому журнал имен файлов модулей и дескрипторов модулей для интерпретации того, к каким библиотекам DLL относятся адреса стека.

Этот конкретный сбой был исключением Visual C++. Тип исключения выявляется путем поиска адреса одного из параметров исключения с помощью SymFromAddr.

В блоге Рэймонда Чена есть код для поиска типа визуального элемента. Исключение C++ из параметров исключения, но по какой-то причине я не смог заставить это работать для меня (вероятно, моя собственная ошибка).

person persiflage    schedule 11.04.2012