打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
转发屠夫大牛使用未公开API ZwQueryVirtualMemory 枚举进程模块的函数例子
分类: C++新手自学成长 2010-12-15 23:59 881人阅读 评论(0) 收藏 举报
  1. #include <windows.h>  
  2. #include <cstdio>  
  3. #include <winternl.h>  
  4. #include <atlstr.h>  
  5.   
  6. typedef enum _MEMORY_INFORMATION_CLASS   
  7. {  
  8.     MemoryBasicInformation,  
  9.     MemoryWorkingSetList,  
  10.     MemorySectionName  
  11. }MEMORY_INFORMATION_CLASS;  
  12.   
  13. typedef  
  14.     NTSTATUS  
  15.     (WINAPI *ZWQUERYVIRTUALMEMORY)  
  16.     (  
  17.     IN HANDLE ProcessHandle,   
  18.     IN PVOID BaseAddress,   
  19.     IN MEMORY_INFORMATION_CLASS MemoryInformationClass,   
  20.     OUT PVOID MemoryInformation,   
  21.     IN ULONG MemoryInformationLength,   
  22.     OUT PULONG ReturnLength OPTIONAL   
  23.     );   
  24.   
  25.   
  26. VOID EnumProcessForModule ()                                 
  27. {  
  28.     ZWQUERYVIRTUALMEMORY QueryVirtualMemoryFunction=NULL;  
  29.     DWORD Index=0;  
  30.     NTSTATUS NtStatus=0;  
  31.     MEMORY_BASIC_INFORMATION InfoMation;  
  32.     BYTE Buffer[MAX_PATH*2+4]={0};  
  33.     PUNICODE_STRING SectionName=NULL;  
  34.     DWORD Counter;  
  35.     CString ModuleAddress;  
  36.     CString ModuleName;  
  37.   
  38.     QueryVirtualMemoryFunction=(ZWQUERYVIRTUALMEMORY)  
  39.     ::GetProcAddress  
  40.         (  
  41.         GetModuleHandle("ntdll.dll"), //ntdll.dll=地府  
  42.         _T("ZwQueryVirtualMemory"//ZwQueryVirtualMemory=鬼魂名  
  43.         );  
  44.   
  45.         if (QueryVirtualMemoryFunction==NULL)  
  46.         {  
  47.             printf("别瞎TM扯淡啦!");              
  48.         }   
  49.         else   
  50.         {  
  51.                 for(Index;Index<0x80000000;Index+=0x1000)  
  52.                 {  
  53.                         NtStatus=QueryVirtualMemoryFunction  
  54.                         (  
  55.                         (HANDLE)-1,  
  56.                         (PULONG)Index,  
  57.                         MemoryBasicInformation,  
  58.                         &InfoMation,  
  59.                         sizeof(InfoMation),   
  60.                         NULL  
  61.                         );  
  62.   
  63.                     if (NtStatus>=0)  
  64.                     {  
  65.                         if (InfoMation.Type==MEM_IMAGE)   
  66.                             {  
  67.                                     if ((DWORD)InfoMation.AllocationBase==Index)  
  68.                                     {  
  69.                                 //        这么做是为什么,因为你不这样过滤,你会得到几千个模块,为什么呢?因为模块之间互相映射,唉,挺乱的,实话说我解释的不太清楚,如果你真的想知道你要花几个星期的时间去深入学习下PE啦,如果你不在意你就按照我的方法做就行啦,他其实就是过滤掉同名的模块。  
  70.                                         NtStatus=QueryVirtualMemoryFunction  
  71.                                             (  
  72.                                             (HANDLE)-1,   
  73.                                             (PULONG)Index,  
  74.                                             MemorySectionName,   
  75.                                             Buffer,  
  76. //                                             typedef struct MEMORY_SECTION_NAME  
  77. //                                         {  
  78. //                                             UNICODE_STRING SectionFileName;  
  79. //                                             WCHAR       NameBuffer[ANYSIZE_ARRAY];  
  80. //                                         } *PMEMORY_SECTION_NAME;  
  81. //   
  82. // 但是为什么不用它呢?因为它更底层一些在R3层用它很麻烦,所以放弃它,定义一个和他同样大小的数组,一样可以接收数据,关键在于这个尺寸问题,因为这个结构是在宽字节环境所以我们来计算一下这个结构到底有多大。首先来看第一个成员UNICODE_STRING他的最大值就是MAX_PATH这  
  83. // 个宏表示260个字节,又因为它是宽字符环境所以就要*2啦,再来看第二个成员WCHAR大家知道这个宏[ANYSIZE_ARRAY]表示2,同样因为UNICODE的关系要*2也就是4,所以这个结构最大不会超过[MAX_PATH*2+4],那么定义这个尺寸的一个数组接收数据就绰绰有余啦,大家知道数组作为参数的时候会自动降级为指针, 怎么样?还好理解吧?继续......  
  84.                                             sizeof(Buffer),  
  85.                                             NULL  
  86.                                             );  
  87.   
  88.                                         if (NtStatus>=0)  
  89.                                         {  
  90.                                                 SectionName=(PUNICODE_STRING)Buffer;  
  91.                                                 ModuleName=SectionName->Buffer;  
  92.                                                 printf("Address:%08X ModuleName/r/n%s/r/n",  
  93.                                                         Index,ModuleName);  
  94.                                                   
  95.                                     //        ModuleAddress.Format(_T("%x"),Index);  
  96. //                                             Counter=ListGoodsFilter.InsertItem(Counter,ModuleAddress);  
  97. //                                             ListGoodsFilter.SetItemText(Counter,1,ModuleName);  
  98. //                                             这些都是界面编程和字符串的事,我就不解释啦,  
  99.                                         }  
  100.                                     }  
  101.                             }  
  102.                     }  
  103.                 }  
  104.         }  
  105. }  
  106.   
  107.   
  108. int  main()  
  109. {  
  110.     EnumProcessForModule();  
  111.     system("pause");  
  112.     return 0;  
  113. }  

 

屠夫大牛的帖子在这里

 

http://bbs.pediy.com/showthread.php?t=125080

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Hook SSDT NtOpenProcess的完整代码
隐藏进程的代码
驱动中操作注册表
工具类生成mybatis的Mapper类和xml文件以及实体
mybatis resultMap collection column 子查询用到父查询中的不存在的条件的传递参数问题
“机器狗”病毒驱动部分逆向分析注释(C代码)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服