【问题标题】:C++, Visual Studio 2017: Access a global variable of an .exe from within a loaded .dll [duplicate]C++,Visual Studio 2017:从加载的 .dll 中访问 .exe 的全局变量 [重复]
【发布时间】: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 不会导出任何内容)。当然,您可以使用反汇编程序和一些逆向工程工作找到该变量。

标签: c++ dll


【解决方案1】:
  • 建议的方法是在从库中调用代码时显式提供此变量。使用extern(extern "C" 函数除外)和使用全局变量是代码异味。
  • 或者,您可以将此变量从可执行文件中导出并将您的 dll 链接到可执行文件,以便可以直接访问 ops_TheActiveElement。

【讨论】:

  • 很遗憾,我无法对 .exe 进行修改。
  • @macmallow 那么你应该坚持使用它支持的 dll 接口,而不是尝试访问一些未暴露给 dll 的实现特定细节。
  • @VTT 对于通过代码注入进行黑客攻击/作弊并不是很有用^_^
猜你喜欢
  • 1970-01-01
  • 2013-09-27
  • 2015-12-02
  • 2011-01-29
  • 1970-01-01
  • 2019-03-09
  • 2017-10-08
  • 2010-12-20
  • 1970-01-01
相关资源
最近更新 更多