提供隐藏内部函数的 C API 的最佳实践[关闭]

2024-03-01

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

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

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

1- 一个 .h 文件,仅包含向用户公开的功能

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

对此的最佳实践是什么?我应该在哪里看,有什么好的教程/书籍吗?

进一步来说:

for - 1

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

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

for - 2

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

任何想法都会有所帮助,

谢谢,爸爸


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

如果您需要跨模块但不供公共使用的内部实现细节,请声明一个或多个.h保密且不交付给最终用户的文件。以这种方式定义的对象的名称对于链接器(以及诸如objdump and nm)但他们的详细签名不会。

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

只要小心,您就可以将部分记录的信息公开struct这是真正定义的类型双关语,但仅公开公共成员。这更难保持最新状态,如果你这样做,我会确保有一些强大的测试用例来验证公共版本实际上在所有重要方面与私有版本相同。

自然地,使用strip删除调试段,以便内部细节不会以这种方式泄露。

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

最后,要习惯这样一个事实:任何有能力的人use您的图书馆将能够在某种程度上对您的图书馆进行逆向工程。可以采取反调试器措施,但恕我直言,这种方式会带来疯狂和挫败感。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

提供隐藏内部函数的 C API 的最佳实践[关闭] 的相关文章

随机推荐

  • 在 RabbitMQ 主题交换中路由与模式不匹配的消息

    两个队列绑定到具有以下路由键的主题交换 队列 A 与路由键模式匹配绑定 foo队列 B 与路由键模式匹配绑定 bar 我想向此交换添加第三个队列 该队列接收的消息都不是foo消息也不bar消息 如果我用一个绑定这个队列 路由密钥 我自然会得
  • Airflow - 跳过未来的任务实例而不更改 dag 文件

    我有一个 DAG abc 计划在每天上午 7 点 美国中部标准时间 运行 并且该 DAG 中有任务 xyz 由于某种原因 我不想为明天的实例运行任务 xyz 之一 如何跳过该特定任务实例 我不想对代码进行任何更改 因为我无权访问 Prod
  • 未加载用于在 Visual Studio 2012 中调试自定义项目的符号文件

    我在 Visual Studio 2012 中有一个大型解决方案 其中包含可执行文件和类库项目 调试应用程序时 不会命中某一特定类库项目中的断点 我看了看调试 gt 窗口 gt 模块窗口检查该项目的符号状态 它说 找不到或打开 PDB 文件
  • 我是否需要对使用 NewIntArray 创建的数组调用 ReleaseIntArrayElements?

    我有一个本机方法可以对位图进行一些工作 在该方法内部 我通过方法调用获取图像数据 该方法调用将数据写入jintArray我用它创建的参数NewIntArray jintArray pixels env gt NewIntArray widt
  • Grafana 条形宽度太小

    我想知道如何在直方图中获得更大的条形宽度 例如条形图 This is the graph how it looks rigth now And this is the corresponding query in flux 在 Grafan
  • Ninject.Web.PageBase 仍然导致对注入依赖项的空引用

    我有一个使用 Ninject 2 0 的 ASP NET 3 5 WebForms 应用程序 但是 尝试使用 Ninject Web 扩展来提供对 System Web UI Page 的注入 即使我切换到使用服务定位器来提供引用 使用 N
  • H2索引名称唯一性

    我对 h2 数据库中索引名称的唯一性有一个小问题 使用 mysql mariadb 可以同时为表 A 和表 B 定义名为 X 的索引 对于 h2 数据库这是不可能的 因为每个数据库的索引名称应该是唯一的 这对我来说是一个问题 因为我有一个基
  • 如何安排本地 Azure DevOps 构建每 5 分钟运行一次?

    不用管理由 我有一个案例 需要每 5 分钟运行一次构建 本地安装不支持 YAML 中的计划 那么 我们该怎么做呢 我可能可以使用 REST Api 但这很糟糕 因为我似乎要么创建一个一次性脚本 要么创建一个用于非常简单类型的计划的脚本 似乎
  • 丢包纠错码 (UDP)

    我不知道要寻找什么 因为我从 纠错代码 中得到的只是与您不知道错误位置的情况相关的内容 因此 这些代码比我需要的要复杂得多 而且效率低下 在下文中 请注意位等于数据包 因为只有整个数据包可能会丢失 因此位类比非常适合 是否有 ECC 考虑到
  • 授予某个数据库中所有存储过程的执行权限

    正如标题所示 我需要授予数据库中每个存储过程的执行权限 我们已经从测试转向生产 对生产数据库的控制减少了 并且所有导入的存储过程现在都获得了零权限 一件有趣的事情是 是否有任何方法可以确保所有导入的存储过程从一开始就获得执行权限 谢谢你的帮
  • 如何计算两个日期之间的天数?

    例如 输入框中给出两个日期
  • pip 安装 PIL 失败

    我正在尝试安装 pip 包 PIL 但是安装不起作用并抛出以下错误 Could not find a version that satisfies the requirement pil from xhtml2pdf 0 0 4 gt r
  • 我们可以在单独的模块中使用 Flask 错误处理程序吗

    我们正在将 Flask 应用程序从基于函数的视图迁移到可插入视图 除了错误处理程序之外 一切都按预期工作 我试图将所有错误处理程序放入一个名为 error handlers py 的模块中 并将其导入到主模块中 但它不起作用 尝试在 Goo
  • 如何同步两个 Oracle 数据库?

    我想创建一个项目 其中需要将本地数据库与远程数据库同步 本地数据库中所做的更改必须反映到远程数据库 这必须同步完成 我有一个应用程序 它对用 java jpa 编写的本地数据库执行 CRUD 操作 同步应该由 java 代码触发 我想到了数
  • 宽度等于动态高度平方[重复]

    这个问题在这里已经有答案了 当高度为父级 div 的 时 是否可以使用 css 或 js 将元素的宽度设置为与其高度相匹配 如果调整浏览器窗口的大小 子 div 也需要更改大小 Example body html height 100 pa
  • 元数据集合中已存在标识为“Id”的项目。参数名称:项目

    我的所有实体都有一个基类 public class Entity
  • 使用 Django 创建可编辑的 HTML 表格

    我正在尝试创建一个 Django 应用程序 用户可以在其中创建电影列表 每次用户登录时 他们的电影列表都会以表格形式呈现给他们 该表将包含三列 一列用于电影名称 一列用于类型 另一列包含删除按钮 允许用户删除与该按钮对应的行 用户可以通过在
  • Tensorflow 2.1.0 错误,模块“tensorflow”没有属性“GraphKeys”

    我今天刚刚安装了新的 tf 和 cuda 但是当我运行之前与 tf 1 4 一起使用的代码时 在新的 tensorflow 2 1 0 和 cuda 10 1 下将无法工作 如何解决这个问题 为了社区的利益 在答案部分提及解决方案 即使它出
  • 如何避免 getter 和 setter

    我在很多地方读到过 getter 和 setter 是邪恶的 我明白为什么会这样 但我不知道如何完全避免它们 Say Item 是一个包含有关商品名称 数量 价格等信息的类 ItemList 是一个类 它有一个项目列表 要查找总计 int
  • 提供隐藏内部函数的 C API 的最佳实践[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我编写了一个 C 库 其中包含一些 h 文件和 c 文件 我将其编译为 a 静态库 我想只向用户公开某些功能 并使其余功能尽可能 模糊 以使逆向