2011-11-11 82 views
2

我需要掛鉤,嘗試以產生「時間獨立」重放針對不同的應用來檢索系統時間的任何功能。一些像僞隨機數生成這樣的事件依賴於對time()的調用,但是例如其他一些調用timeGetTime()或_time64()。是否有可能鉤到任何時間檢索功能

什麼是我需要掛鉤(在Windows中)捕獲所有時間檢索功能的最小函數集。它實際上可能鉤住這些功能嗎?我試圖按時(),但我的鉤子被忽略。我已經成功掛鉤其他功能(如蘭德),但我的時間()鉤子似乎被忽略。

我使用Detours,但我打開使用任何其他API攔截工具。

+0

爲什麼你不只是要複製一個特定的模擬每次經過相同的種子的PRNG? –

+0

我正試圖在應用程序中執行此操作,但我無法訪問源代碼 – cloudraven

回答

2

對於遊戲 'speedhacks',3層的API通常是鉤是:

大多數函數返回的時間,因爲系統開始或類似的東西。在你的鉤子裏,你需要決定你想要做什麼。你可以:

  1. 總是返回一個靜態時間
  2. 做「放緩」或「加快」時常用的方法:
    • 當你的DLL注入,需要一個初始時間(比方說init_time
    • 每次目標調用你的時間功能,可以調用它可以讓你的真正功能的trampolined版本real_time
    • 你回來會是這樣的init_time + 0.5*(real_time-init_time)這將慢下來的時間價值半例如
0

您可能想掛鉤時間系統調用。呃,我不知道我爲什麼甚至暗示。但kernel32.dll中的逆向工程GetSystemTime將詳細說明如何進行系統調用。

0

的最少的一組要勾(最好)內核API是NtQuerySystemTimeNtGetTickCount。建議使用內核掛鉤,因爲有太多的用戶空間apis掛鉤,你永遠不知道應用程序是否使用這兩個函數直接訪問時間數據。

當然,您應該通過調用PsGetCurrentProcess()並將*(eprocess->UniqueProcessID)與目標進程ID進行比較來過濾該進程。

相關問題