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_SECTION_NAME;

typedef struct _MEMORY_BASIC_INFORMATION {
PVOID BaseAddress;
PVOID AllocationBase;
DWORD AllocationProtect;
SIZE_T RegionSize;
DWORD State;
DWORD Protect;
DWORD Type;
} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;

typedef
NTSTATUS
(__stdcall * PNtQueryVirtualMemory)(
IN HANDLE ProcessHandle,
IN PVOID BaseAddress,
IN MEMORY_INFORMATION_CLASS MemoryInformationClass,
OUT PVOID MemoryInformation,
IN ULONG MemoryInformationLength,
OUT PULONG ReturnLength OPTIONAL
);


typedef struct
{
KEVENT kEvent;
HANDLE ProcessId;
BOOLEAN isFind;
}WORK_DATA, *PWORK_DATA;

#define MEM_IMAGE 0x1000000
NTSTATUS EnumDllByZwQueryVirtualMem(PVOID pData)
{
PWORK_DATA p = (PWORK_DATA)pData;
NTSTATUS status=0;
MEMORY_BASIC_INFORMATION mem_info = {0};
MEMORY_SECTION_NAME mem_secName = {0};

HANDLE hProcess = NULL;
OBJECT_ATTRIBUTES obj;
CLIENT_ID cid;
PEPROCESS pEproc;

int retLen;
ULONG index=0;
PRKAPC_STATE pApcStatus;
UNICODE_STRING ustrNTDLL;

RtlInitUnicodeString(&ustrNTDLL, L"\\??\\C:\\WINDOWS\\system32\\ntdll.dll");

PNtQueryVirtualMemory NtQueryVirtualMemory = NULL;
PSYSTEM_DESCRIPTOR_TABLE KeServiceDescriptorTable = (PSYSTEM_DESCRIPTOR_TABLE)dns_get_systemrountine_address(L"KeServiceDescriptorTable");
ULONG uIndex = SYSCALL_INDEX(dns_get_dllfunction_address("NtQueryVirtualMemory", &ustrNTDLL));

NtQueryVirtualMemory = (PNtQueryVirtualMemory)KeServiceDescriptorTable->ntoskrnl.ServiceTableBase[uIndex];
cid.UniqueProcess = (HANDLE)p->ProcessId;
cid.UniqueThread = NULL;
InitializeObjectAttributes(&obj, NULL, 0, NULL, NULL);

status = PsLookupProcessByProcessId( (HANDLE)p->ProcessId, &pEproc);
if ( !NT_SUCCESS(status) )
{
KdPrint(("cannot get process eprocess, ERROR CODE = %08X\n", status));
status = STATUS_UNSUCCESSFUL;
return status;
}

// pApcStatus = (PRKAPC_STATE)ExAllocatePoolWithTag(NonPagedPool, sizeof(KAPC_STATE), ‘pApc‘);
// if (pApcStatus)
// {
// KeStackAttachProcess(pEproc, pApcStatus);
// KdPrint(("已切换到目标进程上下文\n"));
// }
KAPC_STATE k_apc;
KeStackAttachProcess(pEproc, &k_apc);

//获取进程句柄
status = ZwOpenProcess(&hProcess, PAGE_READWRITE, &obj, &cid);
if ( !NT_SUCCESS(status) )
{
KdPrint(("cannot get process handle, ERROR CODE = %08X\n", status));
status = STATUS_UNSUCCESSFUL;
return status;
}
KdPrint(("hProcess= %X\n", hProcess));

do
{
//查询内存 ;这里为何返回状态为访问违法呢???
status=NtQueryVirtualMemory( hProcess,
(PULONG)index,
MemoryBasicInformation,
&mem_info,
sizeof(mem_info),
NULL );
if ( !NT_SUCCESS(status) )
{
DbgPrint("cannot query memory, ERROR CODE = %08X\n", status);
status = STATUS_SUCCESS;
p->isFind = FALSE;
break;
}

if ( status >= 0 )
{
//KdPrint(("ZwQueryVirtualMemory 成功!\n"));

//判断"内存节.类型"是否是 "映像/模块"类型
if (mem_info.Type == MEM_IMAGE)
{
//判断模块所占内存范围
if ( (DWORD)mem_info.AllocationBase == index )
{
//查询内存节名
status=NtQueryVirtualMemory( hProcess,
(PULONG)index,
MemorySectionName,
&mem_secName,
sizeof(mem_secName),
NULL );
if ( status >= 0 )
{
UNICODE_STRING ustrMyDll;
RtlInitUnicodeString(&ustrMyDll, L"Locker.dll");
KdPrint(("Address:%08X \t ModuleName:%ws\n", index, mem_secName.SectionFileName.Buffer));
if ( TRUE == SpyFindSubString(&mem_secName.SectionFileName, &ustrMyDll) )
{
p->isFind = TRUE;
break;
}
}
}
}
}

index += 0x10000;
} while (index < 0x80000000);
_done:
KeUnstackDetachProcess(&k_apc);
if (hProcess)
ZwClose(hProcess);
status = STATUS_SUCCESS;
return status;
}

NtQueryVirtualMemory 枚举进程模块,布布扣,bubuko.com

时间: 2024-10-23 23:20:29

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

暴力枚举进程模块

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

ZwQueryVirtualMemory枚举进程模块

ZwQueryVirtualMemory算是枚举进程方法中的黑科技吧,主要是该方法可以检测出隐藏的模块(类似IceSword). 代码VS2015测试通过 再次奉上源码链接:https://github.com/Arsense/WindowsCode/tree/master/ZwQueryVirtualMemory 好的下面我们进入正题 这个没有深入研究 就是简单测试读了下代码 很久了 忘记差不多了 所以只是整理献上一个比较好的其他博友的 1常见的枚举进程模块的方法有 CreateToolhel

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号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取 当前进程快照时