- 注册时间
- 2021-4-16
- 最后登录
- 2024-3-27
- 在线时间
- 3 小时
编程入门
- 龙马币
- 34
|
C++源码 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;
- }
复制代码 |
|