使用共享库:自定义 myfopen()、myfrwrite()

using a shared library : custom myfopen(), myfrwrite()

您好,我创建了一个名为 logger.so 的共享库。这个库是我的自定义 fopen()fwrite()。它收集一些数据并生成包含这些数据的文件。

现在我正在编写一个 bash 脚本,我也想使用这个库。生成一个 txt 文件,我将能够看到生成自定义 fopen() 的额外文件。因此,当我在 c 文件中使用命令 fopen() 时,会生成这个额外的文件。

我的问题是哪些命令在 bash 中使用 fopen()fwrite() 函数?

我已经预加载了我的共享库,但它不起作用。也许这些命令不使用 fopen(),fwrite()

export LD_PRELOAD=./logger.so 

read -p 'Enter the number of your files to create: [ENTER]: ' file_number


for ((i=1; i<=file_number; i++))
do
     echo file_"$i" > "file_${i}"
done

这可能需要反复试验。我看到有两种方法可以做到这一点。一个是 运行 处理 bash 中文件的潜在命令,并查看在跟踪时它们是否调用 fopen:

strace bash -c "read a < /dev/null"`

strace bash -c "read a < /dev/null"` 2&>1 | fgrep fopen

这表明 read 使用 open,而不是 fopen

另一种方法是按照@oguz 的建议grep 通过bash 的源代码。当我这样做时,我发现了几个调用 fopen 的地方,但我没有进一步调查:

curl https://mirrors.tripadvisor.com/gnu/bash/bash-5.1-rc3.tar.gz|tar -z -x --to-stdout --wildcards \*.c | fgrep fopen

您需要解压缩整个包并逐一搜索 .c 文件,例如:

curl https://mirrors.tripadvisor.com/gnu/bash/bash-5.1-rc3.tar.gz|tar -z -v -x --wildcards \*.c

您也可以 FTP 文件或通过浏览器保存它,如果没有 curlwget 也可以,则独立执行 tar ).

希望你能追踪到相关命令,但这可能并不容易。

不一定每个程序都使用 C 标准库 stdio 函数 fopenfwrite

但是每个程序都使用 openwrite 系统调用来打开和写入文件,您可以插入/monkey-patch。

使用 io_uring 的现代程序需要不同的插入方法。