使用ZwQueryVirtualMemory枚举进程模块

该博客介绍了如何使用ZwQueryVirtualMemory函数枚举指定进程的模块信息,包括模块名称、基地址和大小等。通过读取内存、检查DOS和NT头以及解析UNICODE_STRING来获取详细信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 Public Sub PrintProcessModules(ByVal dwProcessId As Long)
    Dim ntStatus As Long
    Dim objCid As CLIENT_ID
    Dim objOa As OBJECT_ATTRIBUTES
    Dim hProcess As Long
    Dim dwVirtualAddr As Long
    Dim pName As UNICODE_STRING1
    Dim dwRet As Long
    Dim intRet As Integer
    Dim strModuleName As String
    Dim pDosHeader As IMAGE_DOS_HEADER
    Dim pNtHeaders As IMAGE_NT_HEADERS
    Dim dwImageSize As Long
    Dim MemoryBase As MEMORY_BASIC_INFORMATION
    objOa.Length = Len(objOa)
    objCid.UniqueProcess = dwProcessId
    ntStatus = NtOpenProcess(hProcess, PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, objOa, objCid)
    If hProcess = 0 Then
        hProcess = GetHandleByProcessId(dwProcessId)
        If hProcess = 0 Then
            Exit Sub
        End If
    End If
    dwVirtualAddr = &H1000
    Do While dwVirtualAddr <> &H7FFF0000
        ntStatus = ZwQueryVirtualMemory(hProcess, dwVirtualAddr, 0, VarPtr(MemoryBase), LenB(MemoryBase), dwRet)
        If NT_SUCCESS(ntStatus) Then
            If MemoryBase.AllocationBase = 0 Then
                dwVirtualAddr = dwVirtualAddr + MemoryBase.RegionSize
                dwVirtualAddr = dwVirtualAddr + MemoryBase.RegionSize Mod &H1000
                GoTo NextLoop
            Else
                ntStatus = ZwQueryVirtualMemory(hProcess, dwVirtualAddr, 2, VarPtr(pName), LenB(pName), dwRet)
                If NT_SUCCESS(ntStatus) Then
                    ReadProcessMemory hProcess, ByVal MemoryBase.AllocationBase, pDosHeader, LenB(pDosHeader), ByVal 0&
                    If pDosHeader.Magic <> &H5A4D Then
                        dwVirtualAddr = dwVirtualAddr + MemoryBase.RegionSize
                        dwVirtualAddr = dwVirtualAddr + MemoryBase.RegionSize Mod &H1000
                        GoTo NextLoop
                    End If
                    ReadProcessMemory hProcess, ByVal MemoryBase.AllocationBase + pDosHeader.lfanew, pNtHeaders, LenB(pNtHeaders), ByVal 0&
                    If pNtHeaders.Signature <> IMAGE_NT_SIGNATURE Then
                        dwVirtualAddr = dwVirtualAddr + MemoryBase.RegionSize
                        dwVirtualAddr = dwVirtualAddr + MemoryBase.RegionSize Mod &H1000
                        GoTo NextLoop
                    End If
                    strModuleName = Left(pName.pBuffer, InStr(pName.pBuffer, vbNullChar) - 1)
                    'Debug.Print strModuleName; MemoryBase.AllocationBase; pNtHeaders.OptionalHeader.ImageSize
                    If MemoryBase.Type = &H1000000 Then
                        Form1.List1.AddItem strModuleName & ";" & Hex(MemoryBase.AllocationBase) & ";" & Hex(pNtHeaders.OptionalHeader.ImageSize) & ";State:" & Hex(MemoryBase.State) & ";Type:" & Hex(MemoryBase.Type) & ";AllocationProtect:" & Hex(MemoryBase.AllocationProtect) & ";Protect:" & Hex(MemoryBase.Protect)
                    End If
                    'dwVirtualAddr = dwVirtualAddr + pNtHeaders.OptionalHeader.ImageSize
                    dwVirtualAddr = MemoryBase.AllocationBase + pNtHeaders.OptionalHeader.ImageSize
                    dwVirtualAddr = dwVirtualAddr + pNtHeaders.OptionalHeader.ImageSize Mod &H1000
                Else
                    dwVirtualAddr = dwVirtualAddr + MemoryBase.RegionSize
                    dwVirtualAddr = dwVirtualAddr + MemoryBase.RegionSize Mod &H1000
                End If
            End If
        Else
            dwVirtualAddr = dwVirtualAddr + &H1000
        End If
NextLoop:
    Loop
    NtClose hProcess
End Sub
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值