| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 554 人关注过本帖
标题:内存页搜索方式要怎么做
取消只看楼主 加入收藏
天使梦魔
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:37
帖 子:564
专家分:2754
注 册:2007-8-29
结帖率:83.33%
收藏
 问题点数:0 回复次数:1 
内存页搜索方式要怎么做
详情如下:
用winhex打开内存方式打开A进程,看到0x10000的位置上是数据3D也就是十进制的61.
接着我用我设计的软件搜索A进程的61值,找到很多,也找到0x10000,然后在我程序上通过修改成功,winhex再次打开A进程时那个地址变成我修改后的值了,说明我的程序没问题.

但在寻找某些值的时候,总是不能够显示正确的值,比如我查找某个值,但是修改后没有效果,用金山游侠却找到另外一个地址,有效果.我怀疑我的内存页设置搜索有点问题

伪代码如下:
MEMORY_BASIC_INFORMATION mypidshow;//进程信息结构
SYSTEM_INFO siSysInfo;//系统信息
char *sip=(char*)0;//指向内存地址,它表示要搜索哪里

GetSystemInfo(&siSysInfo);//获得一次系统信息
sip=(char*)siSysInfo.lpMinimumApplicationAddress;//最初的时候我把地址设定为用户地址开始的方位

while(sip<siSysInfo.lpMaximumApplicationAddress)//搜寻退出条件,当遇到用户地址结束的时候
{
  VirtualQueryEx(hProcess,sip,&mypidshow,sizeof(mypidshow));//先看下页情况
  if((mypidshow.State==MEM_COMMIT)&&(mypidshow.AllocationProtect==PAGE_READWRITE))//真正的条件是否这样?
  {
    ReadProcessMemory(hProcess,(LPVOID)sip,&addr,sizeof(addr),0);//读取字节到变量addr
    if(addr==m_find)
    {
      //.....把找到的保存起来,等待下一次搜索
    }
    sip++;//搜索的地址值自己往上加
  }
  else
  {
    sip=sip+mypidshow.RegionSize;//如果页面信息不是我上面的条件,那就直接跳过.RegionSize是当前整个页的大小
  }
}

问题:
仔细看我定义的条件,MEMORY_BASIC_INFORMATION的State成员是MEM_COMMIT的时候和AllocationProtect成员是PAGE_READWRITE的时候.才发生搜索.页文件有些问题,有些值找不到.
另外我搜索的结果要比金山游侠的多,但速度却很慢,几乎慢上10倍.哪里有问题?
搜索更多相关主题的帖子: 搜索 内存 
2010-03-16 21:59
天使梦魔
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:37
帖 子:564
专家分:2754
注 册:2007-8-29
收藏
得分:0 
对不住大家了,该思想结构是正确的,我后面的重复结构有点错误,所以导致出现问题.
已经可以像金山游侠一样的效果了.

但现在的问题是,速度太慢了,有人有内存快照的方法么?我的是即时读取按地址.
如果有内存快照快速取某一个段的话那速度快很多.
2010-03-18 10:09
快速回复:内存页搜索方式要怎么做
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020458 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved