DragonQuestHero / Medusa

Radical Windows ARK
201 stars 62 forks source link

遍历驱动模块的疑惑 #2

Closed WINGS2709 closed 3 weeks ago

WINGS2709 commented 4 months 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;

DragonQuestHero commented 3 weeks ago

多谢 确实是个多余的设计 并且也不安全 我把该函数注释掉了