是否可以欺骗.NET JIT编译器以运行其他方法?

问题描述 投票:7回答:5

[好,说我的应用程序正在向内存中发送(x86)指令,使页面可执行,等等。有没有办法改变未JITted方法的方法存根以指向我发出的指令流?

E.g:

假设我在内存中创建了一个x86指令流,它执行任意操作。现在,进一步假设我有一个方法'int Target()'。我还没有调用它,所以还没有被编译。有没有办法:

  1. 获取指向目标的存根的指针
  2. 使其指向我发出的指令流。

我意识到,实际上.NET的每个安全功能都旨在像这样[劫持。但是是否可以通过托管API来实现?

.net security clr jit dynamic-execution
5个回答
6
投票
是,您可以做到!

挂钩mscorjit的getJit方法。每次都会询问您是否有任何方法需要调整。您可以传递任何想要的信息。


10
投票
这可以通过分析API。我从未使用过它,但是它在TypeMock中用于类似目的。

2
投票
正如您所说,这并不容易,甚至可能不可能。如果我没记错的话,代码将包含尚未编译的方法的JIT编译器的地址。因此,当您尝试调用此方法时,JIT编译器将完成其工作,并将地址插入到新编译的方法中。如果可以更改此地址,则可以插入对自己的代码的调用。你怎么做这个未被发现的事超出了我。我当然希望CLR能够发现这种篡改。

0
投票
除了能够使用ICorProfiler并在启动之前重写方法外,还可以使用ICorDebug(MDBG已管理接口)。设置一个断点,当该断点命中时,将下一条语句设置为您的拦截代码。所有这些过程都可以通过代码完成,但确实具有侵入性,您将需要一个“观察程序”过程来协调此过程。

0
投票
我不会尝试直接弄乱内存,而且我不确定是否有可能改为使用Profiler API-那里有一些示例,但没有真正的文档。看看MSDN杂志上的文章-Rewrite MSIL Code on the Fly with the .NET Framework Profiling API
© www.soinside.com 2019 - 2024. All rights reserved.