如何注入.NET代码来改变函数的返回值

时间:2009-04-09 20:00:33

标签: .net code-injection

我目前正在研究如何编写可以注入另一个.NET进程并覆盖函数返回值的.NET代码。我的想法是我的代码会改变方法调用的返回值,如下所示:

Public Function DoSomething() As String

Return "Value"

End Function

我的代码将拦截对DoSomething()的调用并返回我自己的自定义字符串,而不是“Value”。

我猜我需要使用.NET Profiling API来做这类事情。有没有人有使用Profiling API的经验,如果有,你认为这段代码注入是否可行?

我不打算将它用于任何恶意的东西,我只是想在.NET中尝试一些非常低级的东西,看它是否可以完成。

干杯。 雅各

5 个答案:

答案 0 :(得分:0)

您可以使用TypeMock Isolator执行此操作。

我没有TypeMock,但基于some of their examples,我认为你可以用这样的东西来做:(首先是C#,然后我会尝试翻译成VB)

using (RecordExpectations recorder = RecorderManager.StartRecording())
{
    DoSomething();
    recorder.Return("My Own Custom String");
}

Using recorder As RecordExpectations = RecorderManager.StartRecording()
    DoSomething
    recorder.Return("My Own Custom String")
End Using

看起来TypeMock对于开源项目是免费的,否则它需要花钱。但他们已经为您编写了Profiling API编码,因此您可以担心解决问题,而不是编写毛茸茸的C ++。

答案 1 :(得分:0)

Detours是你如何为Win32做的。我从来没有见过Detours.NET,但他们正在做的事情会给你一个如何实现你想要做的事情的暗示。

答案 2 :(得分:0)

您可以调查消息接收器...... 这是一个高级区域,但基本上,它完全按照您要执行的操作,拦截从一个函数到另一个函数的调用,并在拦截期间执行您自己的代码...消息接收器可以链接在一起,并且可以写为发送消息接收器,在呼叫启动时进行处理,或者作为接收接收器,在另一端进行处理

这是more detailed explanation

答案 3 :(得分:0)

PostSharp可以做到这一点,但不是在运行时,它会在最初编写代码后修改代码。

答案 4 :(得分:0)

Typemock Isolator附带的CThru项目可以为您提供这种功能 该项目是一个开源项目,但它使用Typemock Isolator 它将允许您注册回调方法并在运行时更改其行为 它不仅限于运行单元测试 有一点需要注意的是,一旦你使用它,你将获得性能提升。