龙马谷

 找回密码
 立即注册

QQ登录

只需一步,快速开始

龙马谷VIP会员办理客服QQ:82926983(如果临时会话没有收到回复,请先加QQ好友再发。)
1 [已完结] GG修改器新手入门与实战教程 31课 2 [已完结] GG修改器美化修改教程 6课 3 [已完结] GG修改器Lua脚本新手入门教程 12课
4 [已完结] 触动精灵脚本新手入门必学教程 22课 5 [已完结] 手游自动化脚本入门实战教程 9课 6 [已完结] C++射击游戏方框骨骼透视与自瞄教程 27课
7 [已完结] C++零基础UE4逆向开发FPS透视自瞄教程 29课 8 [已完结] C++零基础大漠模拟器手游自动化辅助教程 22课 9 [已完结] C++零基础开发DXF内存脚本辅助教程 32课
以下是天马阁VIP教程,本站与天马阁合作,赞助VIP可以获得天马阁对应VIP会员,名额有限! 点击进入天马阁论坛
1 [已完结] x64CE与x64dbg入门基础教程 7课 2 [已完结] x64汇编语言基础教程 16课 3 [已完结] x64辅助入门基础教程 9课
4 [已完结] C++x64内存辅助实战技术教程 149课 5 [已完结] C++x64内存检测与过检测技术教程 10课 6 [已完结] C+x64二叉树分析遍历与LUA自动登陆教程 19课
7 [已完结] C++BT功能原理与x64实战教程 29课 8 [已完结] C+FPS框透视与自瞄x64实现原理及防护思路
查看: 7167|回复: 0

C++源码 NtQueryVirtualMemory枚举进程模块

[复制链接]

12

主题

5

回帖

20

积分

编程入门

Rank: 1

龙马币
34


C++源码 NtQueryVirtualMemory枚举进程模块


  1. typedef enum _MEMORY_INFORMATION_CLASS
  2. {
  3.     MemoryBasicInformation,
  4.     MemoryWorkingSetList,
  5.     MemorySectionName
  6. }MEMORY_INFORMATION_CLASS;

  7. typedef struct
  8. {
  9.     UNICODE_STRING SectionFileName;
  10.     WCHAR       NameBuffer[MAX_PATH * 5];
  11. } MEMORY_SECTION_NAME, *PMEMORY_SECTION_NAME;

  12. typedef struct _MEMORY_BASIC_INFORMATION {
  13.     PVOID BaseAddress;
  14.     PVOID AllocationBase;
  15.     DWORD AllocationProtect;
  16.     SIZE_T RegionSize;
  17.     DWORD State;
  18.     DWORD Protect;
  19.     DWORD Type;
  20. } MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;


  21. typedef
  22. NTSTATUS
  23. (__stdcall * PNtQueryVirtualMemory)(
  24.                                 IN HANDLE ProcessHandle,
  25.                                 IN PVOID BaseAddress,
  26.                                 IN MEMORY_INFORMATION_CLASS MemoryInformationClass,
  27.                                 OUT PVOID MemoryInformation,
  28.                                 IN ULONG MemoryInformationLength,
  29.                                 OUT PULONG ReturnLength OPTIONAL
  30.                                 );

  31. typedef struct  
  32. {
  33.     KEVENT kEvent;
  34.     HANDLE  ProcessId;
  35.     BOOLEAN isFind;
  36. }WORK_DATA, *PWORK_DATA;


  37. #define MEM_IMAGE 0x1000000
  38. NTSTATUS EnumDllByZwQueryVirtualMem(PVOID pData)
  39. {
  40.     PWORK_DATA p = (PWORK_DATA)pData;
  41.     NTSTATUS status=0;
  42.     MEMORY_BASIC_INFORMATION mem_info = {0};
  43.     MEMORY_SECTION_NAME mem_secName = {0};

  44.     HANDLE hProcess = NULL;
  45.     OBJECT_ATTRIBUTES obj;
  46.     CLIENT_ID cid;
  47.     PEPROCESS  pEproc;

  48.     int      retLen;
  49.     ULONG    index=0;
  50.     PRKAPC_STATE pApcStatus;
  51.     UNICODE_STRING ustrNTDLL;

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

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

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

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

  67. //     pApcStatus = (PRKAPC_STATE)ExAllocatePoolWithTag(NonPagedPool, sizeof(KAPC_STATE), 'pApc');
  68. //     if (pApcStatus)
  69. //     {
  70. //         KeStackAttachProcess(pEproc, pApcStatus);
  71. //         KdPrint(("已切换到目标进程上下文\n"));
  72. //     }
  73.     KAPC_STATE k_apc;
  74.     KeStackAttachProcess(pEproc, &k_apc);

  75.     //获取进程句柄
  76.     status = ZwOpenProcess(&hProcess, PAGE_READWRITE, &obj, &cid);
  77.     if ( !NT_SUCCESS(status) )
  78.     {
  79.         KdPrint(("cannot get process handle, ERROR CODE = %08X\n", status));
  80.         status = STATUS_UNSUCCESSFUL;
  81.         return status;
  82.     }
  83.     KdPrint(("hProcess= %X\n", hProcess));

  84.     do
  85.     {
  86.         //查询内存 ;这里为何返回状态为访问违法呢???
  87.         status=NtQueryVirtualMemory( hProcess,
  88.             (PULONG)index,
  89.             MemoryBasicInformation,
  90.             &mem_info,
  91.             sizeof(mem_info),
  92.             NULL );
  93.         if ( !NT_SUCCESS(status) )
  94.         {
  95.             DbgPrint("cannot query memory, ERROR CODE = %08X\n", status);
  96.             status = STATUS_SUCCESS;
  97.             p->isFind = FALSE;
  98.             break;
  99.         }

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

  103.             //判断"内存节.类型"是否是 "映像/模块"类型
  104.             if (mem_info.Type == MEM_IMAGE)
  105.             {
  106.                 //判断模块所占内存范围
  107.                 if ( (DWORD)mem_info.AllocationBase == index )
  108.                 {
  109.                     //查询内存节名
  110.                     status=NtQueryVirtualMemory( hProcess,
  111.                         (PULONG)index,
  112.                         MemorySectionName,
  113.                         &mem_secName,
  114.                         sizeof(mem_secName),
  115.                         NULL );
  116.                     if ( status >= 0 )
  117.                     {
  118.                         UNICODE_STRING ustrMyDll;
  119.                         RtlInitUnicodeString(&ustrMyDll, L"Locker.dll");
  120.                         KdPrint(("Address:%08X \t ModuleName:%ws\n", index, mem_secName.SectionFileName.Buffer));
  121.                         if ( TRUE == SpyFindSubString(&mem_secName.SectionFileName, &ustrMyDll) )
  122.                         {
  123.                             p->isFind = TRUE;
  124.                             break;
  125.                         }
  126.                     }
  127.                 }
  128.             }
  129.         }

  130.         index += 0x10000;
  131.     } while (index < 0x80000000);
  132. _done:
  133.     KeUnstackDetachProcess(&k_apc);
  134.     if (hProcess)
  135.         ZwClose(hProcess);
  136.     status = STATUS_SUCCESS;
  137.     return status;
  138. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

龙马谷| C/C++辅助教程| 安卓逆向安全| 论坛导航| 免责申明|Archiver|
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表龙马谷立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2018-2021 All Right Reserved.
在线客服
快速回复 返回顶部 返回列表