2012-02-17 7 views
1

私はLD_PRELOADのプログラムに共有ライブラリを挿入するプロジェクトを進めています。スレッドをLD_PRELOADとスレッドセーフで注入する

注入されたライブラリは、プログラムに注入されたときに新しいスレッドを作成します。すべてのロジックはこのスレッドで発生します(ネットワークトラフィックの分析など)。

まず、プリロードされているプログラムについてこれを知る必要があります。静的バッファに書き込まれたすべてのパケットを暗号化してサーバーに送信するクライアントアプリケーションです。私はクライアントでパケットを暗号化して送信する機能を発見し、それを迂回することができました。だから私はちょうど静的なバッファを変更し、 '送信'機能は、バッファを暗号化し、サーバーにバッファを送信させることができます。

enter image description here

しかし、今、私は問題を抱えている:私は私のライブラリのスレッドに静的バッファの内容を変更した場合(私は偽のパケットを送信できるように)、同時に、プログラムのスレッドが静的に変更バッファーも?それはクラッシュを引き起こすでしょう。

私はある種の同期が必要です。

だから私はいくつかの解決策を考えてきた:

  1. は、バッファを変更するプログラム内のすべての機能を探し、それらを迂回し、その呼び出しまたはそのような何かにミューテックスを追加します。しかし、年齢のようにかかるだろう...
  2. コードを実行する方法を見つけると、それは1ブロック内でバッファを変更します。つまり、私のコードはPOSIXスレッドを他のスレッドに切り替えることなく、実際に一度に実行されます。これも可能ですか?
  3. 私のアプリケーションを同期させて泣かせてください。

誰かがより良い解決策を考え出すことができますか?それとも、ソリューション2を実現する方法を知っていますか?あなたが「送信」機能を迂回して、あなたのプリロード図書館であなたの「迂回送信」のコードがある場合、それは時にメインスレッドの呼び出し「送信」ことを意味し、事前に

おかげで、 ギリス

+0

注入されたスレッドとメインスレッドの両方が送信機能を呼び出していますか? –

+0

はい。彼らは同時にそれを呼び出すことができるかもしれません。彼らは完全に独立したスレッドです。また、メインスレッドがパケットを作成し(バッファに書き込む)、同時に注入されたスレッドがパケットを構成することもあります。 –

答えて

1

、あなた'detoured send'コードがメインスレッドのコンテキストにあるで実行されると、スレッドはその時点で何もしていません。潜在的に 'send'を呼び出すことができる複数の 'メインスレッド'がある場合は、あなたの 'detoured send'で同期が必要です。

また、それはあなたが本当にあなたができるあなたの新しい「注入された」スレッドで何か処理したい:メインスレッドのコンテキストから呼び出されたあなたの「迂回送信」()で 1):あなたのスレッド にデータを渡すと、それまでは待ちますデータの処理が終了しました(通知:メインスレッドはです)。

+0

メインスレッドが 'detoured send'を呼び出すと、実際にはメインスレッドのコンテキストによって実行されます。しかし、それは本当に問題ではありません。問題は、実際には "バッファを送信"(おそらく私の質問でそれを強調表示することを忘れていた)への書き込みにあります。私の注入されたスレッドが 'send'でパケットを送信したい場合、 'send buffer'を変更しようとしています。しかし、同時に、メインスレッドが「送信バッファ」を変更している場合はどうなりますか? 「送信バッファ」を変更するすべての関数を迂回しなければ、私はそれらをメインスレッドに入れることができないので、ロックを追加できません。 –

関連する問題