目前,我有一个C ++ exe项目,它dynamic加载N个DLL。
这些DLL将执行调用到重新内部exe项目的function。
现在,在我的exe项目中,我希望知道调用者来自哪个DLL。
是否有可能使用任何可用的Windows API?
这取决于你的实际目标是什么。 如果您期望DLL可能是恶意的(即,如果您希望他们试图欺骗您),则无法执行此操作。 但是如果只是为了调试或者日志记录或者其他相关的东西,那么你可以看看堆栈,并得到ret
指令用来返回给调用者的地址,枚举所加载的DLL并测试那个地址是哪个代替。
要获得“返回地址”,可以使用Visual C ++中的_ReturnAddress内部函数,然后可以使用GetmoduleeHandleEx函数,传递GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
来获取该地址所在的DLL的句柄。
但是我必须重申: 你不能将安全决策置于这个测试的结果之外 。 恶意代码很容易伪造“欺骗”你的程序,认为它是“可信”或“安全”的DLL。 正如我所说,如果只是为了调试或记录什么的话,那就马上行动吧。
而且,这显然只会告诉你直接调用者在里面的DLL。 你不能做到这一点,如果你是5级或什么东西….
如果你已经给多个DLL提供了相同的回调,那么由他们来提供关于谁是谁的信息。 大多数的API回调都有一个参数可以传递给回调。 如果这是你的回调,你可以用它来识别DLL。
这可能是不可能的,因为无论如何,调用堆栈会回到你的exe文件。
编辑:从你的文章看,这是一个假设的情况?
这有帮助吗? 检查参数“GetmoduleeBaseRoutine”
如果你正在设计exe文件,并且你不假设这个DLL是敌对的(参见Dean的答案),你可以通过为每个DLL提供一组不同的指针来达到这个效果,转到实际的回调函数。 然后,您可以将调用与调用DLL相关联,实际调用哪个传递回调。
当然,这假定你提供的DLL的回调地址,但大概这将是一个应用程序的DLL调用回到调用EXE的正常设计。 如果DLL在你的进程内存中进行内部函数的操作,这当然是不可行的,但是你可能会陷入敌对的境地。