簡體   English   中英

使用 LD_PRELOAD 攔截統計調用

[英]Intercepting stat call with LD_PRELOAD

我正在嘗試編寫一個共享的 object 來攔截一些文件系統 API 調用,例如來自應用程序的打開、關閉、讀取、寫入等。 攔截是使用 LD_PRELOAD 完成的。 我有條不紊地使用 strace 找出應用程序調用的 API,並在 LD_PRELOAD 加載的共享庫中實現它們。 當談到 stat 時,我發現調用了 __xstat 和 __xstat64 而不是 stat 並且我已經覆蓋了這兩個函數。 我能夠捕獲這些 API 呼叫。 但是,在一個特定環境中,當我使用 strace 時,我看到直接調用 stat() 本身。 像下面一樣

25083 03:11:28.424859 close(13)         = 0 <0.000045>
>> 25083 03:11:28.424966 stat("/somedir/somefile", 0x7ffe751d2430) = -1 ENOENT (No such file or directory) <0.000050>
25083 03:11:28.425067 clock_gettime(CLOCK_MONOTONIC, {786855, 130369007}) = 0 <0.000029>

我注意到的區別是 stat 是直接調用的,我在其他環境中看不到。 應用程序可能會調用 stat(),但我看到 stat 在內部調用 __xstat 或 __xstat64。 我注意到的另一件事是 stat() 甚至沒有在 libc.so 庫中實現。 所以這個 stat() 似乎是對 stat() 系統調用的直接調用。 我如何確認這一點? 應用程序如何直接調用 stat() 系統調用?

所以這個 stat() 似乎是對 stat() 系統調用的直接調用。 我如何確認這一點?

使用catch syscall stat運行gdb內部的程序。 當系統調用發生時,用bt檢查調用堆棧並注意你是否在 libc.so 中。

應用程序如何直接調用 stat() 系統調用?

使用內聯匯編。 這是的示例:

#include <stdio.h>
#include <sys/stat.h>
#include <sys/syscall.h>

int main(int argc, char **argv) {
    if(argc < 2) return 1;
    struct stat s;
    long rv;
    __asm__ volatile(
        "syscall"
        : "=a"(rv)
        : "a"(SYS_stat), "D"(argv[1]), "S"(&s)
        : "rcx", "r11", "memory"
    );
    if(rv) return 1;
    printf("%zu\n", s.st_size);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM