【问题标题】:Why does Gplmpgdec (GPL MPEG-1/2 DirectShow Decoder Filter) override / detour IsDebuggerPresent?为什么 Gplmpgdec(GPL MPEG-1/2 DirectShow 解码器过滤器)会覆盖/绕行 IsDebuggerPresent?
【发布时间】:2018-11-14 07:45:57
【问题描述】:

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 库;我宁愿不惜一切代价避免那种维护头痛。有没有办法禁用绕行?

【问题讨论】:

  • 这是一种标准的黑客攻击,可防止附带严苛许可条款的逆向工程代码。对于 mpeg 编解码器来说并不少见,他们必须向 MPEG-LA 专利池支付许可费。看到这样的代码因为没人愿意忍受而在开源域中移动也是标准的。顺便说一句,Detours 也有类似的附加条件,免费供个人使用,但需要支付商业使用费。
  • 这会打开另一个蠕虫罐。我并不担心最近过期的 MPEG 专利,而是一个声称获得 GPL 许可的软件静态链接到 Detours... 使用 DLL 或源代码有什么影响?我应该通知 SourceForge 吗?他们会采取行动吗?
  • 哦,要清楚一点,您是说这段代码是从它进入 GPL 之前继承的?如果是这样,重写 IsDebuggerPresent 如何防止逆向工程?难道逆向工程师不会只是使用他的调试器来拦截调用并假装它返回任何他喜欢的东西吗?
  • Hans Passant,显然 Detours 不再附加任何条件:微软在 MIT 许可下发布了它。 github.com/Microsoft/Detours/blob/master/LICENSE.md 或者,我正在考虑迁移到 LAVFilters,因为它似乎没有挂钩任何东西,因此不会构成我面临的实际问题。不过我还没有时间测试。

标签: c++ winapi dll mpeg detours


【解决方案1】:

当存在调试器时,某些 DirectShow 过滤器实际上(故意)不起作用。

我不确定这是否是 Gplmpgdec 的解决方法,或者它是否与其他挂钩函数有关; ChangeDisplaySettingsEx。您可以清楚地看到他们可能试图禁用的代码中对Macrovision 的引用。

Media Player Classic/MPC-HC 使用相同类型的代码,它在 .exe 中比在解码器库中更有意义。

【讨论】:

  • 考虑到 Gplmpgdec 本身就是一个解码器,我无法想象这就是解释。如果作者试图影响其他 DirectShow 过滤器的行为,他为什么不为此添加评论?
  • 我没有调查ChangeDisplaySettingsEx的弯路。同样,评论可能在那里有用。
【解决方案2】:

在一个开源项目中看到这段代码我也很惊讶。

我认为这只是开发人员的一个玩笑。如果你看消息

糟糕,有人想调皮!

对我来说这是第二学位,也许开发人员刚刚发现了 IsDebuggerPresent,并发现使用它很有趣...

我还记得在使用此编解码器时,一些视频编解码器阻止了 DirectShow 应用程序的调试(使用 filtergraph)。也许这个开发者来自这些公司之一......

要解决这个问题,你只需要注释这段代码,然后重新编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    相关资源
    最近更新 更多