2012-04-29 37 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