2012-04-29 66 views
0

我想監視使用的System.Random類軟件。
我希望能夠:

1 /監視所有的隨機實例的創建
2 /強行通過這個實例使用的種子
或2之二/強制隨機的結果,我自己隨機
C#鉤:System.Random

我需要的軟件總是相同的行爲,甚至在不同的計算機上,這樣我就可以更好地驗證我自己的軟件與它通信。

我已閱讀EasyHook的教程,但我認爲他們只提功能掛鉤,而不是創建類或類方法掛鉤。

+0

我知道我會後悔問「但你爲什麼要'掛鉤'System.Random類?」從來沒有見過或聽說過任何人想要這樣做...... – 2012-04-29 14:39:55

+2

你是否試圖通過劫持隨機數字的創建遊戲某個軟件? – 2012-04-29 14:43:03

回答

4

的.NET框架提供沒有好的機制把方法調用。即時編譯器以及ngen.exe預先調整器使得這無法實現。沒有很好的方法來獲得方法的地址,也沒有任何體面的方法來修補代碼,因爲這是在沒有任何間接跳轉的情況下完成的。舉例來說,像EasyHook這樣的妓女在DLL導入表中存在的跳轉類型取決於例如。

這需要與抖動看到代碼前就餐。另外像PostSharp這樣的面向方面的編程工具也可以做到這一點。他們是IL重寫者,他們在運行代碼之前修改程序集。所以這個方案是通過調用你的方法來取代IL中的System.Random。並添加對你的程序集的依賴。

「IL重寫」是一個很好的谷歌搜索術語來查找實現。

0

「IL重寫」似乎這裏是您最佳的選擇,雖然可能可以檢測並修改默認實例創建,如果它在KERNEL32呼叫GetTickCount()

public Random() : this(Environment.TickCount) 
{ 
} 

我真的不知道,如果環境.TickCount實際上調用GetTickCount()。但它是plausible