摘要: 说明:本文转载于 : iceboy @ baidu.hi
很久很久以前, 电脑一般是单核的, 即电脑上一般只有一个处理器. 这样, 如果我们要修改一段内核代码, 似乎 IoCreateMdl(), MmBuildMdlForNonPagedPool() / MmLockAndProbePages() 然后 KeRaiseIrqlToDpcLevel() 以后, 就可以很安全地改写内存的数据. 因为系统只有一个 CPU, 这个 CPU 在 Irql >= DPC_LEVEL 的时候不会被调度, 因此在改写代码期间 eip 不可能指向被 hook 的代码, 但是到了多处理器电脑上这一切都变了.
当一个 cpu 在 DPC_LEVEL 的时候, 它是不会被调度的. 问题是, 系统中有不止一个 cpu, 其它的 cpu 还是想干啥干啥. 如果用上述方法, 其它 cpu 很有可能在你代码修改到一半的时候去执行, 就会造成系统崩溃, 蓝屏重启.
阅读全文