ZwQueryVirtualMemory枚举进程模块

  ZwQueryVirtualMemory算是枚举进程方法中的黑科技吧,主要是该方法可以检测出隐藏的模块(类似IceSword)。

  代码VS2015测试通过

  再次奉上源码链接:https://github.com/Arsense/WindowsCode/tree/master/ZwQueryVirtualMemory

好的下面我们进入正题 这个没有深入研究 就是简单测试读了下代码 很久了 忘记差不多了 所以只是整理献上一个比较好的其他博友的

1常见的枚举进程模块的方法有

CreateToolhelp32Snaphot,Module32First,Module32Next.这几种 也是最通用的方法

但ntdll.dll导出的未文档化接口ZwQueryVirtualMemory,。相比前面所介绍的方法,该方法可以检测出隐藏的模块(类似IceSword)。

函数的原型:

     NTSTATUS
NTAPI
ZwQueryVirtualMemory(
            IN HANDLE ProcessHandle,
            IN PVOID BaseAddress,
            IN MEMORY_INFORMATION_CLASS MemoryInformationClass,
            OUT PVOID MemoryInformation,
            IN ULONG MemoryInformationLength,
            OUT PULONG ReturnLength OPTIONAL );

typedef enum _MEMORY_INFORMATION_CLASS {
            MemoryBasicInformation,
            MemoryWorkingSetList,
            MemorySectionName,
            MemoryBasicVlmInformation
} MEMORY_INFORMATION_CLASS;

参数说明:

ProcessHandle - 目标进程句柄

BaseAddress   
- 要查询的虚拟内存基址

MemoryInformationClass - 要查询的内存信息类

MemoryInformation
- 用户提供的缓冲区,返回内存相关信息

MemoryInformationLength - 缓冲区长度(字节为单位)

ReturnLength - 实际返回的内存信息长度(字节为单位)

返回值:

NTSTATUS - 返回STATUS_SUCCESS或一个错误状态码

我们要枚举进程模块信息, 需要用到两类内存信息MemoryBasicInformation和MemorySectionName,

前者返回内存的基本信息, 比如: 内存区的基址,大小以及页面的各种属性等等, 而后者则返回内存段的名字,

也就是我们所要找的模块名. 利用前者我们可以过滤出类型为MEM_IMAGE的内存段并得到内存段的基址和属性, 利用后者我们可以得到模块名.

另外,需要注意的是该方法找出来的设备名是诸如\Device\HarddiskVolume1之类的名称,所以我们需要把它转换为我们习惯的DOS设备名,如C:\,D:\等。不能自以为是的认为\Device\HarddiskVolume1对应C盘\Device\HarddiskVolume2对应D盘。该转换是通过调用QueryDosDevice来实现的。

大致就这么一些 感兴趣的朋友可以去我的github上下载自己运行调试就懂了

时间: 2024-12-17 03:22:05

ZwQueryVirtualMemory枚举进程模块的相关文章

NtQueryVirtualMemory 枚举进程模块

typedef enum _MEMORY_INFORMATION_CLASS { MemoryBasicInformation, MemoryWorkingSetList, MemorySectionName }MEMORY_INFORMATION_CLASS; typedef struct { UNICODE_STRING SectionFileName; WCHAR NameBuffer[MAX_PATH * 5]; } MEMORY_SECTION_NAME, *PMEMORY_SECTI

暴力枚举进程模块

同学问过我进程体中EPROCESS的三条链断了怎么枚举模块,这也是也腾讯面试题.我当时听到也是懵逼的. 后来在网上看到了一些内存暴力枚举的方法ZwQueryVirtualMemory. 函数原型是 NTSTATUS NtQueryVirtualMemory(HANDLE ProcessHandle, //目标进程句柄 PVOID BaseAddress, //查询的基址 MEMORY_INFORMATION_CLASS MemoryInformationClass, //枚举宏 PVOID Me

VadRoot枚举进程模块在Windows7下的完整实现

原理小伟的小伟在http://bbs.pediy.com/showthread.php?t=66886说的挺清楚了,Windows7下有一些变化,使用NtQueryVirtualMemory来枚举模块是一个效率很低的事情,自己枚举VadRoot速度是很快的,有N个子节点时,为log(N),还有我在这里补上的基地址获取和镜像大小获取,废话不多说,完整代码如下,仅给有需要的人参考,大侠飘过-- 代码: typedef struct _MMADDRESS_NODE // 0x14 {     unio

由枚举模块到ring0内存结构的初步探索

是由获得进程模块而引发的一系列的问题,首先,在ring3层下枚举进程模块有ToolHelp,Psapi,还可以通过在ntdll中获得ZwQuerySystemInformation的函数地址来枚举,其中ZwQueryInformationProcess相当于是调用系统服务函数,其内部实现就是遍历PEB中的Moudle链表, kd> dt _PEB +0x00c Ldr              : Ptr32 _PEB_LDR_DATA kd> dt _PEB_LDR_DATA nt!_PEB

枚举PEB获取进程模块列表

枚举进程模块的方法有很多种,常见的有枚举PEB和内存搜索法,今天,先来看看实现起来最简单的枚举PEB实现获取进程模块列表. 首先,惯例是各种繁琐的结构体定义.需要包含 ntifs.h 和 WinDef.h, 此处不再列出,各位看官根据情况自行添加. [cpp] view plain copy print? typedef PPEB (__stdcall *PFNPsGetProcessPeb)(PEPROCESS pEProcess); typedef ULONG   PPS_POST_PROC

X64驱动:内核里操作进程

注意:下面的所有案例必须使用.C结尾的文件,且必须在链接选项中加入 /INTEGRITYCHECK 选项,否则编译根本无法通过(整理修正,整合,Win10可编译并运行),内核代码相对固定,如果对内核编程不太熟的话,请不要随意修改代码,否则很容易蓝屏,大佬绕过 内核枚举进线程/模块 内核枚举进程: 进程就是活动起来的程序,每一个进程在内核里,都有一个名为 EPROCESS 的结构记录它的详细信息,其中就包括进程名,PID,PPID,进程路径等,通常在应用层枚举进程只列出所有进程的编号即可,不过在内

TlHelp32枚举进程、线程、模块信息

通过tlhelp32提供的api,可以很容易的获取进程.模块.线程的快照信息. 所涉及头文件: tlhelp32.h 枚举进程Process信息: HANDLE hSnapshot; PROCESSENTRY32 pe32 = { sizeof(PROCESSENTRY32) }; HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, dwPid); if(hProcessSnap == INVALID_HANDLE

枚举进程再来两弹

看了刚出几个博友的博客,感觉人家的量大,详细,干货量实足啊, 所以我就把另外两种常见的枚举进程的方法简单说下心得, 一个是EnumProcesses和CreateToolhelp32Snapshot系列的Tool help API的 Process32First和Process32Next函数完成列举进程. 这两种都是比较简单实用的 https://github.com/Arsense/WindowsCode 蛮简单的  需要编译好的源码的 支持vs2015,低版本的VS想编译 简单右键工程 属

c语言枚举进程以及遇到的编码问题

首先了解枚举进程需要用到的相关的api:CreateToolhelp32Snapshot 获取进程快照 [C] 纯文本查看 复制代码 ? 1 2 3 4 5 6 函数原型: HANDLE WINAPI CreateToolhelp32Snapshot( DWORD dwFlags, //用来指定“快照”中需要返回的对象,可以是TH32CS_SNAPPROCESS等 DWORD th32ProcessID //一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取 当前进程快照时