3年後、私は自分自身の質問に答えるのに十分な知識を持っていると思います. :)
通常、コンピュータ プログラムは、システム コールと呼ばれる定義済みの関数を使用してカーネルと通信します。OS ごとに異なる呼び出しのセットがありますが、多くの場合、メモリの割り当て、ファイルの読み取りと書き込み、プロセスの処理など、似たようなことを行います。このページによると、Windows NT カーネルには約 480 以上のシステム コールがあります。
ハードウェアを扱うあらゆる目的のために、プログラムは通常システムコールに頼ります。これは、OS が最も得意とすることであり、これらの 1 つがたまたま時間を知るためです。多くの場合、コンピューター ゲームは 60 フレーム/秒でレンダリングする必要があり、これを実現するには、レンダリング関数を16.6msごとに呼び出す必要があります。Windows では、「GetTickCount() 」が通常これに使用され、Windows が起動してから経過したミリ秒数を返します (「最後のティック カウントから経過したミリ秒数が16msを超えていない場合は、新しいフレームをレンダリングするか、続行します。」 )。
SpeedHacking は、一般に、実行中のプロセスにコードを挿入し、タイミング関数をハッキングして、プログラムの実行速度を変更するために高速化/低速化された「ティック」を返すことによって機能します。
ただし、CE がこれをどのように正確に達成したかはわかりません (ソース コードを理解するのは非常に困難です) が、別のプログラマーがLinuxで同様のこと (ビデオ) を実行しました。ソース コードでは、著者が Linux 用の同様のシステム コール (" gettimeofday() ") をこのためにどのように変更したかを確認できます。
go gettimeofday_orig;
int val;
gettimeofday_orig=(go)dlsym(RTLD_NEXT,"gettimeofday");
if (!timezero)
{
timezero = new timeval;
val = gettimeofday_orig(timezero,tz);
(*tv) = (*timezero);
return val;
}
それがどのように検出されるかはわかりませんが、ゲームはおそらくDLLが注入されていることを発見するという@Haroldの考えに沿っています。