是否可以在c ++中调用导出的“私有”方法

时间:2011-06-18 18:39:17

标签: c++ dll export private

是否可以调用从DLL导出的类的私有方法? 对于那些想要使用但不应该使用它的人来说,它是否会被隐藏? 谢谢:))

2 个答案:

答案 0 :(得分:4)

是的,这可能是,但你需要使用肮脏的强制转换技巧或依赖半未定义的行为,但是为了确定你可以调用导出的函数,无论它是私有/公共状态。 / p>

该语言不提供针对恶意攻击者的安全性。它将帮助每个人遵守规则,但它不会防止那些试图破坏系统的人。

例如:

  • 使用GetProcAddress()获取函数的地址,将其强制转换为正确的成员函数类型,然后调用它。
  • 创建一个类的修改头文件,将所有内容声明为public(或者只是添加一个静态函数void crowbar()),然后针对它进行编译。 (未定义的行为,因为你违反了一个定义规则,但它可能会起作用......)

不要依赖C ++私有关键字来保障安全。

答案 1 :(得分:1)

如果它出现在DLL的导出表中,可以使用GetProcAddress并调用返回的函数指针来调用它。获得正确的调用约定存在一些技术障碍,但这是可能的(很可能需要一些汇编语言)。

严格地说,任何本机代码都可以调用编译器生成外部实例的任何函数。由DLL导出只是为了更容易找到函数代码的地址。