读写另一EXE的内存

procedure TfrmMain.tmrChangeServerNameTimer(Sender: TObject);
function GetProcessID(FileName: string = ''): TProcessEntry32;
var
  Ret: BOOL;
  s: 
string;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  FSnapshotHandle :
= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize :
= Sizeof(FProcessEntry32);
  Ret :
= Process32First(FSnapshotHandle, FProcessEntry32);
  
while Ret do
  
begin
    s :
= ExtractFileName(FProcessEntry32.szExeFile);
    
if (AnsiCompareText(Trim(s),Trim(FileName))=0and (FileName <> ''then begin
      result :
= FProcessEntry32;
      
break;
    
end;
    Ret :
= Process32Next(FSnapshotHandle, FProcessEntry32);
  
end;
  CloseHandle(FSnapshotHandle);
end;
var
  FProcessEntry32: TProcessEntry32;
  ProcessID: integer;
  ProcessHandle: THandle;
  lpBuffer: PChar;
  nSize: DWORD;
  lpNumberOfBytes: DWORD;
  mbi_thunk:TMemoryBasicInformation;
  dwOldProtect:dword;
const
  LeftAddress 
= $02370C68;
  RightAddress1 
= $02370C74;
  RightAddress2 
= $02370C84;
//  ServerName = '京信三国';
begin
  FProcessEntry32 :
= GetProcessID('aLogin.exe');
  
if FProcessEntry32.th32ProcessID =0 then exit;
  ProcessID :
= FProcessEntry32.th32ProcessID;
  ProcessHandle :
= OpenProcess(PROCESS_ALL_ACCESS, false, ProcessID);
  
//---------------写left
  lpBuffer :
= PChar(GB2Big5('01.' + ServerName));
  nSize:
= 12;                               //N是数据长度
  
//写LeftAddress数据
  VirtualQueryEx(ProcessHandle,Pointer(LeftAddress),mbi_thunk, sizeof(TMemoryBasicInformation));
  VirtualProtectEx(ProcessHandle,Pointer(LeftAddress),nSize,PAGE_EXECUTE_READWRITE,mbi_thunk.Protect);
  WriteProcessMemory(ProcessHandle, Pointer(LeftAddress), lpBuffer, nSize, lpNumberOfBytes);
  VirtualProtectEx(ProcessHandle,Pointer(LeftAddress), nSize, mbi_thunk.Protect,dwOldProtect);
  
//---------------写right
  lpBuffer :
= PChar(GB2Big5(ServerName));   //要写的内容
  nSize:
= 8;                                //数据长度
  
//写RightAddress1数据
  VirtualQueryEx(ProcessHandle,Pointer(RightAddress1),mbi_thunk, sizeof(TMemoryBasicInformation));
  VirtualProtectEx(ProcessHandle,Pointer(RightAddress1),nSize,PAGE_EXECUTE_READWRITE,mbi_thunk.Protect);
  WriteProcessMemory(ProcessHandle, Pointer(RightAddress1), lpBuffer, nSize, lpNumberOfBytes);
  VirtualProtectEx(ProcessHandle,Pointer(RightAddress1), nSize, mbi_thunk.Protect,dwOldProtect);
  
//写RightAddress2数据
  VirtualQueryEx(ProcessHandle,Pointer(RightAddress2),mbi_thunk, sizeof(TMemoryBasicInformation));
  VirtualProtectEx(ProcessHandle,Pointer(RightAddress2),nSize,PAGE_EXECUTE_READWRITE,mbi_thunk.Protect);
  WriteProcessMemory(ProcessHandle, Pointer(RightAddress2), lpBuffer, nSize, lpNumberOfBytes);
  VirtualProtectEx(ProcessHandle,Pointer(RightAddress2), nSize, mbi_thunk.Protect,dwOldProtect);
  
//读内容,确定是否修改成功
  lpBuffer :
= AllocMem(nSize);
  ReadProcessMemory(ProcessHandle, Pointer(RightAddress2), lpBuffer, nSize, lpNumberOfBytes);
  
if ServerName = Big52GB(lpBuffer) then begin
    Caption :
= '内存内容为:' + Big52GB(lpBuffer);
    tmrChangeServerName.Enabled :
= False;
  
end;
  CloseHandle(ProcessHandle);  
//   Memo1.Lines.Add(Big52GB(lpBuffer));
  
//MEMO显示信息  
//  Memo1.Lines.Clear;
//  memo1.lines.add('Process ID ' + IntToHex(FProcessEntry32.th32ProcessID, 8));
//  memo1.lines.Add('File name ' + FProcessEntry32.szExeFile);
//  memo1.Lines.Add('Process Handle ' + intTohex(ProcessHandle, 8));
//  Memo1.Lines.Add('虚拟内存中的数据:');
end;

posted on 2009-07-10 12:16  jxgxy  阅读(804)  评论(0编辑  收藏  举报

导航