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がハック防止でもしてるんでしょうか?