11

実行時に (いいえ)、 Linux のLD_PRELOADように C 関数をインターセプト/フックするにはどうすればよいですか? fopen()これを Python から実行したいと思います (したがって、プログラムは既に CPython VM を実行していると想定しています)。また、Python コードに再ルーティングします。共有ライブラリ関数をフックするだけで問題ありません。また、プログラムの実行方法を変更せずにこれを行いたいと思います。

1 つのアイデアは、に基づいて独自のツールを作成するか、PLTptrace()と一緒にまたは PLT で見つかったコードを書き換えて、生成された C 呼び出し可能な関数dlsym()をターゲットctypesにすることですが、最初にここで質問すると思いました。ありがとう。

4

2 に答える 2

2

google-perftools には、 src/windows/preamble_patcher*の下に Detour の独自の実装があります。これは現時点では Windows のみですが、win32 関数を使用してシンボル アドレスを検索するという事実を除いて、どの x86 マシンでも動作しない理由はわかりません。

コードを簡単にスキャンすると、これらの win32 関数が使用されていることがわかります。これらにはすべて Linux バージョンがあります。

  • GetModuleHandle/GetProcAddress : 関数アドレスを取得します。dlsym はこれを行うことができます。
  • VirtualProtect : アセンブリの変更を許可します。保護します。
  • GetCurrentProcess: getpid
  • FlushInstructionCache (コメントによると明らかに nop)

これをコンパイルして Python にリンクするのはそれほど難しくないように思えますが、perftools の開発者にメッセージを送って、彼らの考えを見てみたいと思います。

于 2011-02-12T01:06:24.103 に答える
2

ltrace 開発者の 1 人から、これを行う方法を見つけることができます。動的にロードされたライブラリをキャッチするための完全なパッチが含まれているこの投稿を参照してください。Python から呼び出すには、おそらく C モジュールを作成する必要があります。

于 2012-01-24T13:51:47.667 に答える