提供隐藏内部函数的C API的最佳实践
我写了一个C库,里面包含几个.h文件和.c文件。 我将其编译为.a静态库。
我想只向用户公开某些function,并将其余部分保持为“模糊”,以使逆向工程变得相当困难。
理想情况下,我的图书馆将包括:
1-一个.h文件,仅显示向用户公开的function
2- myLibrary.a:尽可能不可逆转
最佳做法是什么? 我应该在哪里看,有什么好的教程/书吗?
进一步来说:
为 – 1
我已经拥有了所有的.h和.c工作,我想避免更改它们,将函数声明从.h移动到.c并进入循环引用潜在的pbs。 那可能吗?
例如,创建一个新的.h文件是一个好主意,我只会用我的.a文件进行分发? 那个.h将包含我想要公开的函数的副本和我使用的类型的转发声明。 这是一个好主意吗?
为 – 2
a)我应该注意哪些gcc标志(或xcode)(用于剥离,没有调试符号等)b)一个很好的指针来学习如何进行代码混淆?
任何想法都会有帮助,
谢谢,巴巴
通常的做法是确保仅在某个模块内部使用的每个函数和全局变量在该模块中声明为static
。 这限制了单个模块的内部实现细节的暴露。
如果您需要跨模块交叉但不供公众使用的内部实现细节,则声明一个或多个.h
文件,这些文件保密并且不会传递给最终用户。 以这种方式定义的对象的名称仍然可以被链接器(以及诸如objdump
和nm
工具)看到,但它们的详细签名将不会。
如果您有交付给最终用户但不透明的数据结构,那么请考虑让API将它们作为指向未在公共API .h
文件中定义的struct
指针。 这将保留类型安全性,同时隐藏实现细节。 当然,完整的struct
定义位于私有的.h
文件中。
小心,你可以保留一个部分记录的公知struct
,它是真正定义的类型双关语,但只暴露公共成员。 这更难以保持最新,如果你这样做,我会确保有一些强大的测试用例来validation公共版本实际上在所有方面都与私有版本相同。
当然,使用strip
来删除调试段,以便内部细节不会泄漏。
有些工具可以混淆所有仅供内部使用的名称。 如果作为构建过程的一部分运行,您可以使用具有合理名称的内部调试构建,并发布一个已命名所有内部函数和全局变量的构建,其名称只有链接器可以喜欢。
最后,习惯于任何可以使用您的库的人都能够在某种程度上对您的库进行逆向工程。 可以采取反调试器措施,但恕我直言,这种方式是疯狂和沮丧。
除了探索“静态”function的使用之外,我没有快速的答案。 我建议阅读Miro Samek的作品,他称之为“C +”。 基本上面向对象的ANSI C.很棒的阅读。 他拥有Quantum leaps软件。