2

C で実行時に関数を条件付きで置き換えることは可能ですか (特に、動的にロードされるライブラリの関数)?

LD_PRELOAD を使用するか、次のような同じ名前の関数を作成できることを知っています。

// Silly example intercepting exit
typedef void (*exit_func)(int code);

void exit(int code)
{
    exit_func orig_exit = (exit_func)dlsym(RTLD_NEXT, "exit");

    NSLog(@"EXIT CALLED WITH CODE %d!!!!", code);

    orig_exit(code);
}

ただし、プログラムがロードされて実行された後、実行時に条件付きで関数を置き換えることは可能ですか?

if(some_condition)
{
    swap_impementations(exit, my_exit);
}

編集:これは、 Is it possible to swap C functions? に多少似ています。具体的には、オペレーティング システムによって読み込まれた別のライブラリからの関数の呼び出しを傍受しようとしています。

これが意味することは、たとえば、stdlib から exit() 関数をインターセプトした場合、ANYWHERE から exit() を呼び出すと、実行時に制御可能であることを除いて、上記の例と同じように、元の実装ではなく実装が呼び出されるということです。

ジャンプ命令でオリジナルを上書きして呼び出しをフックするという提案がありましたが、動的リンカーで「再リンク" プログラム開始後の関数を別の場所に指定しますか?

4

1 に答える 1