提供隐藏内部函数的C API的最佳实践

提供隐藏内部函数的C API的最佳实践,c,api,obfuscation,hide,C,Api,Obfuscation,Hide,我已经编写了一个C库,它包含一些.h文件和.C文件。我把它编译成一个静态库 我只想向用户公开某些功能,并尽可能使其他功能“模糊”,从而使逆向工程变得相当困难 理想情况下,我的图书馆应包括: 1-一个仅向用户公开函数的.h文件 2-我的图书馆。答:尽可能不可工程化 这方面的最佳实践是什么?我应该去哪里看,哪里有好的教程/书 更具体地说: 对于-1 我已经让所有的.h和.c都工作了,我希望避免改变它们,将函数声明从.h移动到.c,并进入循环引用。可能吗 例如,创建一个新的.h文件是不是一个好主意,我

我已经编写了一个C库,它包含一些.h文件和.C文件。我把它编译成一个静态库

我只想向用户公开某些功能,并尽可能使其他功能“模糊”,从而使逆向工程变得相当困难

理想情况下,我的图书馆应包括:

1-一个仅向用户公开函数的.h文件

2-我的图书馆。答:尽可能不可工程化

这方面的最佳实践是什么?我应该去哪里看,哪里有好的教程/书

更具体地说:

对于-1

我已经让所有的.h和.c都工作了,我希望避免改变它们,将函数声明从.h移动到.c,并进入循环引用。可能吗

例如,创建一个新的.h文件是不是一个好主意,我只使用它来分发我的.a文件?h将包含我想要公开的函数的副本,并转发我使用的类型声明。这是个好主意吗

对于-2

a) 我应该知道哪些gcc标志(或xcode)(用于剥离、没有调试符号等) b) 了解如何进行代码混淆的好方法

任何想法都会有帮助


谢谢,baba

删除此函数的标题,在导出表中进行一些模糊处理,打包代码并应用一些反调试器算法


除了探索“静态”函数的使用之外,我没有一个快速的答案。我建议阅读米罗·萨梅克关于他称之为“C+”的东西的著作。基本上是面向对象的ANSIC。非常好的阅读。他拥有Quantum leaps软件。

通常的做法是确保仅在某个模块内部使用的每个函数和全局变量在该模块中声明为静态。这限制了单个模块内部实现细节的公开

如果您需要跨模块的内部实现详细信息,但这些信息不是供公众使用的,那么请声明一个或多个保持私有且未交付给最终用户的
.h
文件。以这种方式定义的对象名称对链接器(以及
objdump
nm
等工具)仍然可见,但其详细签名将不可见

如果您有数据结构被交付给最终用户,但它们是不透明的,那么考虑API是否将它们作为指针指向<代码>结构> <代码>,这在公共API <代码> h < /C>文件中未定义。这将保留类型安全性,同时隐藏实现细节。当然,完整的

struct
定义位于私有
.h
文件中

小心地,您可以保留一个部分文档化的公共结构,它是真正定义的类型双关语,但只公开公共成员。这更难跟上最新的版本,如果你做到了,我会确保有一些强大的测试用例来验证公共版本实际上在所有重要方面都等同于私有版本

当然,使用
strip
删除调试段,这样内部细节就不会以这种方式泄漏

有一些工具可以混淆所有仅供内部使用的名称。如果作为构建过程的一部分运行,您可以使用内部调试构建,该构建对所有内容都有合理的名称,并提供一个具有所有内部函数和全局变量名称的构建,这些名称只有链接器才喜欢


最后,要习惯这样一个事实:任何可以使用您的库的人都可以在一定程度上对您的库进行反向工程。有一些反调试器的措施可以采取,但我认为这是疯狂和沮丧的表现

我有一个疑问。如何将标志_属性_uu((可见性(“默认”))仅应用于那些他希望公开并在整个库的编译标志中传递-fvisibility=hidden的函数。我不确定这里的反向工程过程。即使没有符号,只要代码可以运行,物理硬件可以检查,反向工程也是可能的。这可能不是小事,但仍然是可能的。库的情况稍差,因为您确实需要允许合法用户引用某些符号。请显示您已经编写的一些代码。我们不是您的个人编码服务