请选择 进入手机版 | 继续访问电脑版
微信扫一扫 分享朋友圈

已有 124 人浏览分享

开启左侧

全系统取模块句柄

[复制链接]
124 0
  1. ULONG64 GetModuleHandle(PCWSTR lpModuleName, CHAR Print)
  2. {
  3.         UNICODE_STRING                                CompName;
  4.         UNICODE_STRING                                ModeName;
  5.         ANSI_STRING                                        AnsiName;
  6.         MEMORY_BASIC_INFORMATION        Meminfo;
  7.         MEMORY_SECTION_NAME                        SecName;
  8.         ULONG64                                                BaseAddress, CurrentBase;

  9.         RtlInitUnicodeString(&CompName, lpModuleName);
  10.         RtlZeroMemory(&Meminfo, sizeof(Meminfo));
  11.         RtlZeroMemory(&SecName, sizeof(SecName));
  12.         for (CurrentBase = 0;
  13.                 NT_SUCCESS(ZwQueryVirtualMemory(NtCurrentProcess(), (PVOID)CurrentBase, 0, &Meminfo, sizeof(Meminfo), NULL));
  14.                 CurrentBase = (ULONG64)Meminfo.BaseAddress + Meminfo.RegionSize)//部分系统通过PEB遍历不到
  15.         {
  16.                 if ((ULONG64)Meminfo.AllocationBase == CurrentBase)
  17.                 {
  18.                         if (Meminfo.Type == 0x1000000 &&
  19.                                 NT_SUCCESS(ZwQueryVirtualMemory(NtCurrentProcess(), (PVOID)CurrentBase, 2, &SecName, sizeof(SecName), NULL)))
  20.                         {
  21.                                 RtlInitUnicodeString(&ModeName, wcsrchr(SecName.Name.Buffer, L'\\') + 1);
  22.                                 if (Print == 1)
  23.                                         DbgPrint("空灵 - BaseAddress:%p ModuleName:%wZ\n", CurrentBase, ModeName);
  24.                                 if (RtlCompareUnicodeString(&ModeName, &CompName, TRUE) == 0)
  25.                                         return CurrentBase;
  26.                         }
  27.                         else//Unmap过的会失败,通过PE头获取
  28.                         {
  29.                                 try//防止访问不可读的内存蓝屏
  30.                                 {
  31.                                         BaseAddress = CurrentBase;
  32.                                         if (*(PUSHORT)BaseAddress != 0x5A4D)
  33.                                                 continue;
  34.                                         else
  35.                                                 BaseAddress = CurrentBase + *(PULONG)(CurrentBase + 0x3C);
  36.                                         if (*(PUSHORT)BaseAddress != 0x4550)
  37.                                                 continue;
  38.                                         if (*(PUSHORT)(BaseAddress + 4) == 332)
  39.                                                 BaseAddress = CurrentBase + *(PULONG)(BaseAddress + 0x78);
  40.                                         else
  41.                                                 BaseAddress = CurrentBase + *(PULONG)(BaseAddress + 0x88);
  42.                                         if (BaseAddress == CurrentBase)
  43.                                                 continue;
  44.                                         else
  45.                                                 BaseAddress = CurrentBase + *(PULONG)(BaseAddress + 0x0C);
  46.                                         RtlInitAnsiString(&AnsiName, (PCSZ)BaseAddress);
  47.                                         if (NT_SUCCESS(RtlAnsiStringToUnicodeString(&ModeName, &AnsiName, TRUE)))
  48.                                         {
  49.                                                 if (Print == 1)
  50.                                                         DbgPrint("空灵 - BaseAddress:%p ModuleName:%wZ\n", CurrentBase, ModeName);
  51.                                                 if (RtlCompareUnicodeString(&ModeName, &CompName, TRUE) == 0)
  52.                                                 {
  53.                                                         RtlFreeUnicodeString(&ModeName);
  54.                                                         return CurrentBase;
  55.                                                 }
  56.                                                 RtlFreeUnicodeString(&ModeName);
  57.                                         }
  58.                                 }
  59.                                 except(EXCEPTION_EXECUTE_HANDLER)
  60.                                 {
  61.                                         KdPrint(("空灵 - %X\n", GetExceptionCode()));
  62.                                 }
  63.                         }
  64.                 }
  65.         }
  66.         return 0ull;
  67. }
复制代码


不积跬步,无以至千里
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

43

粉丝

1152

主题
热门资讯
网友晒图
图文推荐
  • 联系我们
  • 邮箱:admin@c0ks.com(请把#改成@)
  • 电话:18530790808
  • QQ客服 1031180668
  • 工作时间:周一至周五(早上9点至下午5点)
  • 微信二维码

  • 扫描访问手机版

Archiver|手机版|小黑屋|从零开始

GMT+8, 2020-7-8 08:19 , Processed in 0.090798 second(s), 34 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

  • QQ: 1031180668

    客服电话

    18530790808

    电子邮件

    admin@c0ks.com

    在线时间:8:00-16:00