2

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

関数を常に取得するために(Windowsで)フックする必要がある関数の最小セットは何ですか。これらの関数を実際にフックすることは可能ですか?time()で実行しようとしていますが、フックが無視されています。他の関数(randなど)へのフックに成功しましたが、time()フックは無視されているようです。

Detoursを使用していますが、他のAPIインターセプトツールを使用できます。

4

3 に答える 3

2

ゲーム「スピードハック」の場合、通常フックされる 3 つの API は次のとおりです。

これらの関数のほとんどは、システムが起動してからの時間を返します。フックでは、何をしたいかを決める必要があります。あなたは出来る:

  1. 常に静的な時間を返す
  2. 「スローダウン」または「スピードアップ」時間の一般的なアプローチを実行します。
    • DLL がインジェクトされると、最初の時間がかかります (たとえばinit_time)
    • ターゲットが時間関数を呼び出すたびに、実際の関数のトランポリン バージョンを呼び出すことができます。real_time
    • init_time + 0.5*(real_time-init_time)返される値は、たとえば時間を半分に遅くするようなものになります
于 2011-11-11T11:17:21.273 に答える
0

おそらく、タイムシステムコールをフックしたいと思うでしょう。うーん、なぜ私がそれを提案しているのか分かりません。ただし、kernel32.dllのリバースエンジニアリングGetSystemTimeでは、そのシステムコールがどのように行われるかを詳しく説明します。

于 2011-11-11T05:34:12.070 に答える
0

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

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

于 2011-11-11T05:42:39.777 に答える