【问题标题】:Emdedding accessible text in binary - post-compilation在二进制文件中嵌入可访问的文本 - 编译后
【发布时间】:2021-05-13 15:21:30
【问题描述】:

我有一个很奇怪的问题,但我真的不知道如何提出或从哪里开始。

我的问题不是关于“嵌入”一个文本文件(我们在编译时已经有了)——这太明显了。

我的问题是,如果(以及如何)我可以说“打包”一个现有的(由 C 创建的)二进制文件和一个文本文件,并生成一个新的...可以访问该文件的工作二进制文件。

我是 Mac 用户。我知道这可以与 .app 包和所有这些一起使用。但这仍然不是我想要的。我希望能够“调整”现有的二进制文件,向其中添加一些(可访问的 - 如何?)额外的文本数据,并且二进制文件保持绝对功能。

这可能吗?

附:我研究过的唯一严肃的工具是bsdiffbspatch,但我不确定这是我要找的。​​p>

【问题讨论】:

  • 你能解释一下“可访问”是什么意思吗?您是否希望像 Finder 这样的文件系统浏览器将其识别为文本文件?或者你只是意味着你可以运行一个单独的工具来稍后提取文本文件而你不在乎那个工具是什么?你关心二进制文件的加密签名吗?
  • @JonReeves 我的意思是我必须以某种方式能够从编译的二进制文件中访问这个后验添加的信息/文本。
  • 知道了,感谢您的澄清。您的问题的答案肯定是“是”,但它很复杂,并且取决于平台。我可以提供一个准系统的答案,但这只是一个开始。

标签: gcc binary clang embed patch


【解决方案1】:

您绝对可以这样做,但每个平台的确切过程会有所不同,并有一些共同点。您在这里选择的工具可能是llvm_objcopy

在高层次上,您将在二进制文件中创建一个特殊的段或部分(或在 MachO 的情况下同时创建一个),其中包含您想要的数据,然后您必须解析自己的可执行文件来检索它。既然您说您使用的是 Mac,我们可以从那里开始作为示例。

创建最愚蠢的测试程序作为起点:

test.c

#include <stdio.h>

int main(int argc, char **argv)
{
    printf("I'm a binary!\n");
    return 0;
}

编译并运行它:

prompt$ clang -o test test.c
prompt$ ./test
I'm a binary

现在创建一个文本文件hello.txt 并在其中放入一些文本:

Hello world!

您可以使用 llvm-objcopy 将其嵌入到 MachO 文件中

llvm-objcopy --add-section __MAGIC,__magic_section=hello.txt test test

然后检查它是否仍然运行:

prompt$ ./test
I'm a binary!

您可以使用otool -l 验证该部分是否已添加,也可以在二进制文件上运行strings,您应该会看到您的文本:

prompt$ strings ./test
I'm a binary!
Hello world!

现在您必须能够检索这些数据。如果您事先编译所有内容,这将很容易,因为链接器会为您制作符号来标记您添加的 __magic_section 部分的开始和结束。

由于您明确表示这必须是后验步骤,因此您将不得不实际自解析 MachO 文件以查找您添加的 __MAGIC 段中的 __magic_section 部分。您可以找到一些用于解析 MachO 文件的不同参考,但您可能还想利用内置的 dyld 功能。请参阅Apple's Reference 上的dyld 实用程序调用,例如,它可以为您提供正在运行的进程的马赫标头。 Linux 通过dl_iterate_phdr 具有类似的功能。

一旦您知道该部分在原始二进制文件中的位置,您就可以检索文本。

要在 Linux 上重复所有这些,您将执行几乎相同的操作,但您将使用 ELF 文件格式而不是 MachO。但同样的原则也适用。

附带说明:这正是代码签名在 MacOS 上的工作方式。生成签名并将其放入二进制文件中的专用“签名”部分,以供系统在启动时读取。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    相关资源
    最近更新 更多