好的,假设我的应用程序正在将(x86)指令写入内存,使页面可执行等。是否有一种方法可以修改未JITted方法的方法存根,以指向我发出的指令流?
例如:
假设我在内存中创建了一个x86指令流,它执行任意操作。现在,进一步假设我有一个方法'int Target()'。我还没有调用它,因此它尚未编译。是否有一种方法:
- 获取Target存根的指针
- 使其指向我发出的指令流。
我知道.NET的几乎所有安全功能都是设计用来防止这种劫持的。但是通过托管API是否可能呢?
好的,假设我的应用程序正在将(x86)指令写入内存,使页面可执行等。是否有一种方法可以修改未JITted方法的方法存根,以指向我发出的指令流?
例如:
假设我在内存中创建了一个x86指令流,它执行任意操作。现在,进一步假设我有一个方法'int Target()'。我还没有调用它,因此它尚未编译。是否有一种方法:
我知道.NET的几乎所有安全功能都是设计用来防止这种劫持的。但是通过托管API是否可能呢?
没问题,你可以做到!
钩取mscorjit的getJit方法。每次有方法需要jitting时都会询问您,您可以传递任何想要的内容。
一些.NET保护程序就是这样工作的。
我不会尝试直接操作内存,而且我也不确定这是否可能。相反,您可以使用分析器 API - 有一些示例可供参考,但没有真正的文档。
请查看 MSDN 杂志文章 - .NET Framework 分析 API:动态重写 MSIL 代码。