我拦截了写库函数以重定向写入,但只想对包装器进行少量写入,而其他(用于写入套接字)应该转到原始的libc函数。尝试过使用dlsym但似乎没有用。
使用了LD-PRELOAD环境变量
非常感谢帮助
编辑: 代码的一部分
int call_execute()
{
.....
static ssize_t (*real_write)(int,const void*,size_t) = NULL;
...
real_write= (size_t(*)(int,const void*,size_t)dlsym(RTLD_NEXT,"write");
...
real_write(sockfd,argcalls[i],strlen(argcalls[i]));
}
答案 0 :(得分:1)
#include <unistd.h>
#include <stdio.h>
#include <dlfcn.h>
typedef ssize_t (*readf)(int, void *, size_t);
ssize_t
read(int fd, void *buf, size_t count) {
readf p = dlsym(RTLD_NEXT, "read");
printf("passing read with %d bytes\n", count);
return p(fd, buf, count);
}
$ gcc -W -Wall -shared -o /tmp/libpre.so test.c -ldl
$ env LD_PRELOAD = / tmp / libpre.so cat / dev / null
上面应该产生这样的输出:
以32768字节传递读取
答案 1 :(得分:0)
如果dlsym(RTLD_NEXT, "write")
未返回libc函数,则可以显式声明所需的库,例如:克。
void *handle = dlopen("libc.so.6", RTLD_LAZY);
if (!handle) puts(dlerror()), exit(1);
typeof(&write) real_write = dlsym(handle, "write");
- 但是如果你没有首先使用LD_PRELOAD并在主程序中定义你的写包装器那么也许会更容易 - 那么RTLD_NEXT应该可以工作。