2011-06-27 37 views
0

我已经拦截了写入库函数来重定向写入,但只需要向uae封装一些写入,而其他(用于写入套接字)应该去原始的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

你可以给你的问题添加一些代码吗?特别是'dlsym'使用情况下的位# – Hasturkun

+0

你想做什么,为什么?您发布的信息不足以回答问题。 –

+1

我的主要问题是dlsym-ing似乎不工作...调用写(real_write在这里)通过我已经写和预装的写包装。 –

回答

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个字节

0

如果dlsym(RTLD_NEXT, "write")没有返回libc函数,你可以明确地说明你希望库,即G。

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应该工作。