2010-11-26 8 views
0

私のプログラムがメモリアドレスから値を読み込み、そのアドレスの値に基づいていくつかの作業をすることを望んでいます。私はそれが現在行われている方法は、私は、アドレスを読み取り、値で作業を行う、50ミリ秒ごとにタイマーで実行されたメソッドを持っているということです。私はおそらく、アドレスにフックしてタイマーを必要としないか、更新されたときに少なくともatleastアドレスを読み取ることができる方法はありますか?リアルタイムでメモリ値を読み取ることは可能ですか?

+0

プロパティですか、それとも純粋なメモリですか? (おそらくネイティブコードで書かれている)。セッターがある場合は、セッターでイベントを呼び出すことができます。 – CodesInChaos

+0

純粋なメモリです。これは、Firefoxがプラグイン用に使用するプラグインコンテナの値です。 – PuppyKevin

答えて

1

古い引っ張り/押し込みの問題(同じ概念に基づいて作成された割り込み)。 Firefoxが仮想メモリに書き込むときは、OSレベルのAPIフックが必要です。この技術は、ゲームの不正行為に使用されます。 NtWriteVirtualMemoryは、グローバルフックを必要としないので、フックするのに適しています(Firefoxを見てください)。通常、メモリ書き込みに対するグローバルフックは、DLL注入(メモリパッチに対する弱い防御)を検出するために使用されます。 Here APIフックに関する神の記事を見つけることができます。

1

もちろん、オブザーバーパターンsee hereを使用することができます。 オブザーバーは、値が変更されるとすぐに何らかの作業を実行します。

+0

C#では、イベントは基本的にオブザーバーパターンの言語統合バージョンです。クラシックに設計された「オブザーバー」を動かす代わりに、組み込みの言語機能を使用することをお勧めします。 –

+0

私はfamillirarでC#ではありませんが、このアプリケーション全体の目的に応じて、それが単なるおもちゃプロジェクトの場合は手作業で実装するのが楽しいかもしれません。 – benzen

2

どのようにデータがメモリアドレスに書き込まれているかによって異なります。これがあなたのプログラムが書いているデータであれば、メソッドやプロパティ(とにかく良いアイデアです)でそのメモリへのアクセスを簡単にラップすることができ、それが変更されたときにイベントを発生させることができます。

値をポーリングする代わりに、イベントにサブスクライブするだけで済みます。

+0

私のプログラムが書いていないメモリはどうでしょうか? – PuppyKevin

+0

@PuppyKevin:あなたが今やっているようにポーリングが必要になるでしょう.... –

0

OSには、関心のある変数が存在する仮想メモリページへの書き込みに直ちにトラップできるデバッガフックがあります。

関連する問題