コールバック関数をフックできませんか?

私は自分のコードにいくつかの関数をフックしていましたが、今日までかなりコードが働いていて、コールバック関数のためにバグを見つけました。

まあ言ってみれば..

私が好きなことをすれば

puts("Hi!\n");

よく働く。私はこれをフックすることができます。

しかし、もし私がこれをすれば...

typeof(puts) *fptr = puts;
fptr("Hi \n");

フックが機能しない?

私はフックをするためにOSXのenvと記号を検索しています。 誰かが私にコールバック関数と何が間違っていることを示唆することができ、私はアルゴリズムをフックするためにフックする必要がありますか?

編集:いくつかの意見を提供することができます誰かが次の情報を持っている場合、私はいくつかのより多くのデバッグを行いました。

私はこれが問題の原因になると思いますか?

bool Hook(const char *name, void *impl) {
    ...   
    void **EntryInAdressTable = find(name);
    if(EntryInAdressTable) {
        *EntryInAdressTable = impl;
    }
}
 ...
}

そこで、ここでは、実装の対応するシンボルのアドレステーブルのエントリを変更し、自分の実装では元の関数を呼び出します。

だから、私の推測は、コールバック関数を使うと、アドレステーブルを経由せずに関数のアドレスを直接参照し、フックされたメソッドが呼び出されない理由を意味します。

私はこの1つの権利ですか?いずれにしても私には何か回避策がありますか?

3
私はあなたが用語フックを誤解していると思います。フックとは通常、通常の通話を傍受して自分のものと置き換えることを意味します。
追加された 著者 JosephH,
私はあなたがtypofでなくtypeofをしたいと思う。これをお読みください。 stackoverflow.com/questions/4295432/typedef-function-pointer
追加された 著者 madmik3,
まあ、実際には、私の質問はフックについてですので、私はまた、C + +のソリューションを使用することができると思った。
追加された 著者 MacGeek,
ここでフックすると、私は実際に私の機能が実際に実行されることを望みます。
追加された 著者 MacGeek,
私は_dyld_get_image_headerで得られたシンボルを探して、この場合は_putsという文字列を探します。
追加された 著者 MacGeek,
私はtypedefを知っている。 typeofはコールバック関数を取得するための簡単な方法です。
追加された 著者 MacGeek,
私は私の調査結果を更新しました。感想を聞かせてください。
追加された 著者 MacGeek,
どのようなメカニズムを使用して関数を "フック"していますか?
追加された 著者 Nemo,
どのような環境でフック?
追加された 著者 Oliver Charlesworth,
@Mac:フックは文脈に応じていくつでも意味があります。
追加された 著者 Oliver Charlesworth,
typeof はC ++でですか? 0_o、C#コードのように見える
追加された 著者 Mr.Anubis,
@ Mr.Anubis typeofは、CおよびC ++のGCC拡張です。
追加された 著者 user142019,

2 答え

シンボルテーブルを調べて関数アドレスを置き換えると、シンボルエントリに対応する関数は、シンボルテーブルのシンボルエントリを使って関数呼び出しを行う限り機能します。関数のアドレスを直接使用すると(コールバック関数)、動作しません。

0
追加された

LD_PRELOAD を使用して関数をフックすると仮定すると、 puts へのポインタを取ると、ポインタはおそらくリンク時にリンカが知っているバージョンにバインドされます標準ライブラリであり、プリロードされたライブラリが存在するときにはオーバーライドされません。私はこれを回避する方法は考えられません。

0
追加された
私はputsへのポインタを取ることはありません。私はシンボル "_puts"を取る。それから私はコマンドを探し、この文字列が存在するかどうかを調べます。
追加された 著者 MacGeek,
私は私の調査結果を更新しました。あなたの考えを教えてください
追加された 著者 MacGeek,