天马阁

 找回密码
 立即注册
                                        →→→→→→→→→→→→ 1点击查看所有VIP教程目录长列表(总教程数269个) 2办理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实现原理及防护思路 30课完结
64驱?封? 9 64反驱? 10 64位V? 11 绝? 12 ???课?
13 64透 ? 14 64U ? 15 64Q ? 16 64功 ?
17 64U ? 18 64模 ? 19 64多 ? 20 64网 ?
21 64注 ? 22 64火 ? 23 64棋 ? 24 64自二链L?
25 64破 ? VIP会员办理QQ: 89986068   
【请先加好友,然后到好友列表双击联系客服办理,不然可能无法接受到信息。】
27 加入2000人交流群637034024 3 28 免责声明?
查看: 1120|回复: 0

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

[复制链接]

12

主题

0

回帖

14

积分

编程入门

Rank: 1

天马币
24
发表于 2024-3-4 09:21:46 | 显示全部楼层 |阅读模式
使用ZwQueryVirtualMemory枚举进程模块支持x64
  1. #include "stdio.h"
  2. #include "windows.h"

  3. typedef struct _LSA_UNICODE_STRING {
  4.   USHORT Length;
  5.   USHORT MaximumLength;
  6.   PWSTR  Buffer;
  7. } LSA_UNICODE_STRING, *PLSA_UNICODE_STRING, UNICODE_STRING, *PUNICODE_STRING;

  8. //typedef struct _MEMORY_BASIC_INFORMATION {
  9. //  PVOID  BaseAddress;
  10. //  PVOID  AllocationBase;
  11. //  DWORD  AllocationProtect;
  12. //  SIZE_T RegionSize;
  13. //  DWORD  State;
  14. //  DWORD  Protect;
  15. //  DWORD  Type;
  16. //} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;

  17. typedef long (*RTLADJUSTPRIVILEGE)(ULONG,ULONG,ULONG,PVOID);
  18. RTLADJUSTPRIVILEGE RtlAdjustPrivilege;

  19. typedef enum _MEMORY_INFORMATION_CLASS
  20. {
  21.    MemoryBasicInformation,
  22.    MemoryWorkingSetList,
  23.    MemorySectionName
  24. }MEMORY_INFORMATION_CLASS;


  25. NTSTATUS ZwQueryVirtualMemory(
  26.   _In_      HANDLE                   ProcessHandle,
  27.   _In_opt_  PVOID                    BaseAddress,
  28.   _In_      MEMORY_INFORMATION_CLASS MemoryInformationClass,
  29.   _Out_     PVOID                    MemoryInformation,
  30.   _In_      SIZE_T                   MemoryInformationLength,
  31.   _Out_opt_ PSIZE_T                  ReturnLength
  32. );


  33. typedef
  34. NTSTATUS
  35. (WINAPI *ZWQUERYVIRTUALMEMORY) (
  36.                          IN HANDLE ProcessHandle,
  37.                          IN PVOID BaseAddress,
  38.                          IN MEMORY_INFORMATION_CLASS MemoryInformationClass,
  39.                          OUT PVOID MemoryInformation,
  40.                          IN SIZE_T MemoryInformationLength,
  41.                          OUT PSIZE_T ReturnLength OPTIONAL
  42.                          );


  43. BOOLEAN NtPathToDosPathW(WCHAR *FullNtPath, WCHAR *FullDosPath)
  44. {
  45.         WCHAR DosDevice[4]= {0};       //dos设备名最大长度为4
  46.         WCHAR NtPath[64]= {0};       //nt设备名最大长度为64
  47.         WCHAR *RetStr=NULL;
  48.         size_t NtPathLen=0;
  49.         short i = 0;
  50.         if (!FullNtPath || !FullDosPath)
  51.         {
  52.                 return FALSE;
  53.         }
  54.         for(i=65; i<26+65; i++)
  55.         {
  56.                 DosDevice[0]=i;
  57.                 DosDevice[1]=L':';
  58.                 if(QueryDosDeviceW(DosDevice,NtPath,64))
  59.                 {
  60.                         if (NtPath)
  61.                         {
  62.                                 NtPathLen=wcslen(NtPath);
  63.                                 if (!wcsnicmp(NtPath,FullNtPath,NtPathLen))
  64.                                 {
  65.                                         wcscpy(FullDosPath,DosDevice);
  66.                                         wcscat(FullDosPath,FullNtPath+NtPathLen);
  67.                                         return TRUE;
  68.                                 }
  69.                         }
  70.                 }
  71.         }
  72.         return FALSE;
  73. }

  74. void EnumProcessModules(IN DWORD dwProcessId)
  75. {
  76.    DWORD64 dwStartAddr = 0x00000000;
  77.    ULONG    num = 0;
  78.    BYTE szBuffer[MAX_PATH * 2 + 4] = {0};
  79.    WCHAR szModuleName[MAX_PATH] = {0};
  80.    WCHAR szPathName[MAX_PATH] = {0};
  81.    MEMORY_BASIC_INFORMATION mbi;
  82.    PUNICODE_STRING usSectionName;   
  83.    ZWQUERYVIRTUALMEMORY fnZwQueryVirtualMemory;
  84.    BOOL modulex64 = FALSE;
  85.    HANDLE hProcess =NULL;
  86.    ULONG    dwRetVal=0;


  87.    RtlAdjustPrivilege=(RTLADJUSTPRIVILEGE)GetProcAddress(LoadLibraryW(L"ntdll.dll"),"RtlAdjustPrivilege");
  88.    RtlAdjustPrivilege(20,1,0,&dwRetVal);//debug
  89.    RtlAdjustPrivilege(19,1,0,&dwRetVal);
  90.    hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, dwProcessId);

  91.    if (hProcess == NULL)
  92.    {
  93.       wprintf(L"Open Process %d Error\n", dwProcessId);
  94.       return;
  95.    }

  96.    //dwStartAddr = 0x000007fef4530000;
  97.    dwStartAddr = 0x0000000000000000;

  98.    fnZwQueryVirtualMemory = (ZWQUERYVIRTUALMEMORY)GetProcAddress(GetModuleHandleA("ntdll.dll"),"ZwQueryVirtualMemory" );

  99.    if(fnZwQueryVirtualMemory)
  100.    {
  101.       do
  102.       {
  103.          if (fnZwQueryVirtualMemory(
  104.             hProcess,
  105.             (PVOID64)dwStartAddr,
  106.             MemoryBasicInformation,
  107.             &mbi,
  108.             sizeof(mbi),
  109.             0) >= 0 )
  110.          {
  111.             if(mbi.Type == MEM_IMAGE)
  112.             {
  113.                 if (fnZwQueryVirtualMemory(
  114.                    hProcess,
  115.                    (PVOID64)dwStartAddr,
  116.                    MemorySectionName,
  117.                    szBuffer,
  118.                    sizeof(szBuffer),
  119.                    0) >= 0 )
  120.                 {
  121.                    usSectionName = (PUNICODE_STRING)szBuffer;
  122.                    if( _wcsnicmp(szModuleName, usSectionName->Buffer, usSectionName->Length / sizeof(WCHAR)) )
  123.                    {
  124.                       wcsncpy(szModuleName,usSectionName->Buffer,usSectionName->Length/sizeof(WCHAR));
  125.                       szModuleName[usSectionName->Length / sizeof(WCHAR)] = UNICODE_NULL;
  126.                      // DeviceName2PathName(szPathName, szModuleName);
  127.                       NtPathToDosPathW(szModuleName,szPathName);
  128.                       wprintf(L"[0x%.8llx]\t%s\n", dwStartAddr, szPathName);
  129.                       num++;
  130.                   }
  131.                 }
  132.             }

  133.          }
  134.          // 递增基址,开始下一轮查询!
  135.          dwStartAddr += (ULONGLONG)0x1000;
  136.          if(!modulex64){
  137.              if(dwStartAddr>0x0000000200000000)
  138.              {
  139.                  modulex64 = TRUE;
  140.                  dwStartAddr = 0x000007fe00000000;
  141.              }
  142.          }
  143.       }while( dwStartAddr < 0x000007ff00000000 );
  144.    }

  145.    CloseHandle(hProcess);
  146.    printf("module num :%d\n",num);
  147. }

  148. void  main()
  149. {
  150.     int pid = 0;
  151.     printf("Input Pid:");
  152.     scanf("%d",&pid);
  153.     EnumProcessModules(pid);
  154.     printf("ok!");
  155.     getchar();
  156.     getchar();
  157.     getchar();
  158.     return;
  159. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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