Почему Gplmpgdec (GPL MPEG-1/2 DirectShow Decoder Filter) переопределяет / обходит IsDebuggerPresent?

В Mpeg2DecFilter.cpp присутствует следующий код:

#include "detours.h"

DETOUR_TRAMPOLINE(BOOL WINAPI Real_IsDebuggerPresent(), IsDebuggerPresent);
BOOL WINAPI Mine_IsDebuggerPresent()
{
    TRACE(_T("Oops, somebody was trying to be naughty! (called IsDebuggerPresent)\n")); 
    return FALSE;
}
...snip...
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    if (!fDetourInited)
    {
        DetourFunctionWithTrampoline((PBYTE)Real_IsDebuggerPresent, (PBYTE)Mine_IsDebuggerPresent);
        ...snip...
        fDetourInited = true;
    }

    return DllEntryPoint((HINSTANCE)hModule, ul_reason_for_call, 0); // "DllMain" of the dshow baseclasses;
}

Я не могу понять, почему Gplmpgdec переопределяет IsDebuggerPresent, чтобы всегда возвращать FALSE. Какая возможная польза от этого?

Дело в том, что для меня это вызывает проблемы из-за того, что сообщения отладчика не отображаются и (иногда) происходит сбой приложения, если сообщение трассировки записывается при выгрузке Gplmpgdec DLL.

Чтобы решить, как решить эту проблему, я думаю, мне действительно нужно знать, почему Gplmpgdec это делает. Также приветствуются любые предложения относительно решения. Я бы предпочел не поддерживать свою собственную библиотеку Gplmpgdec; я бы предпочел избежать такой головной боли любой ценой. Есть ли способ отключить объезд?

Связанный: blogs.msdn.microsoft.com/oldnewthing/20180604-00/?p=98905

Anders 05.06.2018 00:43

Это стандартный способ предотвращения реверс-инжиниринга кода, к которому прилагаются драконовские условия лицензии. Для кодеков MPEG нет ничего необычного в том, что они должны платить лицензионный сбор в патентный пул MPEG-LA. Видеть, как такой код перемещается в домен с открытым исходным кодом, потому что никто не хотел с этим мириться, тоже стандартно. У Detours есть такие же условия, кстати, бесплатно для личного использования, но для коммерческого использования требуется уплата роялти.

Hans Passant 05.06.2018 01:03

Это открывает еще одну банку с червями. Меня беспокоит не недавно истекший срок действия патентов MPEG, а часть программного обеспечения, претендующая на лицензию GPL, статически связанная с Detours ... Каковы последствия использования библиотеки DLL или исходного кода? Должен ли я сообщить SourceForge? Будут ли они действовать?

Gplmpgdec Question 05.06.2018 01:27

Да, и для ясности, вы говорите, что этот код унаследован от того, что было до того, как он стал GPL? Если да, то как переопределение IsDebuggerPresent предотвращает обратное проектирование? Разве обратный инженер не мог бы просто использовать свой отладчик, чтобы перехватить вызов и сделать вид, что он вернул все, что ему заблагорассудится?

Gplmpgdec Question 05.06.2018 01:30

Ханс Пассан, очевидно, Detours больше не требует каких-либо условий: Microsoft опубликовала его по лицензии MIT. github.com/Microsoft/Detours/blob/master/LICENSE.md В качестве альтернативы, я рассматриваю возможность перехода на LAVFilters, поскольку он, похоже, ничего не зацепляет и, следовательно, не создает практических проблем, с которыми я столкнулся. Однако у меня еще не было времени проверить это.

Gplmpgdec Question 06.06.2018 18:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
76
2

Ответы 2

Некоторые фильтры DirectShow на самом деле не работают (специально) при наличии отладчика.

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

Media Player Classic / MPC-HC использует тот же тип кода, и он имеет больше смысла в .exe, чем в библиотеке декодера.

Учитывая, что Gplmpgdec сам по себе является декодером, я не могу себе представить это объяснение. Если автор пытался повлиять на поведение фильтров Другие DirectShow, почему он не добавил к этому эффекту комментарий?

Gplmpgdec Question 05.06.2018 01:33

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

Gplmpgdec Question 05.06.2018 01:34

Я также был удивлен, увидев этот код в проекте с открытым исходным кодом.

Думаю, это просто шутка разработчика. Если вы посмотрите сообщение

Oops, somebody was trying to be naughty!

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

Я также помню, что во время создания этого кодека некоторые видеокодеки препятствовали отладке приложения DirectShow (с использованием графа фильтров). Может, этот разработчик из одной из этих компаний ...

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

Другие вопросы по теме