我想在某个进程内查找内存数组为($c3,$8B,$44,$24,$04,$8b,$40,$04,$85,$c0,$75);
   我的代码是这样写的。 procedure TForm_main.sButton3Click(Sender: TObject);
 var
      test1:array[0..10] of byte;
      i,j:integer;
      ret:cardinal;
      ceshi:string;
    Begin
       ceshi:='';       for i:=$500000 to $5FFFFF   do  //读$500000-600000地址内存
      begin
         ReadProcessMemory(GetCurrentProcess,pointer(i),@test1,10,ret);
        for j:=0 to 10 do
        begin
         ceshi:=ceshi+inttohex((test[j]),2);  //把长度为10的数组赋给ceshi
          end;
                   if ceshi='C38B4424048B400485C075' then begin
         memo_gameinfo.Lines.Add(inttohex(i,4));
      end;
      end;
end;    这样老是不对。而且查询起来非常慢。我想请教下。有没有什么其它方法。还有我的共码哪里有问题。  

解决方案 »

  1.   

    首先说 整数指针为什么不用pinteger;
    ReadProcessMemory(GetCurrentProcess,pointer(i),@test1,10,ret); var
      i:Pinteger;
      i^:=$500000;其次接收buffer 为什么不用PCHAR 直接strpas得到string
      
      

  2.   

       楼上的大哥。其实我已经是用DLL进到这个进程了。我想用指针。但是我只会用指针搜4字节的。   能不能给个示例代码。我 这方面比较菜。只是想学习。  还有。
    test1:array[1..10] of byte;
          i,j:integer;
          ret:cardinal;
          ceshi:string;
        Begin
           ReadProcessMemory(GetCurrentProcess,pointer($58110F),@test1,9,ret);
            for j:=1 to 9 do
            begin
             ceshi:=ceshi+inttohex((test1[j]),2);
              end;
             memo_gameinfo.Lines.Add(ceshi);这个读出来的数据是C38B4424048B400485C075.但是我用上面的代码就不行了。
      

  3.   

    还有其次接收buffer 为什么不用PCHAR 直接strpas得到string 
    这个应该怎么写。array[0..10] of pchar?
      

  4.   

    aaa:array[1..10] of pchar;     
     ceshi:string[10];
        Begin
          ReadProcessMemory(GetCurrentProcess,pointer($58110F),@aaa,10,ret);
                  ceshi:= strpas(@aaa);
                  memo_gameinfo.Lines.Add(ceshi);我这样写得到的是乱码。请指教。
      

  5.   

    var
      aaa:Pchar;  new(aaa)  ReadProcessMemory(GetCurrentProcess,pointer($58110F),aaa,10,ret); 
      

  6.   

       但是这样一写。程序就自动关闭了。请问下是什么原因造成的     aaa:pchar;
          i,j:integer;
          ret:cardinal;
          ceshi:string[10];
        Begin
        new(aaa);
          ReadProcessMemory(GetCurrentProcess,pointer($58110F),aaa,10,ret);
                  //ceshi:= strpas(@aaa);
                 memo_gameinfo.Lines.Add(strpas(aaa));
      

  7.   

    一个一个 IntToHex 还用 + 连接运算,一次挪一个字符用比较,不慢就怪了。而且那些虚拟地址中又不一定是全部都有效,有效的话还有一次多余的 ReadProcessMemory 复制操作。这种代码让我改的话我还真改不了,一句能保留的地方都没有。7楼那样只 New 一个 Char 出来……要说程序直接挂掉倒是概率也不大,毕竟只读10个字节而已,刚好在页面边缘的可能性极小,但是程序能错成这样……只能说无语了
      

  8.   

    var
      P:Pchar;
      s:PInteger;
      RET:Cardinal;
      t:integer;
    begin
      New(P);
      New(S);
      for t:= $500000 to $5FFFFF do//读$500000-600000地址内存
      begin
        s^:=t;
        ReadProcessMemory(GetCurrentProcess,S,P,10,ret);
        ShowMessage(StrPas(p));
      END;我正常着啊