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】: 建议的方法是在从库中调用代码时显式提供此变量。使用externextern "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++ 执行流程?

如何跟踪 Visual Studio 2017(C++)中的内存使用情况?

C++ 和 Visual Studio 2017:错误 c4430 [重复]