Dot-Net
有沒有辦法欺騙 .NET JIT 編譯器執行另一種方法?
好的,假設我的應用程序正在將(x86)指令發送到記憶體中,使頁面可執行等。有沒有辦法改變非 JIT 方法的方法存根以指向我發出的指令流?
例如:
假設我在記憶體中創建了一個 x86 指令流,它可以做一些任意的事情。現在,進一步假設我有一個方法’int Target()’。我還沒有呼叫它,所以它還沒有編譯。有沒有辦法:
- 獲取指向 Target 存根的指針
- 讓它指向我發出的指令流。
我意識到.NET 的幾乎每一個安全特性都是為了防止這樣的劫持而設計的。但是可以通過託管 API 來實現嗎?
是的,你可以做到!
鉤住 mscorjit 的 getJit 方法。並且每次都會詢問您是否有任何方法需要jitting。你可以通過任何你想要的。
一些 .NET 保護程序就是這樣工作的。
這可以通過 Profiling API 實現。我從未使用過它,但它在 TypeMock 中用於類似目的。
編輯:我認為 MSDN 部落格上有一篇不錯的文章,會去尋找它。
編輯2:Doh,第一擊!