Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1267291
  • 博文数量: 788
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 7005
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-19 15:52
文章存档

2017年(81)

2011年(1)

2009年(369)

2008年(337)

分类:

2009-02-11 16:54:28



已知一基地址$010EA0CC,偏移量为$2A4,先在用ReadProcessMemory函数连读取内存数据,为什么我用其他工具(例如:CE)可以读取到正常的数据,但  
  ReadProcessMemory(h,Pointer(addr+$2A4),@buf,nSize,lpNumberOfBytes);  
  却为0?是不是$010EA0CC是一个指针地址.请大家赐教  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var   gameHwnd:Hwnd;  
          pid:   dword;  
          h:   THandle;  
          lpNumberOfBytes:   DWord;  
          buf:DWord;  
          buf2:Pointer;  
          Buffer   :   Array[0..3]   Of   DWord;  
          addr:DWORD;  
          nSize:   DWORD;  
          s:WideString;  
          i:Integer;  
  begin  
      gameHwnd:=FindWindow(nil,'Element   Client');  
      if   gameHwnd<>0   then  
          begin  
              GetWindowThreadProcessId(gameHwnd,   @pid);  
              h:=OpenProcess(PROCESS_ALL_ACCESS,   false,   pid);  
              if   h<>0   then  
                  begin  
                      addr:=$010EA0CC;  
                      edit2.Text:=Inttostr(gameHwnd);  
                      edit3.Text:=Inttostr(h);  
                      nSize:=4;  
                      ReadProcessMemory(h,Pointer(addr+$2A4),@buf,nSize,lpNumberOfBytes);  
                      s:=inttoStr(buf);  
                      edit1.Text:=s;  
                      showmessage(s);  
                  end;  
              closeHandle(h);  
          end   else   begin  
              showmessage('游戏未运行!');  
          end;  
  end;  
 

Return   Values  
   
  If   the   function   succeeds,   the   return   value   is   nonzero.  
  If   the   function   fails,   the   return   value   is   zero.   To   get   extended   error   information,   call   GetLastError.  
  The   function   fails   if   the   requested   read   operation   crosses   into   an   area   of   the   process   that   is   inaccessible.    
   
  看帮助   第一句话   函数成功的时候   这个值是非0    
   
   
   
 

楼上的。不是这个意思.或许是我描述能力太差了。  
   
  不过已经解决了。多谢啊.  
   
  放分。

噢   呵呵   是参数的问题还是?

不是。具体我也不太懂.我是在网上找到的一个函数搞定的,你看看能看懂不?讲一讲.我对内存这些东西是刚接触.很菜.  
  ===========================================  
  addr:=GetAddyfrmpointer($010EA0CC,$2A4,h);  
  ===========================================  
   
  function   GetAddyfrmpointer(baseaddress,   offset:   dword;  
      hID:   THandle):   Dword;  
  var   a:   dword;  
          x:   dword;  
          i:   integer;  
          offsetcount:   integer;  
          offsets:array   of   dword;  
          b:integer;  
          maxid:integer;  
  begin  
      offsetcount:=1;  
      b:=0;  
      setlength(offsets,1);  
      offsets[b]:=offset;  
      a:=baseaddress;  
      i:=0;  
      while   (i       begin  
          if   not   readprocessmemory(hID,pointer(a),@a,4,x)   then   exit;  
          inc(a,offsets[i]);  
          inc(i);  
          result:=a  
      end;  
  end;  
 

看来基地址+偏移量直接取的办法是不对.

阅读(784) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~