CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  Windows SDK/API

有人可以帮我解释下这段代码吗!??

楼主jyassassin(蓝血人)2004-12-01 08:38:59 在 Delphi / Windows SDK/API 提问

var  
      p   :   Pointer;  
      mi   :     MEMORY_BASIC_INFORMATION;  
      x,GG   :   longword;  
      lPbaseAddr   :   Pointer;  
      lPBuffer   :   array[0..3]   of   BYTE;  
   
  while   longword(p)<$80000000do    
  begin  
          if   (x<>VirtualQueryEx(Handle_Share,p,mi,x))   then   break;  
          if   (mi.State   =   MEM_COMMIT)   and   (mi.Protect   =   PAGE_READWRITE)   then   begin  
              GG   :=   mi.RegionSize;  
              lPbaseAddr   :=   p;  
              while   GG   >   0   do   begin  
                  if   ReadProcessMemory(Handle_Share,lPbaseAddr,@lpBuffer,4,j)   then    
                    begin  
                      agm   :=   @lpBuffer;  
                      if   agm^   =   ShareData   then   begin    
                          New(op);  
                          op^.Data   :=   LongWord(agm^);  
                          op^.Address   :=   Longword(lpBaseAddr);  
                          LT.Add(op);  
                      end;  
                  end;  
                  inc(longword(lpbaseaddr),4);  
                  Dec(GG,4);  
              end;   end;            
  inc(longword(p),mi.RegionSize);  
            end; 问题点数:100、回复次数:9Top

1 楼bee2518(迷茫ing)回复于 2004-12-01 08:47:43 得分 0

ReadProcessMemory该函数允许你去读指定的进程的内存的数据  
  把读到的数据存在LT中,这个LT没看到声明,应该是TList类型的Top

2 楼surpassable()回复于 2004-12-01 09:08:49 得分 0

mark~~~~~~~  
  Top

3 楼beyondtkl(大龙驹<*好久没来了,兄弟们好吧。*>)回复于 2004-12-01 10:11:30 得分 100

var  
      p   :   Pointer;  
      mi   :     MEMORY_BASIC_INFORMATION;  
      x,GG   :   longword;  
      lPbaseAddr   :   Pointer;  
      lPBuffer   :   array[0..3]   of   BYTE;  
   
  while   longword(p)<$80000000do   //   $80000000的值不允许存取  
  begin //   估计   Handle_Share是某一个FileMapping或者为一个EXE之类的句柄  
          if   (x<>VirtualQueryEx(Handle_Share,p,mi,x))   then   break;//   x没有初始化..   获得相应进程虚拟地址空间,返回为空间的BYTE数  
          if   (mi.State   =   MEM_COMMIT)   and   (mi.Protect   =   PAGE_READWRITE)   then   begin   //   1表示已经被分配物理内存   2.表示可以页面写  
              GG   :=   mi.RegionSize;   //   获得所有相同属性<上述属性>的空间大小  
              lPbaseAddr   :=   p; //   保存本段区域的首地址  
              while   GG   >   0   do   begin //   大小>0  
                  if   ReadProcessMemory(Handle_Share,lPbaseAddr,@lpBuffer,4,j)   then   //   从首地址读取4byte的数据到lpBuffer  
                    begin //   下面就是你自己的操作了  
                      agm   :=   @lpBuffer;  
                      if   agm^   =   ShareData   then   begin    
                          New(op);  
                          op^.Data   :=   LongWord(agm^);  
                          op^.Address   :=   Longword(lpBaseAddr);  
                          LT.Add(op);  
                      end;  
                  end;  
                  inc(longword(lpbaseaddr),4); //   继续读取  
                  Dec(GG,4); //   继续读取  
              end;   end;            
  inc(longword(p),mi.RegionSize); //   继续循环  
            end;  
  Top

4 楼jyassassin(蓝血人)回复于 2004-12-01 11:11:10 得分 0

谢谢大龙驹的精彩解译!!按您这样解,这段代码就是残缺不全的代码了,还以为解开这段中的意思就可以找到基本的内存中查找数据的实现方法呢!  
   
  不知哪位大侠有相关的代码可以提供!?     静待一下午,晚上结贴前希望有朋友可以拉我一把!Top

5 楼beyondtkl(大龙驹<*好久没来了,兄弟们好吧。*>)回复于 2004-12-01 11:17:21 得分 0

还以为解开这段中的意思就可以找到基本的内存中查找数据的实现方法呢!  
   
  //   其实内存中的数据   你再不知道其类型   格式的情况下   就算是取得了   也没有意义的。。  
  //   你这个代码已经实现了从内存中读取信息压。。只不过信息的处理方式可能不一样了  
  比如   里面一个   1111   可能是一个字符串   也可能是一个整数   之类的。。  
   
  重要的是你   对里面数据格式的了解   只有全面了解   你才能知道其意义  
  比如说   某个游戏中   某个地址偏移量<比如说86的地方>存放着金钱数,那么   你就可以读取出来<以金钱的意义去读取>   然后去修改,因为你明确的知道它是金钱,所以修改可能没有问题,否则   如果修改了某些不能修改的东西   会出问题的。。Top

6 楼jyassassin(蓝血人)回复于 2004-12-01 15:07:30 得分 0

我知道了内存中某个地方的所存的是什么数据...但我想修改的游戏每次启动那地方所分配到这数据的地址都不一样...我不知道应该怎么办!!只有做个查找的工具来查了~头大中....Top

7 楼jyassassin(蓝血人)回复于 2004-12-01 15:09:52 得分 0

我现在的主要问题是  
   
  知道地址后我会写内存也会读内存....但是知道数据类型同值但不会从内存中查它的地址!!Top

8 楼beyondtkl(大龙驹<*好久没来了,兄弟们好吧。*>)回复于 2004-12-01 17:27:28 得分 0

当然了   每次加载的虚拟空间地址是不一样的   可是某个代码   某个值的偏移量应该是不变的。。  
   
  但你还是要每次都需要找到首地址Top

9 楼jiangmenghen(江梦痕)回复于 2004-12-01 20:44:24 得分 0

首地址???  
   
  就是加载这个要修改的程序时,系统动态分配给它的首地址吗??   我不找   可以指教下吗!?  
   
   
  每次加载的虚拟空间地址是不一样的   可是某个代码   某个值的偏移量应该是不变的。。  
   
  也就是说,找到首地址,把首地址+上偏移量就=想要的地址了对吧!?  
  Top

相关问题

  • 帮忙解释段代码
  • 帮我解释一下这段代码
  • 帮忙解释下段代码!
  • 请高帮我解释一段代码
  • 帮忙解释下这个代码段
  • 帮忙解释下代码?
  • 高人 帮忙解释一下这段代码(读取文件代码)
  • 帮帮忙,分析这段代码!解释一下!
  • 请问谁能帮我解释一下这段代码,谢谢
  • 下面有一段代码,大家帮忙解释一下?

关键词

  • 代码
  • 内存
  • 数据
  • 修改
  • lpbaseaddr
  • longword
  • agm
  • 地址
  • 偏移量
  • lpbuffer

得分解答快速导航

  • 帖主:jyassassin
  • beyondtkl

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo