【发布时间】: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