原创:简单例程枚举系统驱动模块 By 旖旎(于2009-2-1发表)

下载代码...

代码一点修补
修补重新枚举前没有清除列表框的问题
下载补充代码...

;--------------------------------------------------------------------------------
EnumKernelModule proc @hListBox:DWORD,@dwReserved1:DWORD,@dwReserved2:DWORD
    ;两个参数保留以便提供将来使用
    ;在这里用到的参数 @hListBox的值是列表框的句柄
    LOCAL @dwKernelModuleSize    :DWORD
    LOCAL @lpKernelModuleMemory    :DWORD
    LOCAL @dwNumModules:DWORD
    LOCAL @lpKernelModuleOutBuff[MAX_PATH]:BYTE
    
    invoke NtQuerySystemInformation,SystemModuleInformation,NULL,0,addr @dwKernelModuleSize
    invoke  GlobalAlloc,GMEM_FIXED or GMEM_ZEROINIT,@dwKernelModuleSize
    .if     eax
        mov @lpKernelModuleMemory,eax
        invoke NtQuerySystemInformation,SystemModuleInformation,@lpKernelModuleMemory,@dwKernelModuleSize,NULL
        mov ebx,@lpKernelModuleMemory
        push dword ptr [ebx]
        pop @dwNumModules
        add ebx,4
        mov    edx,@dwNumModules
        assume     ebx:ptr SYSTEM_MODULE_INFORMATION
            
        .while    @dwNumModules
            lea    edi,[ebx].ImageName
            movzx     ecx,[ebx].ModuleNameOffset
            add     edi,ecx
            pushad
            
            invoke    wsprintf,addr @lpKernelModuleOutBuff,\
            CTXT("内核模块基地址:%08X --- 模块大小:%08X --- 模块标志:%08X --- 模块索引:%08X --- 模块名称:%s --- 模块路径:%s"),\
            [ebx].Base,[ebx].dwSize,[ebx].Flags,[ebx].Index,edi,addr [ebx].ImageName
            invoke    SendMessage,@hListBox,LB_ADDSTRING,0,addr @lpKernelModuleOutBuff
            ;invoke OutputDebugString,addr @lpKernelModuleOutBuff
            
            popad
            add    ebx,sizeof SYSTEM_MODULE_INFORMATION
            dec    @dwNumModules
            
        .endw
        
        assume ebx:nothing
        
        
        invoke GlobalFree,@lpKernelModuleMemory
    .endif
    ret

EnumKernelModule endp
;--------------------------------------------------------------------------------

并不是所有的贴子都是原创,此时作者均指发表的人而不是文章的作者,作者会说明是否是转贴