摘要: 說明:本文轉載于 : iceboy @ baidu.hi
很久很久以前, 電腦一般是單核的, 即電腦上一般只有一個處理器. 這樣, 如果我們要修改一段內核代碼, 似乎 IoCreateMdl(), MmBuildMdlForNonPagedPool() / MmLockAndProbePages() 然后 KeRaiseIrqlToDpcLevel() 以后, 就可以很安全地改寫內存的數據. 因為系統只有一個 CPU, 這個 CPU 在 Irql >= DPC_LEVEL 的時候不會被調度, 因此在改寫代碼期間 eip 不可能指向被 hook 的代碼, 但是到了多處理器電腦上這一切都變了.
當一個 cpu 在 DPC_LEVEL 的時候, 它是不會被調度的. 問題是, 系統中有不止一個 cpu, 其它的 cpu 還是想干啥干啥. 如果用上述方法, 其它 cpu 很有可能在你代碼修改到一半的時候去執行, 就會造成系統崩潰, 藍屏重啟.
閱讀全文