哪个模块叫我的DLL导出功能?

时间:2017-04-02 06:42:27

标签: c++ windows dll c++14 dllexport

背景

我正在开发一个导出单个函数的C ++ windows DLL模块

__declspec(dllexport) void Run()

动机

我想实现某种对我的功能的访问权限。我希望防止未经授权的模块激活我的DLL proc。

我不需要强大的/防弹机制。我只喜欢"捍卫"这个来自其他模块的proc在我自己的app下运行。

方法

获取呼叫模块名称,并根据名称决定是否授予访问权限。

问题

  1. 这种方法是否足够?
  2. 如果是这样,我如何获取调用模块的名称?

1 个答案:

答案 0 :(得分:4)

  

如果是这样,我如何获得调用模块的名称?

  1. 通过电话_ReturnAddress
  2. 获取返回地址
  3. 获取包含此返回地址的图像的基址 - RtlPcToFileHeader
  4. 最后拨打GetModuleFileName功能
  5. 所以代码可以像这样

    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");