LD_PRELOAD具有文件功能

时间:2016-11-17 22:36:37

标签: linux function override ld-preload

我有一个非常奇特的文件格式可供使用: 每一行都以其内容的校验和开头,后跟一个换行符。

看起来像这样:

[CHECKSUM OF LINE_1][LINE_1]\n
[CHECKSUM OF LINE_2][LINE_2]\n
[CHECKSUM OF LINE_3][LINE_3]\n
...

我的目标:允许任何应用程序使用这些文件,就像它们可以与任何其他文本文件一起使用 - 不知道每行开头的附加校验和。

由于我在使用debian wheezy(内核3.18.26)的linux机器上工作,我想使用LD_PRELOAD机制来覆盖相关的文件函数。 我在This answer上看到了类似于zlibc的内容 - 并解释了它是如何工作的(https://zlibc.linux.lu/index.html)。

但我不明白。它们只替换文件打开功能。不读。不写。没有fseek。没有。那么它是怎样工作的? 或者 - 我必须拦截哪些函数来处理此文件上的每个读取或写入操作并相应地处理它们?

1 个答案:

答案 0 :(得分:1)

我没有确切地检查它是如何工作的,但原因似乎很简单。

可能的实施:

zlibc open:

  1. 解压缩您要打开某个临时文件的文件
  2. 打开此临时文件而不是您的
  3. zlibc close:

    1. 压缩临时文件
    2. 覆盖原始文件
    3. 在这种情况下,您不需要覆盖读/写/等,因为您可以使用原始的。

      在您的情况下,您有两种可能的解决方案:

      1. open,使用条带校验和制作文件的副本。计算校验和并覆盖原始文件的close
      2. readwrite能够跳过/计算校验和。
      3. 广告2。 来自What is the difference between read() and fread()?

          

        fread()是C库的一部分,并提供缓冲读取。它是   通常通过调用read()来实现,以填充其缓冲区

        在这种情况下,我认为覆盖openclose的错误会更少,因为您可以安全地重复使用原始readwritefreadfseek等。