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