2011-06-27 14 views
0

私は、書き込みをリダイレクトするために書き込みライブラリ関数をインターセプトしましたが、いくつかの書き込みはラッパーにしか必要ではなく、他のもの(ソケットへの書き込みに使用)は元のlibc関数に行かなければなりません。 dlsymを使ってみましたが、うまくいきません。writeラッパーへの選択呼び出し

は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

私の主な問題は、dlsymingは動作していないようです...書き込むための呼び出し(ここでは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

上記は、このような出力を生成する必要があります

通過がdlsym(RTLD_NEXT, "write")は、libcの関数を返さない場合は、明示的にしたいライブラリ、電子を述べることができる32768バイト

0

で読み取ります。 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が動作するはずです。

関連する問題