0

System.Randomクラスを使用するソフトウェアを監視したいと考えています。
できるようにしたい:

1/ すべての Random インスタンスの作成を監視する
2/ このインスタンスで使用されるシードを強制する、
または 2bis/ ランダムの結果を自分のランダムに強制する

ソフトウェアが異なるコンピューター上でも常に同じように動作する必要があるため、それと通信する独自​​のソフトウェアをより適切にテストできます。

EasyHook のチュートリアルを読みましたが、クラスの作成やクラス メソッドのフックではなく、関数のフックについてのみ言及していると思います。

4

2 に答える 2

4

.NET フレームワークには、メソッド呼び出しをフックする適切なメカニズムがありません。ジャストインタイム コンパイラと ngen.exe prejitter により、これを実装できなくなります。これは間接的なジャンプなしで行われるため、メソッドのアドレスを取得する良い方法も、コードにパッチを適用する適切な方法もありません。たとえば、EasyHook などのフッカーが依存する DLL インポート テーブルに存在するジャンプの種類。

ジッターがコードを見る前に、これをいじる必要があります。また、PostSharp などのアスペクト指向プログラミング ツールが行う方法でもあります。彼らは IL リライターであり、コードを実行する前にアセンブリを変更します。したがって、スキームは、IL の System.Random への呼び出しをメソッドへの呼び出しに置き換えることです。そして、アセンブリに依存関係を追加します。

「IL 書き換え」は、実装を見つけるのに適した Google 検索用語です。

于 2012-04-29T15:04:26.273 に答える
0

ここでは「IL 書き換え」が最適なオプションのようですが、kernel32 でGetTickCount()を呼び出している場合は、デフォルトのインスタンス作成を検出して変更できる可能性があります。

public Random() : this(Environment.TickCount)
{
}

Environment.TickCount が実際にGetTickCount()を呼び出すかどうかはよくわかりません。しかし、それはもっともらしいです。

于 2012-04-29T15:34:04.960 に答える