C++,Visual Studio 2017:从加载的 .dll 中访问 .exe 的全局变量 [重复]
Posted
技术标签:
【中文标题】C++,Visual Studio 2017:从加载的 .dll 中访问 .exe 的全局变量 [重复]【英文标题】:C++, Visual Studio 2017: Access a global variable of an .exe from within a loaded .dll [duplicate] 【发布时间】:2018-11-28 10:24:04 【问题描述】:我有一个令人遗憾的任务,即从我的 .dll(由该 .exe 加载)中访问 .exe 的全局(!)变量。
头文件给了我以下全局变量的声明:
extern Element *ops_TheActiveElement;
基本上,全局变量是一个指向我需要访问的类实例的指针。
根据我在网上找到的内容,我可以在 dll 中使用类似的东西:
Element* getTheActiveElement()
auto handle = GetModuleHandle(NULL);
if (handle == NULL)
std::cout << "handle" << handle << std::endl;
auto activeElement = GetProcAddress(handle, "ops_TheActiveElement") ;
return (Element*)activeElement;
获取模块句柄没问题,但是获取全局变量的地址失败。 我不确定这是否可能,因为我不熟悉 Windows 编程。 可能的方法是什么?提前谢谢!
【问题讨论】:
您可以使用dumpbin /exports
查看导出的符号。如果该变量未导出,则您无法使用GetProcAddress
获取它(通常exe 不会导出任何内容)。当然,您可以使用反汇编程序和一些逆向工程工作找到该变量。
【参考方案1】:
建议的方法是在从库中调用代码时显式提供此变量。使用extern
(extern "C"
函数除外)和使用全局变量是代码异味。
或者,您可以将此变量从可执行文件中导出并将您的 dll 链接到可执行文件,以便可以直接访问 ops_TheActiveElement
。
【讨论】:
很遗憾,我无法对 .exe 进行修改。 @macmallow 那么你应该坚持使用它支持的 dll 接口,而不是尝试访问一些未暴露给 dll 的实现特定细节。 @VTT 对于通过代码注入进行黑客攻击/作弊并不是很有用^_^以上是关于C++,Visual Studio 2017:从加载的 .dll 中访问 .exe 的全局变量 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
在现有的 Visual Studio 2017 中下载 c++
如何在 Visual Studio 2017 中创建 Visual c++ MFC 控制台项目
Visual Studio C++ 社区 2017 中的构建错误
在 Visual Studio 2017 中使用断点时随机 C++ 执行流程?