有没有办法欺骗.NET JIT编译器运行另一个方法?

有没有办法欺骗.NET JIT编译器运行另一个方法?,.net,security,clr,jit,dynamic-execution,.net,Security,Clr,Jit,Dynamic Execution,好的,假设我的应用程序正在向内存中发出(x86)指令,使页面可执行,等等。有没有办法改变一个非JITted方法的方法存根以指向我发出的指令流 例如: 假设我在内存中创建了一个x86指令流,它可以执行任意操作。现在,进一步假设我有一个“int Target()”方法。我还没有调用它,所以它还没有被编译。有没有办法: 获取指向目标存根的指针 让它指向我发出的指令流 我意识到,实际上.NET的每一个安全功能都是为了防止像这样的劫持而设计的。但是,是否可以通过托管API实现呢?这可以通过分析API实现。

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

例如:

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

  • 获取指向目标存根的指针
  • 让它指向我发出的指令流

  • 我意识到,实际上.NET的每一个安全功能都是为了防止像这样的劫持而设计的。但是,是否可以通过托管API实现呢?

    这可以通过分析API实现。我从未使用过它,但它在TypeMock中也有类似的用途

    编辑:我认为MSDN博客上有一篇不错的帖子,我会去寻找的


    编辑2:Doh

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


    我认为在这种情况下(正如Leppie所建议的那样),分析API对您没有帮助,因为您没有试图修改MSIL。如果您不这么认为,它可能会有用,因为它描述了实现TypeMock所做的工作必须做的事情

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


    另一件值得一看的事情是,如果应用属性,该项目将为您提供入口和出口方法

    我不会试图直接破坏内存,我甚至不确定你是否可以使用profiler API——虽然有一些示例,但没有真正的文档。 看看MSDN杂志的文章-

    是的,你可以做到

    钩住mscorjit的getJit方法。每次你都会被问到是否有任何方法需要jitting。你想通过什么就通过什么


    有些.NET保护器是这样工作的。

    我记得它在某处有“IL重写”功能。是的。我正要这么说。看起来只有白细胞。