[好,说我的应用程序正在向内存中发送(x86)指令,使页面可执行,等等。有没有办法改变未JITted方法的方法存根以指向我发出的指令流?
E.g:
假设我在内存中创建了一个x86指令流,它执行任意操作。现在,进一步假设我有一个方法'int Target()'。我还没有调用它,所以还没有被编译。有没有办法:
- 获取指向目标的存根的指针
- 使其指向我发出的指令流。
我意识到,实际上.NET的每个安全功能都旨在像这样[劫持。但是是否可以通过托管API来实现?
是,您可以做到!
挂钩mscorjit的getJit方法。每次都会询问您是否有任何方法需要调整。您可以传递任何想要的信息。
这可以通过分析API。我从未使用过它,但是它在TypeMock中用于类似目的。
正如您所说,这并不容易,甚至可能不可能。如果我没记错的话,代码将包含尚未编译的方法的JIT编译器的地址。因此,当您尝试调用此方法时,JIT编译器将完成其工作,并将地址插入到新编译的方法中。如果可以更改此地址,则可以插入对自己的代码的调用。你怎么做这个未被发现的事超出了我。我当然希望CLR能够发现这种篡改。
除了能够使用ICorProfiler并在启动之前重写方法外,还可以使用
ICorDebug(MDBG已管理接口)。设置一个断点,当该断点命中时,将下一条语句设置为您的拦截代码。所有这些过程都可以通过代码完成,但确实具有侵入性,您将需要一个“观察程序”过程来协调此过程。