是否可以使用标头中没有的c ++库代码?

时间:2018-12-21 14:22:14

标签: c++

我想知道(出于代码安全性的原因)-C ++库的用户可以使用他的库中只有一个标头而不知道的库类,函数调用和变量吗?

如果他通过在库文件中查找文本来猜测类和调用的名称,他是否可以编写一个头文件以允许他使用代码?

2 个答案:

答案 0 :(得分:3)

首先,头文件实际上只是为了方便。并没有阻止用户使用库的文档重新创建头文件的方法(甚至只是通过对库进行反向工程),因此也没有阻止他们添加库公共接口中从头文件中丢失的部分的机会。

但是标头应该包含整个公共接口,否则它的意义是什么?此外,通常应该对库进行设计,以使所有 else 都具有内部链接而不被导出。尽管并非不可能,但使用它们却更加困难,因为运行时(或静态)链接程序将无法解析您手工编写的声明,因为它们引用的是库私有部分中的符号。在正常使用中,它们被认为是隐藏的。

这肯定不是“安全”措施,因为最终所有东西都可以被黑客入侵,但是从易于访问的角度来看,通常认为可以安全地藏匿图书馆内部。

如果您想防止坏演员获得对图书馆内部的任何访问权限,则必须做几件事:

  1. 决定要抵抗的演员有多糟糕
  2. 确定要抵抗的攻击形式
  3. 确定要抵抗的攻击强度
  4. 确定要在尝试中牺牲多少可用性
  5. 意识到这完全是徒劳的,请停止尝试

答案 1 :(得分:0)

是的,至少可以访问具有外部链接的全局变量。想象一下:

foo.cpp

int foo = 42;

main.cpp

#include <iostream>
extern int foo;

int main() {

    std::cout << foo;
}

没有将main.cpp连接到foo.cpp的头文件,但是由于我们知道名称foo,因此可以在extern中使用main.cpp来告诉编译器在其他地方定义,链接器将使我们可以访问它。