如何在 Linux 上挂钩 send() / recv() 函数?

Jul*_*mur 2 c c++ unix elf abi

我正在尝试在 Linux 上用 C++挂钩recv()send()函数。

我知道如何挂钩函数 (github: zeek/subhook)。但是我想要一些帮助来学习如何查找recv()send()函数的地址(在运行时,或使用独立版本的解决方案)。

我愿意接受任何可以帮助我理解此处涉及的机制的文档或建议。


[编辑] 澄清:我不想使用,LD_PRELOAD=因为我用这个工具注入了我的共享库:linux-inject

Pau*_*bel 5

请参阅什么是 LD_PRELOAD 技巧?.

基本上,您编写的方法与要挂钩的方法具有相同的签名。在这种情况下sendrecv。然后将 LD_PRELOAD 设置为指向新库。加载程序将首先找到您的函数并调用它。

在您的库中,您可以包装原始代码、完全替换它、修改输入或输出,基本上任何事情。

有关一些示例代码,请参阅此 turorial dlsym 和 ld preload

发送的一个示例是:

ssize_t (*original_send)(int sockfd, const void *buf, size_t len, int flags);
original_send = dlsym(RTLD_NEXT, "send");
return (*original_send)( /args/ );
Run Code Online (Sandbox Code Playgroud)