前阵子发了一篇名为“浅谈在驱动程序中结束进程的三种方法”。近日重读代码,发现有一处问题,特来修改
问题出现在内存清零中的这两行代码
[C++] 纯文本查看 复制代码 PKAPC_STATE pKs = (PKAPC_STATE)ExAllocatePool(NonPagedPool, sizeof(PKAPC_STATE));
KeStackAttachProcess(Eprocess, pKs);//Attach进程虚拟空间
可以看到,这段代码申请了一个非分页的内存空间,然后使用KeStackAttachProcess挂靠到指定进程
非分页内存本身就十分珍贵,而且在计算机内存紧缺时,申请内存可能会不成功。但本段代码没有对内存的申请成功与否做出判断,而是直接使用了这块内存,这就导致KeStackAttachProcess使用了一个非法的内存地址,在一些条件下可能会导致蓝屏。
所以,我们需要加入一个对申请的内存区域null与否的判断,修改后的代码如下
[C++] 纯文本查看 复制代码 PKAPC_STATE pKs = (PKAPC_STATE)ExAllocatePool(NonPagedPool, sizeof(PKAPC_STATE));
if(pKs == nullptr) return FALSE;
KeStackAttachProcess(Eprocess, pKs);//Attach进程虚拟空间
在内核编程中,需要对所有的内核资源都抱怀疑心态。意思就是:需要在使用一切资源前都判断资源是否真正可用,这也是笔者在日常的开发中践行的准则。
|