请问如何做出象FPE那样可以改内存里的数值
具体要用到什么函数?

解决方案 »

  1.   

    肯定用到API函数,具体你找本书看看
    有问题请发信息到我的E-mail:[email protected]
      

  2.   

    读另一个程序内存的一个例子:
    procedure TForm1.Button1Click(Sender: TObject);
    var 
       FSnapshotHandle:THandle;
       FProcessEntry32:TProcessEntry32;
       Ret : BOOL;
       ProcessID : integer;
       ProcessHndle : THandle;
       lpBuffer:pByte;
       nSize: DWORD;
       lpNumberOfBytesRead: DWORD;
       i:integer;
       s:string;
    begin
       FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //创建系统快照
       FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);  //先初始化 FProcessEntry32 的大小
       Ret:=Process32First(FSnapshotHandle,FProcessEntry32);
       ProcessID := 0;
       while Ret do begin  //循环枚举出系统开启的所有进程,找出"Kernel32.dll"
          s:=ExtractFileName(FProcessEntry32.szExeFile);
          if ansiuppercase(s)='TESTP.EXE' then begin
             ProcessID:=FProcessEntry32.th32ProcessID;
             s:='';
             break;
          end;
          Ret:=Process32Next(FSnapshotHandle,FProcessEntry32);
       end;
       CloseHandle(FSnapshotHandle);
       Memo1.Lines.Clear ;
       memo1.lines.add('Process ID '+IntToHex(FProcessEntry32.th32ProcessID,8));
       memo1.lines.Add('File name '+FProcessEntry32.szExeFile); ////输出进程的一些信息   nSize:=4;
       lpBuffer:=AllocMem(nSize);
       ProcessHndle:=OpenProcess(PROCESS_VM_READ,false,ProcessID);
       memo1.Lines.Add ('Process Handle '+intTohex(ProcessHndle,8));
    //   for i:=$00400000 to $00401000 do begin
         for i:=$004419C0 to $00441A00 do begin
            //   348A1C  $0044D000
         ReadProcessMemory(
           ProcessHndle,
           Pointer(i),
           lpBuffer,
           nSize,
           lpNumberOfBytesRead
          );
         //读取内容
    //    filewrite(i,lpBuffer,1);//     canvas.TextOut(10,10,inttostr(i));
         if intTohex(lpBuffer^,2)<>'00' then
    //        s := s + chr(lpBuffer^);
            s:=s+intTohex(lpBuffer^,2)+' ';
    //     if ((i mod 16) =0) and (s<>'') then begin
    //        Memo1.Lines.Add(s);
    //        s:='';
    //     end;
         //格式化输出
       end;
       FreeMem(lpBuffer,nSize);
       CloseHandle(ProcessHndle);
       memo1.Text := s;
       //关闭句柄,释放内存
    end;
      

  3.   

    需要加上
    uses 
      tlhelp32;