2011-11-11 3 views
2

さまざまなアプリケーションに対して「時間に依存しない」リプレイを生成するためにシステム時間を取得しようとする関数をフックする必要があります。擬似乱数生成のようないくつかのイベントは、time()への呼び出しに依存しますが、たとえば他のいくつかのものはtimeGetTime()または_time64()を呼び出します。いつでも関数を取得することが可能です

すべての時間取得関数をキャッチするためにフックする必要がある関数の最小セットは何ですか?これらの関数を実際にフックすることは可能ですか?私は時間にそれをやろうとしているが、私のフックは無視されている。私は他の関数(randのようなもの)にフックして成功しましたが、私のtime()フックは無視されるようです。

私はDetoursを使用していますが、他のAPI傍受ツールを使用しています。

+0

なぜあなただ​​けのPRNGにあなたが特定のシミュレーションを再現したい毎回同じシードを渡さないのですか? –

+0

私はソースにアクセスできないアプリケーションでこれを実行しようとしています – cloudraven

答えて

2

、通常フックされ3つのAPIは以下のとおりです。

これらの関数のほとんどは、システムからの経過時間を返します開始したか、それと似たようなあなたのフックで、あなたは何をしたいかを決める必要があります。あなたはできます(たとえばinit_timeあなたのDLLが注入されると、

  • 初期時間がかかる:

    1. は、必ず「減速」や時間を「スピードアップ」の一般的なアプローチを行います
    2. 静的な時間を返します)
    3. たびターゲットはあなたの時間関数を呼び出して、あなたが返す値は、時間を遅くなりinit_time + 0.5*(real_time-init_time)ようなものになるだろうあなたにreal_time
    4. を取得し、実際の機能のtrampolinedバージョンを呼び出すことができます例えば半分
0

システムコールの時刻をフックしたいと思うかもしれません。うん、私はなぜ私がだとわからない場合でも、を示唆している。しかし、kernel32.dll内のリバースエンジニアリングGetSystemTimeは、そのシステムコールがどのように行われるかを詳しく説明します。

0

フックしたい(できれば)カーネルAPIの最小セットは、NtQuerySystemTimeNtGetTickCountです。フックするにはユーザランドAPIが余りにも多く、アプリケーションがこれらの2つの関数を使用して時刻データに直接アクセスしているかどうかはわからないので、カーネルフックが推奨されます。

もちろん、PsGetCurrentProcess()を呼び出して*(eprocess->UniqueProcessID)とターゲットプロセスIDを比較することで、プロセスを除外する必要があります。ゲーム 'speedhacks' の

関連する問題