我想监控使用System.Random
类的软件。
我希望能够:
1 /监视所有随机实例的创建
2 /强制这个实例使用的种子
或2bis /强制随机的结果到我自己的随机
我需要软件始终表现相同,即使在不同的计算机上也是如此,因此我可以更好地测试自己与之通信的软件。
我已阅读过EasyHook的教程,但我认为他们只提到了函数挂钩,而不是类创建或类方法挂钩。
答案 0 :(得分:4)
.NET框架没有提供挂钩方法调用的好机制。即时编译器以及ngen.exe prejitter使这无法实现。没有好的方法来获取方法的地址,也没有任何合适的方法来修补代码,因为这是在没有任何间接跳转的情况下完成的。例如,DLL导入表中存在的类似于EasyHook的跳转类型依赖于它。
这需要在之前与混淆抖动看到代码。像PostSharp这样的面向方面编程工具也可以这样做。它们是IL重写器,它们在运行代码之前修改程序集。因此,该方案是通过调用您的方法来替换IL中对System.Random的调用。并在程序集上添加依赖项。
“IL重写”是一个很好的谷歌搜索术语,用于查找实现。
答案 1 :(得分:0)
“IL重写”似乎是您最好的选择,但如果它在kernel32中调用GetTickCount(),则可以检测并更改默认实例创建:
public Random() : this(Environment.TickCount)
{
}
我真的不知道Environment.TickCount是否实际调用了GetTickCount()。但它是plausible。