2

実行時に Mac OS プロセス内の関数の参照を、独自のカスタム dylib で定義されたカスタム関数に変更する必要があります。新しい関数シグネチャはオリジナルと同じままにしました。たとえば、「open」関数を「myopen」関数に変更する必要があります。

動的シンボル テーブルと文字列テーブルを取得するために、__LINKEDIT セグメントを処理してみました。次のポインターを使用しました。1. __LINKEDIT セグメントからの VMAddrress、2. 「_dyld_register_func_for_add_image」コールバックからの mach_header および vaddr_slide、3. symtab_command からの symoff および stroff。

しかし、__LINKEDIT セグメントに記載されているシンボル テーブルと文字列テーブルを取得できません。誰かがこれに光を当てることができますか? 前もって感謝します。

4

1 に答える 1

1

問題の関数がライブラリ関数であり、実行可能ファイルに静的にコンパイルされていない場合は、それを行う必要はありません。代わりに、関数の挿入を使用できます。具体的には、これをライブラリに追加します。

  // The attribute creates a Mach-O Section in your library - q.v. libgmalloc.dylib for 
  // a nice example
    static const interpose_t interposing_functions[] \
        __attribute__ ((section("__DATA, __interpose"))) = {
            { (void *)my_open,  (void *)open  },
            { (void *)my_close, (void *)close }, // .. etc
        };


int  my_open(const char *path, int flags, mode_t mode)
{

    int rc;
    // Prolog - do something before open

    rc = open(path, flags, mode); // call real open

    // Epilog - record rc, etc..    

    return rc;
}

サンプルを提供できる OS X の内部に関する優れた本がいくつかありますが、どうやら SO サイト ポリシーに従って、それらにリンクすることはできません。とはいえ、上記のコード スニペットは機能するはずです。これは、他の dylib によって実行される open の呼び出しでは機能しないことに注意してください (ただし、それを取得するためのより複雑な方法もあります)。

于 2012-11-15T04:31:29.620 に答える