我正在开发一个导出单个函数的C ++ windows DLL模块
__declspec(dllexport) void Run()
我想实现某种对我的功能的访问权限。我希望防止未经授权的模块激活我的DLL proc。
我不需要强大的/防弹机制。我只喜欢"捍卫"这个来自其他模块的proc在我自己的app下运行。
获取呼叫模块名称,并根据名称决定是否授予访问权限。
答案 0 :(得分:4)
如果是这样,我如何获得调用模块的名称?
所以代码可以像这样
HMODULE hmod;
if (RtlPcToFileHeader(_ReturnAddress(), (void**)&hmod))
{
WCHAR sz[MAX_PATH];
if (GetModuleFileName(hmod, sz, MAX_PATH))
{
DbgPrint("%p %S\n", hmod, sz);
}
}
关于 - 这是在 XP 中工作吗?是的,但有一个注意事项。 _ReturnAddress 是 CL 内在的 - 所以不依赖于os版本(比如说gcc存在 __ builtin_return_address(0))GetModuleFileName也很老api功能并存在于win2000,xp,无处不在。关于RtlPcToFileHeader
- 它从 xp 到最新版本的所有Windows版本中的 ntdll.dll 中导出(并实现)。也从 win2003开始它也从 kernel32.dll 导出,但是在这里实现 - 只需跳转到 ntdll.RtlPcToFileHeader - 所以,如果想在xp上也使用它 - 与 ntdll.lib 链接并将它放在libs顺序中的 kernel32.lib 之前,或者可以通过GetProcAddress(GetModuleHandle(L"ntdll"), "RtlPcToFileHeader");
将它运行到运行时
或者即使有人担心 RtlPcToFileHeader 将从 ntdll 中删除(这当然是否定的)可以使用此功能
GetProcAddress(GetModuleHandle(g_xp ? L"ntdll" : L"kernel32"), "RtlPcToFileHeader");