mission impossible - GetTickCountを乗っ取れ!

用意した武器はMicrosoft Visual C++ Toolkit 2003。
ターゲットはtest.exe。(↓)

#include 
#include 

int main()
{
  for(;;){
    std::cout << GetTickCount() << std::endl;
  }
  return 0;
}

GetTickCountを以下のようにせよ!

unsigned d_GetTickCount() 
{ 
  return p_GetTickCount() / 2;
}

まずは普通に(!?)kernel32.dllのダミーを作る。
…だめ。

Side-By-Sideを有効にする。test.exe.local作成。
…フリーズ。

偽kernel32.dllを_ernel32.dllにリネームして、test.exe中の文字列を置換。
…OK, Mr.X.

本物のkernel32.dllをkernel__.dllとでもリネームして、偽はそれをLoadLibrary。
…Mr.X、だめだ。本物がバインドされてしまう。

なんてことだ!Jesus Christ!
偽kernel32.dllがLoadLibraryを使うためには、本物が既にバインド済みじゃないとだめじゃないか!
偽kernel32.dllのインポートテーブルを置換だ!

…だめだ。どうなってるんだ。
メモリ内には確かに偽kernel32.dllとkernel__.dllが生きて動いている。
しかし、それでも本物がバインドされてしまうんだ!

Give up! 日が昇った!Mr.X, Time Upだ。
結局これは、OSがハック防止でもしてるんでしょうか?