【问题标题】:Is there anyway to parsing or modifying string during compile time in C?无论如何在C编译期间解析或修改字符串?
【发布时间】:2015-09-27 05:35:38
【问题描述】:

我想在我的可执行二进制文件中隐藏字符串,因为它真的很容易被破解。所以我想在编译时做一些编码

我想在编译时更改字符串,例如如果我有一个字符串

a = "abc"

我想把a改成

a = "bcd"(加上'\1' 到字符串数组的每个元素)。

还有,我想在编译的时候把a改成SHA256(a),可以吗?

【问题讨论】:

  • 您使用文本编辑器,将光标定位在最后一个 c 之后,按退格键 3 次,然后键入 bcd。说真的,“在编译期间”是什么意思?您不能在“编译期间”修改您的源代码。您可以使用任何工具生成源代码,将数据写入 *.c 文件。
  • 为什么要问,用例是什么?请编辑您的问题以改进它。
  • 你的问题真的不清楚。请编辑您的问题以激发它并举一个真实的例子......
  • 我不知道你有什么困惑,我只是想写一个编译函数,用它可以在不降低代码可读性的情况下转换字符串
  • 你应该解释你问的为什么。闻起来很像XY problem

标签: c arrays string gcc compile-time


【解决方案1】:

您不能轻易做到这一点,但您可以编辑每个源文件以更改每次出现的字符串。如果使用 emacs 作为您的编辑器,您可以编写一些 Emacs Lisp 代码来自动进行编辑。

当然,您可以从其他东西生成您的 C 代码,例如使用其他一些预处理器(gppm4)和/或一些(例如awk)脚本。

您可以考虑采用每个这样的字符串都用在唯一宏中的约定,例如MY_STRANGE_STRING("abc") 而不是简单的"abc";那么你可能会使用一些预处理器macro技巧-concatanation,__LINE__,也许是字符串化- ....(也许使用gpp预处理器来生成一些标题等......)

可能会处理您的源两次。首先通过一些gppm4 预处理将第123 行出现的MY_STRANGE_STRING("abc") 转换为一些生成的标头中的#define MY_STRING_CONSTANT_123 "cde"。然后 C 编译器将使用普通的预处理技巧来获得它。

您还可以通过专用工具或脚本来转换源代码的预处理形式。

如果使用最近的GCC(特别是)进行编译,您可以使用MELT 来定制您的编译器来执行这些技巧。然后,您将插入一些优化通道来进行转换。您可以将 MY_STRANGE_STRING 定义为特定于您的应用程序的 __my_strange_string_builtin 并将该附加内置函数添加到 GCC 等...

请注意,您可能不想转换每个文字字符串(例如,您可能不想转换大多数 fprintf 调用的文字控制字符串...,或者 __FILE__ 或 @987654340 的扩展@ 发生在某些系统宏中,例如assert),但只是其中的一些。

我无法提供更多帮助,因为您不会激发您的问题。

【讨论】:

    猜你喜欢
    • 2013-11-26
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 2017-04-15
    相关资源
    最近更新 更多