首页
社区
课程
招聘
[求助]关于VirtualQueryEx枚举地址信息不准确
发表于: 2011-5-8 20:58 7965

[求助]关于VirtualQueryEx枚举地址信息不准确

2011-5-8 20:58
7965
这几天在做一个内存扫描器,用VC做个复杂的扫描器真不容易呀碰到了很多问题大家帮帮忙
现在主要的问题是 利用 MEMORY_BASIC_INFORMATION 输出的信息判断的问题

MEMORY_BASIC_INFORMATION mbInfo;

                if (ReadMemType == 6)//基地址
                {
                        SegLen=VirtualQueryEx(pHandle,MemBaseStart,&mbInfo,BaseInfoLen);

                        if ((mbInfo.RegionSize>4096
                                &&mbInfo.State==MEM_COMMIT
                                &&mbInfo.Type==MEM_IMAGE
                                &&mbInfo.Protect==PAGE_READWRITE //4
                                &&mbInfo.AllocationProtect==PAGE_EXECUTE_WRITECOPY
                                )
                                ||
                                (mbInfo.RegionSize>4096
                                &&mbInfo.State==MEM_COMMIT
                                &&mbInfo.Type==MEM_IMAGE
                                &&mbInfo.Protect==PAGE_WRITECOPY //8
                                &&mbInfo.AllocationProtect==PAGE_EXECUTE_WRITECOPY
                                )
                                ||
                                (mbInfo.RegionSize>4096
                                &&mbInfo.State==MEM_COMMIT
                                &&mbInfo.Type==MEM_IMAGE
                                &&mbInfo.Protect==PAGE_EXECUTE_READ //32
                                &&mbInfo.AllocationProtect==PAGE_EXECUTE_WRITECOPY
                                )
                                ||
                                (mbInfo.RegionSize>4096
                                &&mbInfo.State==MEM_COMMIT
                                &&mbInfo.Type==MEM_IMAGE
                                &&mbInfo.Protect==PAGE_EXECUTE_READWRITE //64
                                &&mbInfo.AllocationProtect==PAGE_EXECUTE_WRITECOPY
                                ))
                        {
                                PUCHAR Seg = (PUCHAR)malloc(mbInfo.RegionSize);
                                SIZE_T ReadLen;
                                ReadProcessMemory(pHandle,mbInfo.BaseAddress,Seg,mbInfo.RegionSize,&ReadLen);
                                if (PValue == NULL && fValue != NULL)
                                {
                                        SearchValue(SearchType,true,false,Seg,NULL,fValue,NULL,mbInfo,ReadLen);
                                }
                                else if (PValue == NULL && fValue == NULL && dValue != NULL)
                                {
                                        SearchValue(SearchType,true,false,Seg,NULL,NULL,dValue,mbInfo,ReadLen);
                                }
                                else
                                {
                                        SearchValue(SearchType,true,false,Seg,PValue,NULL,NULL,mbInfo,ReadLen);     
                                }
                                free(Seg);
                                MemBaseStart=(LPVOID)((char*)MemBaseStart+mbInfo.RegionSize);
                        }
                        else
                        {
                                MemBaseStart=(LPVOID)((char*)MemBaseStart+mbInfo.RegionSize);
                        }
                        double iPos = (double)(DWORD)MemBaseStart * 100 / (double)(DWORD)MemBaseEnd;
                        m_Progress1.SetPos((int)iPos);
                }
这是我其中一段程序的代码片段 ,太长了没法贴全部
现在主要的问题是 判断 mbInfo.RegionSize>4096 或 != 但是枚举出来的地址 还是有 区域大小为4096的地址,而且不少,反复看了下代码好像没问题,把每个判断分段来还是跟上述问题一样,
是我的判断有问题还是别的地方有毛病,希望大家帮帮忙...

[课程]Linux pwn 探索篇!

上传的附件:
  • 1.JPG (62.37kb,69次下载)
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
楼主NB,自己写CE玩啊。。。
2011-5-9 06:47
0
雪    币: 773
活跃值: (442)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
3
解决了,在输出的地址完成后重新用VirtualQueryEx遍历一遍,即可 真是头痛,NB啥呀 好多现成的代码,出点苦力就能搞定....
2011-5-9 07:51
0
游客
登录 | 注册 方可回帖
返回
//