使用ZwQueryVirtualMemory枚举进程模块支持x64

本文介绍了如何在x64架构下利用ZwQueryVirtualMemory函数来枚举进程的模块信息,包括在内核层和应用层的实现细节。
摘要由CSDN通过智能技术生成

最新代码(内核) 应用层简单改下即可

typedef struct _MEMORY_SECTION_NAME {
        UNICODE_STRING Name;
        WCHAR     Buffer[260];
    }MEMORY_SECTION_NAME, *PMEMORY_SECTION_NAME;
    
		ULONG_PTR dqCurrentBase = 0;
        PEPROCESS Process = nullptr;

        MEMORY_BASIC_INFORMATION baseinfo;
        MEMORY_SECTION_NAME sec;

        do
        {
            auto status = PsLookupProcessByProcessId(pid, &Process);

            if (!NT_SUCCESS(status))
                break;

            RtlZeroMemory(&baseinfo, sizeof(baseinfo));

            SIZE_T ret = 0;

            KeAttachProcess(Process);

            for (dqCurrentBase = 0; 
                NT_SUCCESS(ZwQueryVirtualMemory(NtCurrentProcess(), (PVOID)dqCurrentBase, MemoryBasicInformation, &baseinfo, sizeof(MEMORY_BASIC_INFORMATION), &ret));
                dqCurrentBase = (ULONG_PTR)baseinfo.BaseAddress + baseinfo.RegionSize)
            {
                if (baseinfo.Type == MEM_IMAGE && (ULONG_PTR)baseinfo.AllocationBase == dqCurrentBase)
                {
                    // MemorySectionName
                    if (NT_SUCCESS(ZwQueryVirtualMemory(NtCurrentProcess(), (PVOID)dqCurrentBase, (MEMORY_INFORMATION_CLASS)2, &sec, sizeof(MEMORY_SECTION_NAME), &ret)))
                    {
                        base = (PVOID)dqCurrentBase;

                        DPRINT("0x%llx, %wZ
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值