【问题标题】:LD_PRELOAD with file functions带文件功能的 LD_PRELOAD
【发布时间】:2016-11-17 22:36:37
【问题描述】:

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

看起来像这样:

[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 机制来覆盖相关的文件功能。 我在 https://zlibc.linux.lu/index.html 上看到过类似 zlibc 的内容 - 并解释了它是如何工作的 (https://zlibc.linux.lu/zlibc.html#SEC8)。

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

【问题讨论】:

    标签: linux function overriding ld-preload


    【解决方案1】:

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

    可能的实现:

    zlibc 打开:

    1. 解压你想打开的文件到某个临时文件
    2. 打开这个临时文件而不是你的

    zlibc 关闭:

    1. 压缩临时文件
    2. 覆盖原始文件

    在这种情况下,您不需要覆盖 read/write/etc,因为您可以使用原始的。

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

    1. open,使用条纹校验和制作文件的副本。 close 计算校验和并覆盖原始文件
    2. readwrite 能够跳过/计算校验和。

    广告 2。 来自What is the difference between read() and fread()?

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

    在这种情况下,我相信覆盖 openclose 会更不容易出错,因为您可以安全地重用原始 readwritefreadfseek 等。

    【讨论】:

    • 这听起来确实是一种合理的方法。我的假设是否正确,所有函数,如fopenfclosefgetsfputsfreadfwrite 等......都是库函数,在某些时候使用你提到的系统调用? fseekftell 这样的函数呢?是否有任何其他系统调用我应该拦截以确保一切正常?
    猜你喜欢
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 2021-08-28
    • 1970-01-01
    相关资源
    最近更新 更多