好的,假设我的应用程序正在将(x86)指令发送到内存中,使页面可执行等。有没有办法改变非 JIT 方法的方法存根以指向我发出的指令流?
例如:
假设我在内存中创建了一个 x86 指令流,它可以做一些任意的事情。现在,进一步假设我有一个方法'int Target()'。我还没有调用它,所以它还没有编译。有没有办法:
- 获取指向 Target 存根的指针
- 让它指向我发出的指令流。
我意识到.NET 的几乎每一个安全特性都是为了防止这样的劫持而设计的。但是可以通过托管 API 来实现吗?
好的,假设我的应用程序正在将(x86)指令发送到内存中,使页面可执行等。有没有办法改变非 JIT 方法的方法存根以指向我发出的指令流?
例如:
假设我在内存中创建了一个 x86 指令流,它可以做一些任意的事情。现在,进一步假设我有一个方法'int Target()'。我还没有调用它,所以它还没有编译。有没有办法:
我意识到.NET 的几乎每一个安全特性都是为了防止这样的劫持而设计的。但是可以通过托管 API 来实现吗?
是的,你可以做到!
钩住 mscorjit 的 getJit 方法。并且每次都会询问您是否有任何方法需要jitting。你可以通过任何你想要的。
一些 .NET 保护程序就是这样工作的。
正如你所说,这并不容易,甚至不可能。如果我没记错的话,代码将包含一个方法的 JIT 编译器的地址,该方法尚未编译。因此,当您尝试调用此方法时,JIT 编译器将完成其工作并将地址插入新编译的方法。如果您可以更改此地址,则可以插入对您自己的代码的调用。你如何在不被发现的情况下做到这一点超出了我的范围。我当然希望 CLR 能够检测到这种篡改。
在这种情况下,我认为 Profiling API 不会对您有所帮助(正如 Leppie 所建议的那样),因为您没有尝试修改 MSIL。如果您不这么认为,这篇文章可能会有所帮助,因为它描述了实现 TypeMock 所做的事情必须做的事情。
我不会尝试直接弄乱内存,我什至不确定它是否可能,而是您可以使用分析器 API - 那里有一些示例,但没有真正的文档。查看 MSDN 杂志文章 - Rewrite MSIL Code on the Fly with the .NET Framework Profiling API