C# 胡克:系统,随机

C# 胡克:系统,随机,c#,random,hook,random-seed,C#,Random,Hook,Random Seed,我想监控一个使用System.Random类的软件 我希望能够: 1/监视所有随机实例的创建 2/强制此实例使用种子 或2bis/将随机结果强制为我自己的随机结果 我需要软件始终保持相同的行为,即使在不同的计算机上,这样我就可以更好地测试自己与之通信的软件 我读过EasyHook的教程,但我认为它们只提到函数挂钩,而没有提到类创建或类方法挂钩。NET framework没有提供挂钩方法调用的好机制。即时编译器以及ngen.exe prejitter使这一点无法实现。没有很好的方法来获取方法的地址

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

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

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


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

NET framework没有提供挂钩方法调用的好机制。即时编译器以及ngen.exe prejitter使这一点无法实现。没有很好的方法来获取方法的地址,也没有合适的方法来修补代码,因为这是在没有任何间接跳转的情况下完成的。例如,像EasyHook这样的钩子依赖的DLL导入表中存在的跳转类型

这需要在抖动看到代码之前处理。还有像PostSharp这样的面向方面编程工具的实现方式。它们是IL重写器,它们在运行代码之前修改程序集。因此,方案是用对方法的调用替换IL中对System.Random的调用。并在程序集上添加依赖项


“IL重写”是一个很好的google搜索术语,用于查找实现。

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

这需要在抖动看到代码之前处理。还有像PostSharp这样的面向方面编程工具的实现方式。它们是IL重写器,它们在运行代码之前修改程序集。因此,方案是用对方法的调用替换IL中对System.Random的调用。并在程序集上添加依赖项

“IL重写”是一个很好的google搜索词,用于查找实现。

此处“IL重写”似乎是您的最佳选择,但如果调用内核32,则可能会检测并更改默认实例创建:

public Random() : this(Environment.TickCount)
{
}
我真的不知道Environment.TickCount是否真的调用了。但是确实如此。

在这里,“IL重写”似乎是您的最佳选择,不过如果它调用内核32,则可能会检测并更改默认实例创建:

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

我真的不知道Environment.TickCount是否真的调用了。但事实确实如此。

我知道我会后悔问“但为什么你想‘钩住’系统。随机类?”从未见过或听说有人想这么做……你是否试图通过劫持随机数的创建来玩某个软件?我知道我会后悔问“但为什么你想‘钩住’系统。随机类?”从未见过或听说过有人想这么做……你是不是想通过劫持随机数的创建来玩某个软件?