这2天学习查内存地址,搞的头昏脑涨。
所用工具:
    金山游侠,GM,江湖行
   
   我只是想用它们简单的查一下游戏的HP,MP,坐标XY的内存地址,可是每个工具查出来的地址都有N个,我都晕。面对查出来的上百个地址,哪个才是我需要的?  还有,查出来的结果还分什么单字节,双字节,四字节,文本等,搞得我更是一头露水。  一个内存地址不就对应的存一个数据吗?搞那么罗嗦的?  好不容易用金山游侠找到一个只有一个地址的(找:13106),读出来的值是双字节的位置。
 地址            单字节      双字节           四字节           浮点数         字符串
$0045E260    [50]       [13106]    [0892313426]   [0.000001]    2345111 我写了一段代码去读这个地址://从内存中读取数据
function Get_Data:integer;
var
  pid: dword;
  h: THandle;
  tt: Cardinal;
  lpBuffer:pByte;
  nSize: DWORD;
  lpNumberOfBytesRead: DWORD;
  addr:dword;
begin
  nSize:=4;
  lpBuffer:=AllocMem(nSize);
  addr:= $0045E260;
  GetWindowThreadProcessId(GameHandle, @pid);//GameHandle是个全局变量,前面的程序已经得到游戏的Handle。
  h := OpenProcess(PROCESS_ALL_ACCESS, false, pid);
  if h <> 0 then
  begin
    ReadProcessMemory(h,Pointer(addr),lpBuffer,nSize,lpNumberOfBytesRead);
    result:= lpBuffer^;
  end;
  MessageBeep(0);
  CloseHandle(h);
end;但是只能读到单字节的数据(50),晕了。
怎么才能读出13106?

解决方案 »

  1.   

    //try
    function Get_Data:integer;
    var
      pid: dword;
      h: THandle;
      tt: Cardinal;
      nSize: DWORD;
      lpNumberOfBytesRead: DWORD;
      addr:dword;
    begin
      nSize:=4;
      addr:= $0045E260;
      GetWindowThreadProcessId(GameHandle, @pid);//GameHandle是个全局变量,前面的程序已经得到游戏的Handle。
      h := OpenProcess(PROCESS_ALL_ACCESS, false, pid);
      if h <> 0 then
        ReadProcessMemory(h,Pointer(addr),@Result,nSize,lpNumberOfBytesRead);
      MessageBeep(0);
      CloseHandle(h);
    end;