Closed WINGS2709 closed 3 weeks ago
阅读代码GetKernelModuleListALL的代码发现,GetKernelModuleList2 等价于低配版 GetKernelModuleList1,感觉GetKernelModuleList2代码有点多余,是否可以删除?
GetKernelModuleList1通过ZwQuerySystemInformation SystemModuleInformation0x11,代码底层通过遍历PsLoadedModuleList链表,获取驱动内核模块
GetKernelModuleList2通过_Driver_Object->DriverSection获取LDR链遍历,等价于遍历PsLoadedModuleList链表,但是微软标准代码遍历PsLoadedModuleList需要加锁PsLoadedModuleResource,所以GetKernelModuleList2的操作方法并不安全。
case SystemModuleInformation: KeEnterCriticalRegion(); ExAcquireResourceExclusive( &PsLoadedModuleResource, TRUE ); 《========微软代码会加锁 ReleaseModuleResoure = TRUE; Status = ExpQueryModuleInformation( &PsLoadedModuleList, &MmLoadedUserImageList, (PRTL_PROCESS_MODULES)SystemInformation, SystemInformationLength, ReturnLength ); ExReleaseResource (&PsLoadedModuleResource); ReleaseModuleResoure = FALSE; KeLeaveCriticalRegion(); break;
多谢 确实是个多余的设计 并且也不安全 我把该函数注释掉了
阅读代码GetKernelModuleListALL的代码发现,GetKernelModuleList2 等价于低配版 GetKernelModuleList1,感觉GetKernelModuleList2代码有点多余,是否可以删除?
GetKernelModuleList1通过ZwQuerySystemInformation SystemModuleInformation0x11,代码底层通过遍历PsLoadedModuleList链表,获取驱动内核模块
GetKernelModuleList2通过_Driver_Object->DriverSection获取LDR链遍历,等价于遍历PsLoadedModuleList链表,但是微软标准代码遍历PsLoadedModuleList需要加锁PsLoadedModuleResource,所以GetKernelModuleList2的操作方法并不安全。
case SystemModuleInformation: KeEnterCriticalRegion(); ExAcquireResourceExclusive( &PsLoadedModuleResource, TRUE ); 《========微软代码会加锁 ReleaseModuleResoure = TRUE; Status = ExpQueryModuleInformation( &PsLoadedModuleList, &MmLoadedUserImageList, (PRTL_PROCESS_MODULES)SystemInformation, SystemInformationLength, ReturnLength ); ExReleaseResource (&PsLoadedModuleResource); ReleaseModuleResoure = FALSE; KeLeaveCriticalRegion(); break;