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

标签 c api obfuscation hide

<分区>

我编写了一个 C 库,其中包含一些 .h 文件和 .c 文件。我将其编译为 .a 静态库。

我只想向用户公开某些功能,并尽可能使其余功能“模糊”,以使逆向工程相当困难。

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

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

2- myLibrary.a:尽可能不可逆

这方面的最佳做法是什么?我应该去哪里找,有什么好的教程/书吗?

更具体地说:

对于 - 1

我已经拥有所有的 .h 和 .c 工作,我想避免改变它们,将函数声明从 .h 移动到 .c 并进入循环引用潜在的 pbs。这可能吗?

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

对于 - 2

a) 我应该注意哪些 gcc 标志(或 xcode)(用于剥离、没有调试符号等) b) 学习如何进行代码混淆的好指南?

任何想法都会有所帮助,

谢谢爸爸

最佳答案

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

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

如果您有交付给最终用户但不透明的数据结构,则考虑让 API 将它们作为指向 struct 的指针交付,该 struct 声明为未在公共(public) API 中定义.h 文件。这将保持类型安全,同时隐藏实现细节。自然地,完整的 struct 定义在一个私有(private)的 .h 文件中。

小心,您可以保留一个部分记录的公开的 struct,它是真正定义的类型双关语,但只公开公共(public)成员。这更难保持最新,如果你这样做,我会确保有一些强大的测试用例来验证公共(public)版本实际上在所有重要方面都等同于私有(private)版本。

自然地,使用 strip 删除调试段,这样内部细节就不会那样泄露。

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

最后,要习惯这样一个事实,即任何可以使用您的库的人都能够在某种程度上对您的库进行逆向工程。可以采取反调试器措施,但恕我直言,这种方式是疯狂和沮丧的。

关于c - 提供隐藏内部函数的 C API 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3689143/

相关文章:

c - 为什么 free() 释放数据但保存 next_node 值?

结构中的 C 字符串

c - 如何解释数据类型大小及其对齐方式?

c - 这段代码有什么错误?(C - 文件处理)

http - REST API 设计 : Tell the server to "refresh" a set of resources

c# - 简单的不安全双向数据 "obfuscation"?

ios - 使用 iOS ClassGuard 混淆 iOS 项目

.net - 你能用 .net reactor 混淆 LinqToSql 程序集而不破坏它们吗?

用于版本控制外部 API 的 Java 包命名

javascript - 将表单字段值提交给 Javascript 函数