0

我想监控一个使用System.Random该类的软件。
我希望能够:

1/ 监控所有随机实例的创建
2/ 强制此实例使用的种子
或 2bis/ 将随机结果强制为我自己的随机

我需要软件始终保持相同的行为,即使在不同的计算机上也是如此,这样我就可以更好地测试与它通信的自己的软件。

我读过 EasyHook 的教程,但我认为他们只提到函数挂钩,而不是类创建或类方法挂钩。

4

2 回答 2

4

.NET 框架没有提供挂钩方法调用的良好机制。即时编译器以及 ngen.exe 预抖动使这无法实现。没有很好的方法来获取方法的地址,也没有任何体面的方法来修补代码,因为这是在没有任何间接跳转的情况下完成的。例如,像 EasyHook 这样的钩子所依赖的 DLL 导入表中存在的那种跳转。

这需要在抖动看到代码之前弄乱。PostSharp等面向方面的编程工具也是这样做的。它们是 IL 重写器,它们会在您运行代码之前修改程序集。因此,该方案是用调用您的方法替换 IL 中对 System.Random 的调用。并添加对您的程序集的依赖项。

“IL 重写”是一个很好的谷歌搜索词来查找实现。

于 2012-04-29T15:04:26.273 回答
0

“IL 重写”似乎是您最好的选择,但如果它在 kernel32 中调用GetTickCount() ,则可以检测和更改默认实例创建:

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

我真的不知道 Environment.TickCount 是否真的调用GetTickCount()。但这是有道理的。

于 2012-04-29T15:34:04.960 回答