了解调用者来自哪些DLL

时间:2010-09-30 05:48:28

标签: c++ windows

目前,我有一个C ++ exe项目,动态加载N DLL。

这些DLL将执行调用exe内部函数的函数。

现在,在我的exe项目中,我希望知道调用者来自哪些DLL。

是否可以使用任何可用的Windows API执行此操作?

4 个答案:

答案 0 :(得分:4)

这取决于你的实际目标。如果您期望DLL可能是恶意的(也就是说,如果您希望他们尝试欺骗您),则无法执行此操作。但是,如果它只是用于调试或日志记录或类似的那些无关紧要的东西,你可以查看堆栈并获取ret指令将用于返回调用者的地址,枚举通过加载的DLL并测试哪个那些地址在里面。

要获取“返回地址”,可以使用Visual C ++中的_ReturnAddress内在函数,然后可以使用GetModuleHandleEx函数,传入GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS以获取句柄地址所在的DLL。

但我必须重申:你无法根据此测试的结果制定安全决策。恶意代码很容易伪造并“欺骗”您的程序,使其认为它是一个“可信”或“安全”的DLL。正如我所说的,如果它只是用于调试或记录或其他东西,那么就去吧。

此外,这显然只会告诉你立即调用者所在的DLL。如果你有5级或者什么......你就不能这样做。

答案 1 :(得分:0)

如果您对多个DLL进行了相同的回调,那么由他们来提供有关谁是谁的信息。大多数API回调都有一个可以传递给回调的参数。如果你的回调是这样的,你可以使用它来识别DLL。

考虑到调用堆栈无论如何都会回到你的exe上,这可能是不可能的。

编辑:看看你的帖子,这是一个假设的情况吗?

答案 2 :(得分:0)

this有帮助吗?检查参数'GetModuleBaseRoutine'

答案 3 :(得分:0)

如果您正在构建exe,并且您没有假设DLL是敌对的(请参阅Dean的答案),您可以通过为每个DLL提供一组不同的回调函数指针来实现这一效果,每个转而转向实际的回调函数。然后,您可以根据实际调用的传递回调将调用与调用DLL相关联。

当然,这假设您正在为DLL提供回调地址,但可能这是一个DLL调用回调用exe的应用程序的正常设计。当然,如果DLL在你的进程内存中乱用于内部函数,它将无法工作,但是你可能会陷入敌对状态。